/ Hex Artifact Content
Login

Artifact aae06c143e7c70cfe616a96af8b5656f3891916beee172c7a40b084dab221b79:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
08b0: 47 57 33 32 5f 5f 29 0a 23 20 20 64 65 66 69 6e  GW32__).#  defin
08c0: 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e 74 0a  e DIRENT dirent.
08d0: 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53 4c 4e  #  ifndef S_ISLN
08e0: 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53 5f 49  K.#   define S_I
08f0: 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29 0a 23  SLNK(mode) (0).#
0900: 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69 66 0a    endif.# endif.
0910: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0920: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0930: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0940: 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  .h>..#if HAVE_RE
0950: 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65  ADLINE.# include
0960: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0970: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0980: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0990: 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ry.h>.#endif..#i
09a0: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  f HAVE_EDITLINE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c  # include <editl
09c0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
09d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
09e0: 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56  _EDITLINE || HAV
09f0: 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65  E_READLINE..# de
0a00: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0a10: 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69  istory(X) add_hi
0a20: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0a40: 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73  tory(X) read_his
0a50: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0a60: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a70: 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69  tory(X) write_hi
0a80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a90: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0aa0: 69 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65  istory(X) stifle
0ab0: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0ac0: 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c  fine shell_readl
0ad0: 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28  ine(X) readline(
0ae0: 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  X)..#elif HAVE_L
0af0: 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c  INENOISE..# incl
0b00: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
0b10: 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ".# define shell
0b20: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0b30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b40: 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20  Add(X).# define 
0b50: 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f  shell_read_histo
0b60: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b70: 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20  istoryLoad(X).# 
0b80: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0b90: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69  te_history(X) li
0ba0: 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61  nenoiseHistorySa
0bb0: 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ve(X).# define s
0bc0: 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74  hell_stifle_hist
0bd0: 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65  ory(X) linenoise
0be0: 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e  HistorySetMaxLen
0bf0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0c00: 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c  ll_readline(X) l
0c10: 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c  inenoise(X)..#el
0c20: 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65  se..# define she
0c30: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0c40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c50: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0c60: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c70: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0c80: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48  (X)..# define SH
0c90: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
0ca0: 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a  TLINE 1.#endif..
0cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0cc0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0cd0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0ce0: 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64   <io.h>.# includ
0cf0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65  e <fcntl.h>.# de
0d00: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
0d10: 69 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64  isatty(h).# ifnd
0d20: 65 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66  ef access.#  def
0d30: 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20  ine access(f,m) 
0d40: 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29  _access((f),(m))
0d50: 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66  .# endif.# undef
0d60: 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20   popen.# define 
0d70: 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75  popen _popen.# u
0d80: 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65  ndef pclose.# de
0d90: 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c  fine pclose _pcl
0da0: 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61  ose.#else. /* Ma
0db0: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
0dc0: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
0dd0: 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74  . */. extern int
0de0: 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23   isatty(int);..#
0df0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
0e00: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
0e10: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
0e20: 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63   /* popen and pc
0e30: 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39  lose are not C89
0e40: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73   functions and s
0e50: 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74  o are.  ** somet
0e60: 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  imes omitted fro
0e70: 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20  m the <stdio.h> 
0e80: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74  header */.   ext
0e90: 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28  ern FILE *popen(
0ea0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
0eb0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74  t char*);.   ext
0ec0: 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46  ern int pclose(F
0ed0: 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20  ILE*);.# else.# 
0ee0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f   define SQLITE_O
0ef0: 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e  MIT_POPEN 1.# en
0f00: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  dif.#endif..#if 
0f10: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0f20: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0f30: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0f40: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
0f50: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
0f60: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
0f70: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
0f80: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
0f90: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
0fa0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0fb0: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0fc0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0fd0: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0fe0: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0ff0: 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d  ndif../* ctype m
1000: 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20  acros that work 
1010: 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72  with signed char
1020: 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e  acters */.#defin
1030: 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73  e IsSpace(X)  is
1040: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
1050: 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20  char)X).#define 
1060: 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69  IsDigit(X)  isdi
1070: 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68  git((unsigned ch
1080: 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f  ar)X).#define To
1090: 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29  Lower(X)  (char)
10a0: 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65  tolower((unsigne
10b0: 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64  d char)X)..#if d
10c0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
10d0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
10e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f  .#include <windo
10f0: 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67  ws.h>../* string
1100: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74   conversion rout
1110: 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  ines only needed
1120: 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74   on Win32 */.ext
1130: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
1140: 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f  3_win32_unicode_
1150: 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29  to_utf8(LPCWSTR)
1160: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
1170: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1180: 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e  s_to_utf8_v2(con
1190: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
11a0: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
11b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
11c0: 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73  _to_mbcs_v2(cons
11d0: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
11e0: 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71  extern LPWSTR sq
11f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1200: 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73  _to_unicode(cons
1210: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a  t char *zText);.
1220: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69  #endif../* On Wi
1230: 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c  ndows, we normal
1240: 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70  ly run with outp
1250: 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20  ut mode of TEXT 
1260: 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61  so that \n chara
1270: 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74  cters.** are aut
1280: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73  omatically trans
1290: 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e  lated into \r\n.
12a0: 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20    However, this 
12b0: 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a  behavior needs.*
12c0: 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  * to be disabled
12d0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28   in some cases (
12e0: 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74  ex: when generat
12f0: 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61  ing CSV output a
1300: 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65  nd when.** rende
1310: 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69  ring quoted stri
1320: 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ngs that contain
1330: 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e   \n characters).
1340: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
1350: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65  ** routines take
1360: 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a   care of that..*
1370: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1380: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1390: 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76  (WIN32).static v
13a0: 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  oid setBinaryMod
13b0: 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e  e(FILE *file, in
13c0: 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69  t isOutput){.  i
13d0: 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66  f( isOutput ) ff
13e0: 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73  lush(file);.  _s
13f0: 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66  etmode(_fileno(f
1400: 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29  ile), _O_BINARY)
1410: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1420: 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45  setTextMode(FILE
1430: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1440: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
1450: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
1460: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
1470: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
1480: 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73  _O_TEXT);.}.#els
1490: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69  e.# define setBi
14a0: 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20  naryMode(X,Y).# 
14b0: 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f  define setTextMo
14c0: 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a  de(X,Y).#endif..
14d0: 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20  ./* True if the 
14e0: 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64  timer is enabled
14f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65   */.static int e
1500: 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a  nableTimer = 0;.
1510: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
1520: 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63  urrent wall-cloc
1530: 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63  k time */.static
1540: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
1550: 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a  imeOfDay(void){.
1560: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
1570: 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d  _vfs *clockVfs =
1580: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
1590: 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f  t64 t;.  if( clo
15a0: 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b  ckVfs==0 ) clock
15b0: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
15c0: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
15d0: 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73   clockVfs->iVers
15e0: 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56  ion>=2 && clockV
15f0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
1600: 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20  Int64!=0 ){.    
1610: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1620: 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63  ntTimeInt64(cloc
1630: 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c  kVfs, &t);.  }el
1640: 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  se{.    double r
1650: 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e  ;.    clockVfs->
1660: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f  xCurrentTime(clo
1670: 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20  ckVfs, &r);.    
1680: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  t = (sqlite3_int
1690: 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30  64)(r*86400000.0
16a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16b0: 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  t;.}..#if !defin
16c0: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
16d0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
16e0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75   !defined(__minu
16f0: 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  x).#include <sys
1700: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
1710: 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1720: 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64  h>../* VxWorks d
1730: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1740: 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66  getrusage() as f
1750: 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74  ar as we can det
1760: 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65  ermine */.#if de
1770: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
1780: 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  L) || defined(__
1790: 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75  RTP__).struct ru
17a0: 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20  sage {.  struct 
17b0: 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65  timeval ru_utime
17c0: 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69  ; /* user CPU ti
17d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72  me used */.  str
17e0: 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73  uct timeval ru_s
17f0: 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20  time; /* system 
1800: 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f  CPU time used */
1810: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72  .};.#define getr
1820: 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65  usage(A,B) memse
1830: 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29  t(B,0,sizeof(*B)
1840: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76  ).#endif../* Sav
1850: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1860: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1870: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1880: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1890: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
18a0: 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50  e sBegin;  /* CP
18b0: 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20  U time at start 
18c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
18d0: 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20  3_int64 iBegin; 
18e0: 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74   /* Wall-clock t
18f0: 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a  ime at start */.
1900: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1910: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1930: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
1940: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
1950: 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75  mer ){.    getru
1960: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1970: 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20  , &sBegin);.    
1980: 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44  iBegin = timeOfD
1990: 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  ay();.  }.}../* 
19a0: 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  Return the diffe
19b0: 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d  rence of two tim
19c0: 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  e_structs in sec
19d0: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
19e0: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73  ouble timeDiff(s
19f0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1a00: 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69  Start, struct ti
1a10: 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20  meval *pEnd){.  
1a20: 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76  return (pEnd->tv
1a30: 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e  _usec - pStart->
1a40: 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30  tv_usec)*0.00000
1a50: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f  1 +.         (do
1a60: 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73  uble)(pEnd->tv_s
1a70: 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f  ec - pStart->tv_
1a80: 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  sec);.}../*.** P
1a90: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
1aa0: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
1ab0: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
1ac0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1ad0: 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20  ableTimer ){.   
1ae0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1af0: 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  End = timeOfDay(
1b00: 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  );.    struct ru
1b10: 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67  sage sEnd;.    g
1b20: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
1b30: 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20  SELF, &sEnd);.  
1b40: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
1b50: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
1b60: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
1b70: 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20  .       (iEnd - 
1b80: 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20  iBegin)*0.001,. 
1b90: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
1ba0: 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c  sBegin.ru_utime,
1bb0: 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29   &sEnd.ru_utime)
1bc0: 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66  ,.       timeDif
1bd0: 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69  f(&sBegin.ru_sti
1be0: 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69  me, &sEnd.ru_sti
1bf0: 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  me));.  }.}..#de
1c00: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
1c10: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
1c20: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
1c30: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
1c40: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a  ne HAS_TIMER 1..
1c50: 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f  #elif (defined(_
1c60: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1c70: 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61  d(WIN32))../* Sa
1c80: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1c90: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1ca0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
1cb0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
1cc0: 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f  atic HANDLE hPro
1cd0: 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c  cess;.static FIL
1ce0: 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65  ETIME ftKernelBe
1cf0: 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  gin;.static FILE
1d00: 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e  TIME ftUserBegin
1d10: 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ;.static sqlite3
1d20: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67  _int64 ftWallBeg
1d30: 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c  in;.typedef BOOL
1d40: 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f   (WINAPI *GETPRO
1d50: 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20  CTIMES)(HANDLE, 
1d60: 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49  LPFILETIME, LPFI
1d70: 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20  LETIME,.        
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49              LPFI
1da0: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
1db0: 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50  ME);.static GETP
1dc0: 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63  ROCTIMES getProc
1dd0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e  essTimesAddr = N
1de0: 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ULL;../*.** Chec
1df0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68  k to see if we h
1e00: 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72  ave timer suppor
1e10: 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  t.  Return 1 if 
1e20: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70  necessary.** sup
1e30: 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66  port found (or f
1e40: 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29  ound previously)
1e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e60: 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  hasTimer(void){.
1e70: 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73    if( getProcess
1e80: 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20  TimesAddr ){.   
1e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65   return 1;.  } e
1ea0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74  lse {.    /* Get
1eb0: 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69  ProcessTimes() i
1ec0: 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69  sn't supported i
1ed0: 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65  n WIN95 and some
1ee0: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20   other Windows. 
1ef0: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20     ** versions. 
1f00: 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69  See if the versi
1f10: 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  on we are runnin
1f20: 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64  g on has it, and
1f30: 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f   if it.    ** do
1f40: 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70  es, save off a p
1f50: 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64  ointer to it and
1f60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1f70: 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20  cess handle..   
1f80: 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73   */.    hProcess
1f90: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1fa0: 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20  cess();.    if( 
1fb0: 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20  hProcess ){.    
1fc0: 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73    HINSTANCE hins
1fd0: 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61  tLib = LoadLibra
1fe0: 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33  ry(TEXT("Kernel3
1ff0: 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20  2.dll"));.      
2000: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73  if( NULL != hins
2010: 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20  tLib ){.        
2020: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2030: 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ddr =.          
2040: 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29    (GETPROCTIMES)
2050: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
2060: 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72  hinstLib, "GetPr
2070: 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20  ocessTimes");.  
2080: 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21        if( NULL !
2090: 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  = getProcessTime
20a0: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20  sAddr ){.       
20b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46       }.        F
20d0: 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74  reeLibrary(hinst
20e0: 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lib);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
2110: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
2120: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
2130: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
2140: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2150: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2160: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2170: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
2180: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
2190: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
21a0: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
21b0: 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f  ocess,&ftCreatio
21c0: 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20  n,&ftExit,.     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69     &ftKernelBegi
21f0: 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b  n,&ftUserBegin);
2200: 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e  .    ftWallBegin
2210: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2220: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
2230: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
2240: 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20  of two FILETIME 
2250: 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e  structs in secon
2260: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  ds */.static dou
2270: 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c  ble timeDiff(FIL
2280: 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46  ETIME *pStart, F
2290: 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a  ILETIME *pEnd){.
22a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
22b0: 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c  64Start = *((sql
22c0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74  ite_int64 *) pSt
22d0: 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69  art);.  sqlite_i
22e0: 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28  nt64 i64End = *(
22f0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29  (sqlite_int64 *)
2300: 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   pEnd);.  return
2310: 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45   (double) ((i64E
2320: 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f  nd - i64Start) /
2330: 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a   10000000.0);.}.
2340: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
2350: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
2360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2370: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
2380: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2390: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
23a0: 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46  imesAddr){.    F
23b0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
23c0: 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65  on, ftExit, ftKe
23d0: 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45  rnelEnd, ftUserE
23e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
23f0: 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20  int64 ftWallEnd 
2400: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2410: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2420: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2430: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2440: 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64  xit,&ftKernelEnd
2450: 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20  ,&ftUserEnd);.  
2460: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
2470: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
2480: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
2490: 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45  .       (ftWallE
24a0: 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e  nd - ftWallBegin
24b0: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
24c0: 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72  timeDiff(&ftUser
24d0: 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e  Begin, &ftUserEn
24e0: 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  d),.       timeD
24f0: 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67  iff(&ftKernelBeg
2500: 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64  in, &ftKernelEnd
2510: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69  ));.  }.}..#defi
2520: 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62  ne BEGIN_TIMER b
2530: 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66  eginTimer().#def
2540: 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e  ine END_TIMER en
2550: 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  dTimer().#define
2560: 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69   HAS_TIMER hasTi
2570: 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65  mer()..#else.#de
2580: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
2590: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
25a0: 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ER.#define HAS_T
25b0: 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  IMER 0.#endif../
25c0: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65  *.** Used to pre
25d0: 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62  vent warnings ab
25e0: 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
25f0: 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  eters.*/.#define
2600: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2610: 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a  R(x) (void)(x)..
2620: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
2630: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
2640: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
2650: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
2660: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
2670: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
2680: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
2690: 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ing flag is set,
26a0: 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78   then command ex
26b0: 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a  ecution stops.**
26c0: 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20   at an error if 
26d0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  we are not inter
26e0: 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  active..*/.stati
26f0: 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72  c int bail_on_er
2700: 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ror = 0;../*.** 
2710: 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20  Threat stdin as 
2720: 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  an interactive i
2730: 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c  nput if the foll
2740: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  owing variable.*
2750: 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65  * is true.  Othe
2760: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74  rwise, assume st
2770: 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  din is connected
2780: 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69   to a file or pi
2790: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe..*/.static in
27a0: 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  t stdin_is_inter
27b0: 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  active = 1;../*.
27c0: 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79  ** On Windows sy
27d0: 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f  stems we have to
27e0: 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72   know if standar
27f0: 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f  d output is a co
2800: 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65  nsole.** in orde
2810: 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55  r to translate U
2820: 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20  TF-8 into MBCS. 
2830: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2840: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72  ariable is.** tr
2850: 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f  ue if translatio
2860: 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  n is required..*
2870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 64  /.static int std
2880: 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d  out_is_console =
2890: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   1;../*.** The f
28a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
28b0: 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61  open SQLite data
28c0: 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61  base.  We make a
28d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73  his database a s
28f0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73  tatic variable s
2900: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
2910: 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20   accessed.** by 
2920: 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c  the SIGINT handl
2930: 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20  er to interrupt 
2940: 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73  database process
2950: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ing..*/.static s
2960: 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62  qlite3 *globalDb
2970: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75   = 0;../*.** Tru
2980: 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70  e if an interrup
2990: 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61  t (Control-C) ha
29a0: 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e  s been received.
29b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74  .*/.static volat
29c0: 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65  ile int seenInte
29d0: 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  rrupt = 0;../*.*
29e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61  * This is the na
29f0: 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61  me of our progra
2a00: 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20  m. It is set in 
2a10: 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20  main(), used.** 
2a20: 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f  in a number of o
2a30: 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73  ther places, mos
2a40: 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  tly for error me
2a50: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
2a60: 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a  c char *Argv0;..
2a70: 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72  /*.** Prompt str
2a80: 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65  ings. Initialize
2a90: 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61  d in main. Setta
2aa0: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70  ble with.**   .p
2ab0: 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69  rompt main conti
2ac0: 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nue.*/.static ch
2ad0: 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30  ar mainPrompt[20
2ae0: 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ];     /* First 
2af0: 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66  line prompt. def
2b00: 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22  ault: "sqlite> "
2b10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63  */.static char c
2b20: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30  ontinuePrompt[20
2b30: 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69  ]; /* Continuati
2b40: 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  on prompt. defau
2b50: 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a  lt: "   ...> " *
2b60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20  /../*.** Render 
2b70: 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69  output like fpri
2b80: 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20  ntf().  Except, 
2b90: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
2ba0: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a   going to the.**
2bb0: 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20   console and if 
2bc0: 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  this is running 
2bd0: 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63  on a Windows mac
2be0: 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20  hine, translate 
2bf0: 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72  the.** output fr
2c00: 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42  om UTF-8 into MB
2c10: 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  CS..*/.#if defin
2c20: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
2c30: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69  fined(WIN32).voi
2c40: 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49  d utf8_printf(FI
2c50: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
2c60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2c70: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2c80: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2c90: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28   zFormat);.  if(
2ca0: 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f   stdout_is_conso
2cb0: 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f  le && (out==stdo
2cc0: 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72  ut || out==stder
2cd0: 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  r) ){.    char *
2ce0: 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  z1 = sqlite3_vmp
2cf0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2d00: 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32  p);.    char *z2
2d10: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
2d20: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32  _utf8_to_mbcs_v2
2d30: 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  (z1, 0);.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20  ite3_free(z1);. 
2d50: 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74     fputs(z2, out
2d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2d70: 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65  ree(z2);.  }else
2d80: 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f  {.    vfprintf(o
2d90: 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ut, zFormat, ap)
2da0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2db0: 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66  p);.}.#elif !def
2dc0: 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66  ined(utf8_printf
2dd0: 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f  ).# define utf8_
2de0: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2df0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  endif../*.** Ren
2e00: 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20  der output like 
2e10: 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73  fprintf().  This
2e20: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
2e30: 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  sed on anything 
2e40: 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73  that.** includes
2e50: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69   string formatti
2e60: 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a  ng (e.g. "%s")..
2e70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2e80: 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65  raw_printf).# de
2e90: 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20  fine raw_printf 
2ea0: 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a  fprintf.#endif..
2eb0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20  /*.** Write I/O 
2ec0: 74 72 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f  traces to the fo
2ed0: 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a  llowing stream..
2ee0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ef0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
2f00: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74  static FILE *iot
2f10: 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
2f20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f30: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
2f40: 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69  printf in that i
2f50: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
2f60: 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74  t is a.** format
2f70: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73   string and subs
2f80: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
2f90: 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62   are values to b
2fa0: 65 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a  e substituted.**
2fb0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66   in place of % f
2fc0: 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75  ields.  The resu
2fd0: 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67  lt of formatting
2fe0: 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20   this string.** 
2ff0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f  is written to io
3000: 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  trace..*/.#ifdef
3010: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
3020: 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f  OTRACE.static vo
3030: 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  id SQLITE_CDECL 
3040: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f  iotracePrintf(co
3050: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3060: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3070: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
3080: 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d  ;.  if( iotrace=
3090: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
30a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
30b0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  mat);.  z = sqli
30c0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
30d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
30e0: 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f  end(ap);.  utf8_
30f0: 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20  printf(iotrace, 
3100: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69  "%s", z);.  sqli
3110: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23  te3_free(z);.}.#
3120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  endif../*.** Out
3130: 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20  put string zUtf 
3140: 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61  to stream pOut a
3150: 73 20 77 20 63 68 61 72 61 63 74 65 72 73 2e 20  s w characters. 
3160: 20 49 66 20 77 20 69 73 20 6e 65 67 61 74 69 76   If w is negativ
3170: 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74  e,.** then right
3180: 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74 65 78  -justify the tex
3190: 74 2e 20 20 57 20 69 73 20 74 68 65 20 77 69 64  t.  W is the wid
31a0: 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72  th in UTF-8 char
31b0: 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69  acters, not.** i
31c0: 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 20 69  n bytes.  This i
31d0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
31e0: 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69   the %*.*s speci
31f0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e  fication in prin
3200: 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68  tf.** since with
3210: 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68   %*.*s the width
3220: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
3230: 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61  bytes, not chara
3240: 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
3250: 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68   void utf8_width
3260: 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75  _print(FILE *pOu
3270: 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20  t, int w, const 
3280: 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69  char *zUtf){.  i
3290: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  nt i;.  int n;. 
32a0: 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20   int aw = w<0 ? 
32b0: 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a  -w : w;.  char z
32c0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  Buf[1000];.  if(
32d0: 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28   aw>(int)sizeof(
32e0: 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20 28  zBuf)/3 ) aw = (
32f0: 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66 29  int)sizeof(zBuf)
3300: 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  /3;.  for(i=n=0;
3310: 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zUtf[i]; i++){.
3320: 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69 5d      if( (zUtf[i]
3330: 26 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a  &0xc0)!=0x80 ){.
3340: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
3350: 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20   if( n==aw ){.  
3360: 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d        do{ i++; }
3370: 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26  while( (zUtf[i]&
3380: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
3390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
33b0: 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20    if( n>=aw ){. 
33c0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33d0: 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  Out, "%.*s", i, 
33e0: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zUtf);.  }else i
33f0: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75 74  f( w<0 ){.    ut
3400: 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20  f8_printf(pOut, 
3410: 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22  "%*s%s", aw-n, "
3420: 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  ", zUtf);.  }els
3430: 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
3440: 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73 22  tf(pOut, "%s%*s"
3450: 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22  , zUtf, aw-n, ""
3460: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
3470: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
3480: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
3490: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
34a0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
34b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
34c0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
34d0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
34e0: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
34f0: 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28  .  if( !IsDigit(
3500: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
3510: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
3520: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
3530: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
3540: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3550: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
3560: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
3570: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
3580: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3590: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
35a0: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
35b0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
35c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
35d0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
35e0: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
35f0: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
3600: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
3620: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
3630: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3640: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3650: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3660: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3670: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3680: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
3690: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
36a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
36b0: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
36c0: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
36d0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
36e0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
36f0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
3700: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
3710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3720: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
3730: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
3740: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
3750: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
3760: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
3770: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
3780: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
3790: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
37a0: 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69 6e  ength of a strin
37b0: 67 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 2e  g in characters.
37c0: 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46 38    Multibyte UTF8
37d0: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 63   characters.** c
37e0: 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c 65  ount as a single
37f0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
3800: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
3810: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
3820: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  *z){.  int n = 0
3830: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
3840: 0a 20 20 20 20 69 66 28 20 28 30 78 63 30 26 2a  .    if( (0xc0&*
3850: 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20 6e  (z++))!=0x80 ) n
3860: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
3870: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   n;.}../*.** Thi
3880: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
3890: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
38a0: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
38b0: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
38c0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
38d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
38e0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
38f0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3900: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
3910: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
3920: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
3930: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
3940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65  ..**.** If zLine
3950: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3960: 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63  n it is a malloc
3970: 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e  ed buffer return
3980: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65  ed from.** a pre
3990: 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68  vious call to th
39a0: 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  is routine that 
39b0: 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a  may be reused..*
39c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
39d0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
39e0: 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a  r *zLine, FILE *
39f0: 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  in){.  int nLine
3a00: 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20   = zLine==0 ? 0 
3a10: 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  : 100;.  int n =
3a20: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
3a30: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
3a40: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3a50: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
3a60: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
3a70: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3a80: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
3a90: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
3aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
3ab0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3ac0: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3ad0: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3ae0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3af0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3b00: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3b20: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3b30: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3b40: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3b50: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3b60: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3b70: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3b80: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3b90: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ba0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3bb0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3bc0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3be0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3bf0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3c00: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3c10: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3c20: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3c30: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3c40: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3c50: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3c60: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3c70: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3c80: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3c90: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3ca0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3cb0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3cc0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3cd0: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3ce0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3cf0: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3d00: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3d10: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3d20: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3d30: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3d40: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3d50: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3d60: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
3d80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3d90: 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  Trans);.        
3da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3dc0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
3dd0: 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73  , zTrans, nTrans
3de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3df0: 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20  _free(zTrans);. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
3e10: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  /* defined(_WIN3
3e20: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
3e30: 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e  N32) */.  return
3e40: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
3e50: 20 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67   Retrieve a sing
3e60: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
3e70: 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   text..**.** If 
3e80: 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64 20  in==0 then read 
3e90: 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
3ea0: 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20 62  put and prompt b
3eb0: 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65 2e  efore each line.
3ec0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
3ed0: 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20 74  ation is true, t
3ee0: 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74 69  hen a continuati
3ef0: 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70 70  on prompt is app
3f00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20  ropriate..** If 
3f10: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69  isContinuation i
3f20: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
3f30: 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f   main prompt sho
3f40: 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  uld be used..**.
3f50: 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73 20  ** If zPrior is 
3f60: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3f70: 20 69 73 20 61 20 62 75 66 66 65 72 20 66 72 6f   is a buffer fro
3f80: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
3f90: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
3fa0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
3fb0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
3fc0: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3fd0: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
3fe0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
3ff0: 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65 72   and must either
4000: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
4010: 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c  the caller or el
4020: 73 65 20 70 61 73 73 65 64 20 62 61 63 6b 20 69  se passed back i
4030: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
4040: 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69   via the.** zPri
4050: 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  or argument for 
4060: 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  reuse..*/.static
4070: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
4080: 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20  _line(FILE *in, 
4090: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e  char *zPrior, in
40a0: 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  t isContinuation
40b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d  ){.  char *zProm
40c0: 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  pt;.  char *zRes
40d0: 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30  ult;.  if( in!=0
40e0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20   ){.    zResult 
40f0: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
4100: 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d  zPrior, in);.  }
4110: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70  else{.    zPromp
4120: 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  t = isContinuati
4130: 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f  on ? continuePro
4140: 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt : mainPrompt
4150: 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f  ;.#if SHELL_USE_
4160: 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20  LOCAL_GETLINE.  
4170: 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a    printf("%s", z
4180: 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c  Prompt);.    ffl
4190: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
41a0: 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c   zResult = local
41b0: 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c  _getline(zPrior,
41c0: 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20   stdin);.#else. 
41d0: 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b     free(zPrior);
41e0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73  .    zResult = s
41f0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50  hell_readline(zP
4200: 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28 20  rompt);.    if( 
4210: 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65 73  zResult && *zRes
4220: 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f  ult ) shell_add_
4230: 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29  history(zResult)
4240: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4250: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
4260: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
4270: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 68  the value of a h
4280: 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74  exadecimal digit
4290: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
42a0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20  the input.** is 
42b0: 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74 2e  not a hex digit.
42c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
42d0: 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68 61  exDigitValue(cha
42e0: 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27  r c){.  if( c>='
42f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 72  0' && c<='9' ) r
4300: 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20  eturn c - '0';. 
4310: 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20 63   if( c>='a' && c
4320: 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20 63  <='f' ) return c
4330: 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 69   - 'a' + 10;.  i
4340: 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d  f( c>='A' && c<=
4350: 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  'F' ) return c -
4360: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65 74   'A' + 10;.  ret
4370: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
4380: 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
4390: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  as an integer va
43a0: 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77 69  lue, possibly wi
43b0: 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a  th suffixes..*/.
43c0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
43d0: 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c 75  nt64 integerValu
43e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
43f0: 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rg){.  sqlite3_i
4400: 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74  nt64 v = 0;.  st
4410: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
4420: 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69  t { char *zSuffi
4430: 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20  x; int iMult; } 
4440: 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  aMult[] = {.    
4450: 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c  { "KiB", 1024 },
4460: 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30  .    { "MiB", 10
4470: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
4480: 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "GiB", 1024*102
4490: 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20  4*1024 },.    { 
44a0: 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20  "KB",  1000 },. 
44b0: 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30     { "MB",  1000
44c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42  000 },.    { "GB
44d0: 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ",  1000000000 }
44e0: 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31  ,.    { "K",   1
44f0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22  000 },.    { "M"
4500: 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ,   1000000 },. 
4510: 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30     { "G",   1000
4520: 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20  000000 },.  };. 
4530: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73   int i;.  int is
4540: 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Neg = 0;.  if( z
4550: 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  Arg[0]=='-' ){. 
4560: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20     isNeg = 1;.  
4570: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73    zArg++;.  }els
4580: 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27  e if( zArg[0]=='
4590: 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b  +' ){.    zArg++
45a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67  ;.  }.  if( zArg
45b0: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
45c0: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
45d0: 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20  int x;.    zArg 
45e0: 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28  += 2;.    while(
45f0: 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56 61   (x = hexDigitVa
4600: 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30  lue(zArg[0]))>=0
4610: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76   ){.      v = (v
4620: 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20  <<4) + x;.      
4630: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
4650: 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b 30  ( IsDigit(zArg[0
4660: 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ]) ){.      v = 
4670: 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d  v*10 + zArg[0] -
4680: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67   '0';.      zArg
4690: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
46a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
46b0: 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b  Size(aMult); i++
46c0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
46d0: 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74  e3_stricmp(aMult
46e0: 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72  [i].zSuffix, zAr
46f0: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  g)==0 ){.      v
4700: 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75   *= aMult[i].iMu
4710: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
4720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4730: 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20  urn isNeg? -v : 
4740: 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61  v;.}../*.** A va
4750: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
4760: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
4770: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
4780: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
4790: 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20 53  ruct ShellText S
47a0: 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63 74  hellText;.struct
47b0: 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63   ShellText {.  c
47c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
47d0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d  .  int nAlloc;.}
47e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
47f0: 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ize and destroy 
4800: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
4810: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
4820: 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c 6c  d initText(Shell
4830: 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  Text *p){.  mems
4840: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4850: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
4860: 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68 65  oid freeText(She
4870: 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  llText *p){.  fr
4880: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74  ee(p->z);.  init
4890: 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a  Text(p);.}../* z
48a0: 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20 70  In is either a p
48b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c  ointer to a NULL
48c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
48d0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
48e0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
48f0: 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c  lloc(), or a NUL
4900: 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  L pointer. The s
4910: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
4920: 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a   by zAppend is.*
4930: 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20  * added to zIn, 
4940: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 72  and the result r
4950: 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72  eturned in memor
4960: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4970: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e  malloc()..** zIn
4980: 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  , if it was not 
4990: 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a  NULL, is freed..
49a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  **.** If the thi
49b0: 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f  rd argument, quo
49c0: 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c  te, is not '\0',
49d0: 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65 64   then it is used
49e0: 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63   as a.** quote c
49f0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70  haracter for zAp
4a00: 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pend..*/.static 
4a10: 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28  void appendText(
4a20: 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68  ShellText *p, ch
4a30: 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e  ar const *zAppen
4a40: 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a  d, char quote){.
4a50: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
4a60: 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   i;.  int nAppen
4a70: 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41 70  d = strlen30(zAp
4a80: 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  pend);..  len = 
4a90: 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a  nAppend+p->n+1;.
4aa0: 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20    if( quote ){. 
4ab0: 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20     len += 2;.   
4ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4ad0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ae0: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4af0: 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a  =quote ) len++;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4b10: 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41   p->n+len>=p->nA
4b20: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
4b30: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
4b40: 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a  c*2 + len + 20;.
4b50: 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c      p->z = reall
4b60: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
4b70: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4b80: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  z==0 ){.      me
4b90: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
4ba0: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
4bb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4bc0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4bd0: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
4be0: 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20   p->z+p->n;.    
4bf0: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4c10: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
4c20: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
4c30: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
4c40: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4c50: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
4c60: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
4c70: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
4c80: 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  ote;.    p->n = 
4c90: 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e  (int)(zCsr - p->
4ca0: 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20  z);.    *zCsr = 
4cb0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  '\0';.  }else{. 
4cc0: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70     memcpy(p->z+p
4cd0: 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41  ->n, zAppend, nA
4ce0: 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e  ppend);.    p->n
4cf0: 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20   += nAppend;.   
4d00: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c   p->z[p->n] = '\
4d10: 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0';.  }.}../*.**
4d20: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
4d30: 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66  rmine if identif
4d40: 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20  ier zName needs 
4d50: 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69  to be quoted, ei
4d60: 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20  ther.** because 
4d70: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  it contains non-
4d80: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
4d90: 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61  racters, or beca
4da0: 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20  use it is an.** 
4db0: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20  SQLite keyword. 
4dc0: 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65   Be conservative
4dd0: 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74   in this estimat
4de0: 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  e:  When in doub
4df0: 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  t assume.** that
4e00: 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75   quoting is requ
4e10: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ired..**.** Retu
4e20: 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e  rn '"' if quotin
4e30: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  g is required.  
4e40: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71  Return 0 if no q
4e50: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
4e60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
4e70: 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e  ar quoteChar(con
4e80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4e90: 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65  .  /* All SQLite
4ea0: 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c   keywords, in al
4eb0: 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72  phabetical order
4ec0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
4ed0: 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f  st char *azKeywo
4ee0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41  rds[] = {.    "A
4ef0: 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c  BORT", "ACTION",
4f00: 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c   "ADD", "AFTER",
4f10: 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c   "ALL", "ALTER",
4f20: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44   "ANALYZE", "AND
4f30: 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53  ", "AS",.    "AS
4f40: 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41  C", "ATTACH", "A
4f50: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22  UTOINCREMENT", "
4f60: 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22  BEFORE", "BEGIN"
4f70: 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59  , "BETWEEN", "BY
4f80: 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45 22  ",.    "CASCADE"
4f90: 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54 22  , "CASE", "CAST"
4fa0: 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c  , "CHECK", "COLL
4fb0: 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20  ATE", "COLUMN", 
4fc0: 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43  "COMMIT",.    "C
4fd0: 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54  ONFLICT", "CONST
4fe0: 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22  RAINT", "CREATE"
4ff0: 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52  , "CROSS", "CURR
5000: 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22  ENT_DATE",.    "
5010: 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22  CURRENT_TIME", "
5020: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
5030: 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20  P", "DATABASE", 
5040: 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45  "DEFAULT", "DEFE
5050: 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45  RRABLE",.    "DE
5060: 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45  FERRED", "DELETE
5070: 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54 41  ", "DESC", "DETA
5080: 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c  CH", "DISTINCT",
5090: 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c   "DROP", "EACH",
50a0: 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e  .    "ELSE", "EN
50b0: 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45  D", "ESCAPE", "E
50c0: 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49  XCEPT", "EXCLUSI
50d0: 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22  VE", "EXISTS", "
50e0: 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46  EXPLAIN",.    "F
50f0: 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f  AIL", "FOR", "FO
5100: 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20  REIGN", "FROM", 
5110: 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20  "FULL", "GLOB", 
5120: 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47  "GROUP", "HAVING
5130: 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47  ", "IF",.    "IG
5140: 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54  NORE", "IMMEDIAT
5150: 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58  E", "IN", "INDEX
5160: 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49  ", "INDEXED", "I
5170: 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45  NITIALLY", "INNE
5180: 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22  R",.    "INSERT"
5190: 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e  , "INSTEAD", "IN
51a0: 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22  TERSECT", "INTO"
51b0: 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22  , "IS", "ISNULL"
51c0: 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c  , "JOIN", "KEY",
51d0: 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49  .    "LEFT", "LI
51e0: 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d  KE", "LIMIT", "M
51f0: 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22  ATCH", "NATURAL"
5200: 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22  , "NO", "NOT", "
5210: 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e  NOTNULL",.    "N
5220: 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46  ULL", "OF", "OFF
5230: 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22  SET", "ON", "OR"
5240: 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45  , "ORDER", "OUTE
5250: 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41  R", "PLAN", "PRA
5260: 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41  GMA",.    "PRIMA
5270: 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52  RY", "QUERY", "R
5280: 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49 56  AISE", "RECURSIV
5290: 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22  E", "REFERENCES"
52a0: 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20  , "REGEXP",.    
52b0: 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45  "REINDEX", "RELE
52c0: 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20  ASE", "RENAME", 
52d0: 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54  "REPLACE", "REST
52e0: 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a  RICT", "RIGHT",.
52f0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20      "ROLLBACK", 
5300: 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e  "ROW", "SAVEPOIN
5310: 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53  T", "SELECT", "S
5320: 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54  ET", "TABLE", "T
5330: 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f  EMP",.    "TEMPO
5340: 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22  RARY", "THEN", "
5350: 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f  TO", "TRANSACTIO
5360: 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22  N", "TRIGGER", "
5370: 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22  UNION", "UNIQUE"
5380: 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c 20  ,.    "UPDATE", 
5390: 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d  "USING", "VACUUM
53a0: 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49  ", "VALUES", "VI
53b0: 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20  EW", "VIRTUAL", 
53c0: 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c  "WHEN", "WHERE",
53d0: 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57 49  .    "WITH", "WI
53e0: 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69  THOUT",.  };.  i
53f0: 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20  nt i, lwr, upr, 
5400: 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21 69  mid, c;.  if( !i
5410: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5420: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
5430: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
5440: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5450: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
5460: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
5470: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
5480: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
5490: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
54a0: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
54b0: 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30  ';.  }.  lwr = 0
54c0: 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66  ;.  upr = sizeof
54d0: 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a  (azKeywords)/siz
54e0: 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30  eof(azKeywords[0
54f0: 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ]) - 1;.  while(
5500: 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
5510: 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29   mid = (lwr+upr)
5520: 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  /2;.    c = sqli
5530: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65  te3_stricmp(azKe
5540: 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61  ywords[mid], zNa
5550: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  me);.    if( c==
5560: 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  0 ) return '"';.
5570: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
5580: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31       lwr = mid+1
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
55a0: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a     upr = mid-1;.
55b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
55d0: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
55e0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
55f0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5600: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5610: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
5620: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
5630: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
5640: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
5650: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
5660: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
5670: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
56a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
56b0: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
56c0: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
56d0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
56e0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
56f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5700: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5710: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5720: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
5730: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
5740: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
5750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5760: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
5770: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5780: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5790: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
57a0: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
57b0: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
57c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
57d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
57e0: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
57f0: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
5820: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
5830: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
5840: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
5850: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5860: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
5870: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5880: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5890: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
58a0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
58b0: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
58c0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
58d0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
58e0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
58f0: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5900: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5910: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
5920: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
5930: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
5940: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
5950: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
5960: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
5970: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5980: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5990: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
59a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
59b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
59c0: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
59d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
59e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
59f0: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5a00: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5a10: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
5a20: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
5a30: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5a40: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
5a50: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
5a60: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
5a70: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5a80: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5a90: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5aa0: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5ab0: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5ac0: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5ad0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5ae0: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5af0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5b00: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5b10: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
5b20: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
5b30: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
5b40: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
5b50: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
5b60: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
5b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5b80: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5b90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5ba0: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5bb0: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5bc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5be0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5c00: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5c10: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
5c20: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
5c30: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5c40: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
5c50: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  , 0, zName);.  i
5c60: 66 28 20 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20  f( zFake ){.    
5c70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5c80: 65 78 74 28 70 43 74 78 2c 20 73 71 6c 69 74 65  ext(pCtx, sqlite
5c90: 33 5f 6d 70 72 69 6e 74 66 28 22 2f 2a 20 25 73  3_mprintf("/* %s
5ca0: 20 2a 2f 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20   */", zFake),.  
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 2d 31 2c 20 73 71 6c 69 74 65        -1, sqlite
5cd0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 66 72 65  3_free);.    fre
5ce0: 65 28 7a 46 61 6b 65 29 3b 0a 20 20 7d 0a 7d 0a  e(zFake);.  }.}.
5cf0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
5d00: 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f  ion:  shell_add_
5d10: 73 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a  schema(S,X).**.*
5d20: 2a 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61  * Add the schema
5d30: 20 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43   name X to the C
5d40: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
5d50: 69 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20  in S and return 
5d60: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45  the result..** E
5d70: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
5d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5d90: 31 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41  1(x)   ->   CREA
5da0: 54 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28  TE TABLE xyz.t1(
5db0: 78 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77  x);.**.** Also w
5dc0: 6f 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  orks on.**.**   
5dd0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a   CREATE INDEX.**
5de0: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
5df0: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5e00: 45 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20  EATE VIEW.**    
5e10: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a  CREATE TRIGGER.*
5e20: 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  *    CREATE VIRT
5e30: 55 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20  UAL TABLE.**.** 
5e40: 54 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64  This UDF is used
5e50: 20 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20   by the .schema 
5e60: 63 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72  command to inser
5e70: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  t the schema nam
5e80: 65 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  e of.** attached
5e90: 20 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20   databases into 
5ea0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5eb0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  e sqlite_master.
5ec0: 73 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  sql field..*/.st
5ed0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41  atic void shellA
5ee0: 64 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20  ddSchemaName(.  
5ef0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5f00: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
5f10: 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
5f20: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
5f30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5f40: 72 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b  r *aPrefix[] = {
5f50: 0a 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20  .     "TABLE",. 
5f60: 20 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20      "INDEX",.   
5f70: 20 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22    "UNIQUE INDEX"
5f80: 2c 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20  ,.     "VIEW",. 
5f90: 20 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20      "TRIGGER",. 
5fa0: 20 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42      "VIRTUAL TAB
5fb0: 4c 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  LE".  };.  int i
5fc0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
5fd0: 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ar *zIn = (const
5fe0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5ff0: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
6000: 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0]);.  const cha
6010: 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f  r *zSchema = (co
6020: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6030: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
6040: 61 6c 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  al[1]);.  const 
6050: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
6060: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6070: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
6080: 56 61 6c 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74  Val[2]);.  sqlit
6090: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
60a0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
60b0: 6c 65 28 70 43 74 78 29 3b 0a 20 20 69 66 28 20  le(pCtx);.  if( 
60c0: 7a 49 6e 21 3d 30 20 26 26 20 73 74 72 6e 63 6d  zIn!=0 && strncm
60d0: 70 28 7a 49 6e 2c 20 22 43 52 45 41 54 45 20 22  p(zIn, "CREATE "
60e0: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  , 7)==0 ){.    f
60f0: 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
6100: 73 69 7a 65 6f 66 28 61 50 72 65 66 69 78 29 2f  sizeof(aPrefix)/
6110: 73 69 7a 65 6f 66 28 61 50 72 65 66 69 78 5b 30  sizeof(aPrefix[0
6120: 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ])); i++){.     
6130: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
6140: 30 28 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20  0(aPrefix[i]);. 
6150: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6160: 28 7a 49 6e 2b 37 2c 20 61 50 72 65 66 69 78 5b  (zIn+7, aPrefix[
6170: 69 5d 2c 20 6e 29 3d 3d 30 20 26 26 20 7a 49 6e  i], n)==0 && zIn
6180: 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  [n+7]==' ' ){.  
6190: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
61a0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
61b0: 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20  *zFake = 0;.    
61c0: 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 20      if( zSchema 
61d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
61e0: 72 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65  r cQuote = quote
61f0: 43 68 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20  Char(zSchema);. 
6200: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 51 75           if( cQu
6210: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73  ote && sqlite3_s
6220: 74 72 69 63 6d 70 28 7a 53 63 68 65 6d 61 2c 22  tricmp(zSchema,"
6230: 74 65 6d 70 22 29 21 3d 30 20 29 7b 0a 20 20 20  temp")!=0 ){.   
6240: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
6250: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
6260: 2a 73 20 5c 22 25 77 5c 22 2e 25 73 22 2c 20 6e  *s \"%w\".%s", n
6270: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
6280: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
6290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
62a0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
62b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
62c0: 2a 73 20 25 73 2e 25 73 22 2c 20 6e 2b 37 2c 20  *s %s.%s", n+7, 
62d0: 7a 49 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49  zIn, zSchema, zI
62e0: 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20  n+n+8);.        
62f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6300: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 0a        if( zName.
6310: 20 20 20 20 20 20 20 20 20 26 26 20 61 50 72 65           && aPre
6320: 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27 56 27 0a 20  fix[i][0]=='V'. 
6330: 20 20 20 20 20 20 20 20 26 26 20 28 7a 46 61 6b          && (zFak
6340: 65 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68  e = shellFakeSch
6350: 65 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d 61 2c  ema(db, zSchema,
6360: 20 7a 4e 61 6d 65 29 29 21 3d 30 0a 20 20 20 20   zName))!=0.    
6370: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
6380: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
6390: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
63a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
63b0: 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a 49 6e  \n/* %s */", zIn
63c0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
63d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63e0: 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74         z = sqlit
63f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e  e3_mprintf("%z\n
6400: 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a 2c 20 7a 46  /* %s */", z, zF
6410: 61 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ake);.          
6420: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  }.          free
6430: 28 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20 20  (zFake);.       
6440: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
6450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6460: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6470: 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 73  t(pCtx, z, -1, s
6480: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
64a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
64b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
64c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
64d0: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
64e0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
64f0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
6500: 20 73 65 76 65 72 61 6c 20 72 75 6e 2d 74 69 6d   several run-tim
6510: 65 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  e loadable exten
6520: 73 69 6f 6e 73 20 69 73 20 69 6e 73 65 72 74 65  sions is inserte
6530: 64 0a 2a 2a 20 62 65 6c 6f 77 20 62 79 20 74 68  d.** below by th
6540: 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68 65 6c  e ../tool/mkshel
6550: 6c 63 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20  lc.tcl script.  
6560: 42 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  Before processin
6570: 67 20 74 68 61 74 20 69 6e 63 6c 75 64 65 64 0a  g that included.
6580: 2a 2a 20 63 6f 64 65 2c 20 77 65 20 6e 65 65 64  ** code, we need
6590: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 73 6f 6d   to override som
65a0: 65 20 6d 61 63 72 6f 73 20 74 6f 20 6d 61 6b 65  e macros to make
65b0: 20 74 68 65 20 69 6e 63 6c 75 64 65 64 20 70 72   the included pr
65c0: 6f 67 72 61 6d 20 63 6f 64 65 0a 2a 2a 20 77 6f  ogram code.** wo
65d0: 72 6b 20 68 65 72 65 20 69 6e 20 74 68 65 20 6d  rk here in the m
65e0: 69 64 64 6c 65 20 6f 66 20 74 68 69 73 20 72 65  iddle of this re
65f0: 67 75 6c 61 72 20 70 72 6f 67 72 61 6d 2e 0a 2a  gular program..*
6600: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
6610: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
6620: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
6630: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28  EXTENSION_INIT2(
6640: 58 29 20 28 76 6f 69 64 29 28 58 29 0a 0a 23 69  X) (void)(X)..#i
6650: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
6660: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53  ) && defined(_MS
6670: 43 5f 56 45 52 29 0a 49 4e 43 4c 55 44 45 20 74  C_VER).INCLUDE t
6680: 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e 68 0a  est_windirent.h.
6690: 49 4e 43 4c 55 44 45 20 74 65 73 74 5f 77 69 6e  INCLUDE test_win
66a0: 64 69 72 65 6e 74 2e 63 0a 23 64 65 66 69 6e 65  dirent.c.#define
66b0: 20 64 69 72 65 6e 74 20 44 49 52 45 4e 54 0a 23   dirent DIRENT.#
66c0: 65 6e 64 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e  endif.INCLUDE ..
66d0: 2f 65 78 74 2f 6d 69 73 63 2f 73 68 61 74 68 72  /ext/misc/shathr
66e0: 65 65 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  ee.c.INCLUDE ../
66f0: 65 78 74 2f 6d 69 73 63 2f 66 69 6c 65 69 6f 2e  ext/misc/fileio.
6700: 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  c.INCLUDE ../ext
6710: 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65 74 69 6f 6e  /misc/completion
6720: 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78  .c.INCLUDE ../ex
6730: 74 2f 6d 69 73 63 2f 61 70 70 65 6e 64 76 66 73  t/misc/appendvfs
6740: 2e 63 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .c.#ifdef SQLITE
6750: 5f 48 41 56 45 5f 5a 4c 49 42 0a 49 4e 43 4c 55  _HAVE_ZLIB.INCLU
6760: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 7a  DE ../ext/misc/z
6770: 69 70 66 69 6c 65 2e 63 0a 49 4e 43 4c 55 44 45  ipfile.c.INCLUDE
6780: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 71 6c   ../ext/misc/sql
6790: 61 72 2e 63 0a 23 65 6e 64 69 66 0a 49 4e 43 4c  ar.c.#endif.INCL
67a0: 55 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72  UDE ../ext/exper
67b0: 74 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e  t/sqlite3expert.
67c0: 68 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  h.INCLUDE ../ext
67d0: 2f 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65  /expert/sqlite3e
67e0: 78 70 65 72 74 2e 63 0a 0a 23 69 66 20 64 65 66  xpert.c..#if def
67f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6800: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
6810: 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
6820: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
6830: 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f   open session.*/
6840: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
6850: 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e  OpenSession Open
6860: 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20  Session;.struct 
6870: 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20  OpenSession {.  
6880: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
6890: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
68a0: 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68  olic name for th
68b0: 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  is session */.  
68c0: 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20  int nFilter;    
68d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
68e0: 65 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  er of xFilter re
68f0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
6900: 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  terns */.  char 
6910: 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20  **azFilter;     
6920: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6930: 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f  xFilter rejectio
6940: 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20  n GLOB patterns 
6950: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  */.  sqlite3_ses
6960: 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a  sion *p;      /*
6970: 20 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f   The open sessio
6980: 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a  n */.};.#endif..
6990: 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70  /*.** Shell outp
69a0: 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  ut mode informat
69b0: 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20  ion from before 
69c0: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a  ".explain on",.*
69d0: 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20  * saved so that 
69e0: 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  it can be restor
69f0: 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20  ed by ".explain 
6a00: 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20  off".*/.typedef 
6a10: 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65  struct SavedMode
6a20: 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e  Info SavedModeIn
6a30: 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64  fo;.struct Saved
6a40: 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74  ModeInfo {.  int
6a50: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20   valid;         
6a60: 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67   /* Is there leg
6a70: 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f  it data in here?
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
6aa0: 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  e prior to ".exp
6ab0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6ac0: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
6ad0: 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65    /* The ".heade
6ae0: 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72  r" setting prior
6af0: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
6b00: 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  " */.  int colWi
6b10: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f  dth[100];  /* Co
6b20: 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f  lumn widths prio
6b30: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
6b40: 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  n" */.};..typede
6b50: 66 20 73 74 72 75 63 74 20 45 78 70 65 72 74 49  f struct ExpertI
6b60: 6e 66 6f 20 45 78 70 65 72 74 49 6e 66 6f 3b 0a  nfo ExpertInfo;.
6b70: 73 74 72 75 63 74 20 45 78 70 65 72 74 49 6e 66  struct ExpertInf
6b80: 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  o {.  sqlite3exp
6b90: 65 72 74 20 2a 70 45 78 70 65 72 74 3b 0a 20 20  ert *pExpert;.  
6ba0: 69 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a 7d 3b  int bVerbose;.};
6bb0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  ../*.** State in
6bc0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6be0: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61  nection is conta
6bf0: 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ined in an.** in
6c00: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6c10: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6c20: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
6c30: 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20  ruct ShellState 
6c40: 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75  ShellState;.stru
6c50: 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a  ct ShellState {.
6c60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
6c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6c80: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
6c90: 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20   autoExplain;   
6ca0: 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69       /* Automati
6cb0: 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65  cally turn on .e
6cc0: 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20  xplain mode */. 
6cd0: 20 75 38 20 61 75 74 6f 45 51 50 3b 20 20 20 20   u8 autoEQP;    
6ce0: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45          /* Run E
6cf0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
6d00: 4e 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68  N prior to seach
6d10: 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 75   SQL stmt */.  u
6d20: 38 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  8 statsOn;      
6d30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6d40: 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   display memory 
6d50: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
6d60: 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20  h finalize */.  
6d70: 75 38 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20  u8 scanstatsOn; 
6d80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6d90: 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73  o display scan s
6da0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
6db0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75   finalize */.  u
6dc0: 38 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  8 openMode;     
6dd0: 20 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f        /* SHELL_O
6de0: 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50  PEN_NORMAL, _APP
6df0: 45 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46  ENDVFS, or _ZIPF
6e00: 49 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74  ILE */.  int out
6e10: 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
6e20: 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64  /* Revert to std
6e30: 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e  out when reachin
6e40: 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  g zero */.  int 
6e50: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
6e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6e70: 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65  records displaye
6e80: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49  d so far */.  FI
6e90: 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20  LE *out;        
6ea0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
6eb0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
6ec0: 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b 20  FILE *traceOut; 
6ed0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6ee0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74 72 61   for sqlite3_tra
6ef0: 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ce() */.  int nE
6f00: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
6f10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
6f20: 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  rors seen */.  i
6f30: 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20  nt mode;        
6f40: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70        /* An outp
6f50: 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20  ut mode setting 
6f60: 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20  */.  int cMode; 
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6f80: 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20  emporary output 
6f90: 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72  mode for the cur
6fa0: 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20  rent query */.  
6fb0: 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20  int normalMode; 
6fc0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6fd0: 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65   mode before ".e
6fe0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
6ff0: 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65  int writableSche
7000: 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ma;    /* True i
7010: 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  f PRAGMA writabl
7020: 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20  e_schema=ON */. 
7030: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
7040: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7050: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
7060: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
7070: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
7080: 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20   int nCheck;    
7090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70a0: 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f  r of ".check" co
70b0: 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20  mmands run */.  
70c0: 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c  unsigned shellFl
70d0: 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  gs;    /* Variou
70e0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61  s flags */.  cha
70f0: 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20  r *zDestTable;  
7100: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
7110: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
7120: 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72   when MODE_Inser
7130: 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73  t */.  char zTes
7140: 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a  tcase[30];    /*
7150: 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74   Name of current
7160: 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20   test case */.  
7170: 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f  char colSeparato
7180: 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e  r[20]; /* Column
7190: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
71a0: 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c  cter for several
71b0: 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   modes */.  char
71c0: 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30   rowSeparator[20
71d0: 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61  ]; /* Row separa
71e0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
71f0: 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a  r MODE_Ascii */.
7200: 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31    int colWidth[1
7210: 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75  00];     /* Requ
7220: 65 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65  ested width of e
7230: 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20  ach column when 
7240: 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f  in column mode*/
7250: 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64  .  int actualWid
7260: 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74  th[100];  /* Act
7270: 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63  ual width of eac
7280: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
7290: 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d  ar nullValue[20]
72a0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74  ;    /* The text
72b0: 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61   to print when a
72c0: 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
72d0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20   from.          
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
72f0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  * the database *
7300: 2f 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65  /.  char outfile
7310: 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20  [FILENAME_MAX]; 
7320: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20  /* Filename for 
7330: 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  *out */.  const 
7340: 63 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d  char *zDbFilenam
7350: 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  e;    /* name of
7360: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7370: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  le */.  char *zF
7380: 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20  reeOnClose;     
7390: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
73a0: 74 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f  to free when clo
73b0: 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sing */.  const 
73c0: 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20  char *zVfs;     
73d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
73e0: 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20   VFS to use */. 
73f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7400: 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65  Stmt;   /* Curre
7410: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  nt statement if 
7420: 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  any. */.  FILE *
7430: 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20  pLog;           
7440: 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75   /* Write log ou
7450: 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  tput here */.  i
7460: 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20  nt *aiIndent;   
7470: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
7480: 66 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69  f indents used i
7490: 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a  n MODE_Explain *
74a0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b  /.  int nIndent;
74b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
74c0: 7a 65 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e  ze of array aiIn
74d0: 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  dent[] */.  int 
74e0: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
74f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
7500: 75 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49  urrent op in aiI
7510: 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 23 69 66 20 64  ndent[] */.#if d
7520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
7530: 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20  ABLE_SESSION).  
7540: 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20  int nSession;   
7550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7560: 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 65  ber of active se
7570: 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e  ssions */.  Open
7580: 53 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e  Session aSession
7590: 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  [4];  /* Array o
75a0: 66 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d  f sessions.  [0]
75b0: 20 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f   is in focus. */
75c0: 0a 23 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74  .#endif.  Expert
75d0: 49 6e 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20  Info expert;    
75e0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20      /* Valid if 
75f0: 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64  previous command
7600: 20 77 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50   was ".expert OP
7610: 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a  T..." */.};.../*
7620: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7630: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61  for ShellState.a
7640: 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e  utoEQP.*/.#defin
7650: 65 20 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20  e AUTOEQP_off   
7660: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 41 55 54     0.#define AUT
7670: 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 0a  OEQP_on       1.
7680: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
7690: 74 72 69 67 67 65 72 20 20 32 0a 23 64 65 66 69  trigger  2.#defi
76a0: 6e 65 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20  ne AUTOEQP_full 
76b0: 20 20 20 20 33 0a 0a 2f 2a 20 41 6c 6c 6f 77 65      3../* Allowe
76c0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
76d0: 6c 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64 65  llState.openMode
76e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c  .*/.#define SHEL
76f0: 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20 20  L_OPEN_UNSPEC   
7700: 20 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f    0      /* No o
7710: 70 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69 66 69  pen-mode specifi
7720: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7730: 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20  ELL_OPEN_NORMAL 
7740: 20 20 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f      1      /* No
7750: 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
7760: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  le */.#define SH
7770: 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
7780: 46 53 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73  FS  2      /* Us
7790: 65 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23  e appendvfs */.#
77a0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
77b0: 4e 5f 5a 49 50 46 49 4c 45 20 20 20 20 33 20 20  N_ZIPFILE    3  
77c0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a      /* Use the z
77d0: 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74  ipfile virtual t
77e0: 61 62 6c 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  able */../*.** T
77f0: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
7800: 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73 20 76  owed shellFlgs v
7810: 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  alues.*/.#define
7820: 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65   SHFLG_Pagecache
7830: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31        0x00000001
7840: 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65 63 61   /* The --pageca
7850: 63 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  che option is us
7860: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7870: 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 20 20  FLG_Lookaside   
7880: 20 20 20 30 78 30 30 30 30 30 30 30 32 20 2f 2a     0x00000002 /*
7890: 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   Lookaside memor
78a0: 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  y is used */.#de
78b0: 66 69 6e 65 20 53 48 46 4c 47 5f 42 61 63 6b 73  fine SHFLG_Backs
78c0: 6c 61 73 68 20 20 20 20 20 20 30 78 30 30 30 30  lash      0x0000
78d0: 30 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d 62 61  0004 /* The --ba
78e0: 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e 20 69  ckslash option i
78f0: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
7900: 65 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  e SHFLG_Preserve
7910: 52 6f 77 69 64 20 20 30 78 30 30 30 30 30 30 30  Rowid  0x0000000
7920: 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65 73 65  8 /* .dump prese
7930: 72 76 65 73 20 72 6f 77 69 64 20 76 61 6c 75 65  rves rowid value
7940: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  s */.#define SHF
7950: 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20 20 20  LG_Newlines     
7960: 20 20 30 78 30 30 30 30 30 30 31 30 20 2f 2a 20    0x00000010 /* 
7970: 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e 65 20  .dump --newline 
7980: 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  flag */.#define 
7990: 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67  SHFLG_CountChang
79a0: 65 73 20 20 20 30 78 30 30 30 30 30 30 32 30 20  es   0x00000020 
79b0: 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73 65 74 74  /* .changes sett
79c0: 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ing */.#define S
79d0: 48 46 4c 47 5f 45 63 68 6f 20 20 20 20 20 20 20  HFLG_Echo       
79e0: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 2f      0x00000040 /
79f0: 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65 63 68  * .echo or --ech
7a00: 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a 2f 2a  o setting */../*
7a10: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
7a20: 65 73 74 69 6e 67 20 61 6e 64 20 73 65 74 74 69  esting and setti
7a30: 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a 2f 0a  ng shellFlgs.*/.
7a40: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 48 61 73  #define ShellHas
7a50: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 28  Flag(P,X)    (((
7a60: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  P)->shellFlgs & 
7a70: 28 58 29 29 21 3d 30 29 0a 23 64 65 66 69 6e 65  (X))!=0).#define
7a80: 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 50 2c   ShellSetFlag(P,
7a90: 58 29 20 20 20 20 28 28 50 29 2d 3e 73 68 65 6c  X)    ((P)->shel
7aa0: 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64 65 66  lFlgs|=(X)).#def
7ab0: 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c  ine ShellClearFl
7ac0: 61 67 28 50 2c 58 29 20 20 28 28 50 29 2d 3e 73  ag(P,X)  ((P)->s
7ad0: 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58 29 29  hellFlgs&=(~(X))
7ae0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  )../*.** These a
7af0: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
7b00: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
7b10: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
7b20: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
7b30: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
7b40: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
7b50: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
7b60: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
7b70: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
7b80: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
7b90: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
7ba0: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
7bb0: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
7bc0: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
7bd0: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
7be0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
7bf0: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
7c00: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
7c10: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
7c20: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
7c30: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
7c40: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
7c50: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
7c60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7c70: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
7c80: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
7c90: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
7ca0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7cb0: 5f 51 75 6f 74 65 20 20 20 20 36 20 20 2f 2a 20  _Quote    6  /* 
7cc0: 51 75 6f 74 65 20 76 61 6c 75 65 73 20 61 73 20  Quote values as 
7cd0: 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69  for SQL */.#defi
7ce0: 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20  ne MODE_Tcl     
7cf0: 20 37 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   7  /* Generate 
7d00: 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75  ANSI-C or TCL qu
7d10: 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  oted elements */
7d20: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73  .#define MODE_Cs
7d30: 76 20 20 20 20 20 20 38 20 20 2f 2a 20 51 75 6f  v      8  /* Quo
7d40: 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62  te strings, numb
7d50: 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f  ers are plain */
7d60: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78  .#define MODE_Ex
7d70: 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c 69 6b  plain  9  /* Lik
7d80: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62  e MODE_Column, b
7d90: 75 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61  ut do not trunca
7da0: 74 65 20 64 61 74 61 20 2a 2f 0a 23 64 65 66 69  te data */.#defi
7db0: 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69 20 20 20  ne MODE_Ascii   
7dc0: 31 30 20 20 2f 2a 20 55 73 65 20 41 53 43 49 49  10  /* Use ASCII
7dd0: 20 75 6e 69 74 20 61 6e 64 20 72 65 63 6f 72 64   unit and record
7de0: 20 73 65 70 61 72 61 74 6f 72 73 20 28 30 78 31   separators (0x1
7df0: 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65 66 69  F/0x1E) */.#defi
7e00: 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 20  ne MODE_Pretty  
7e10: 31 31 20 20 2f 2a 20 50 72 65 74 74 79 2d 70 72  11  /* Pretty-pr
7e20: 69 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f 0a 0a  int schemas */..
7e30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7e40: 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d 20 3d  r *modeDescr[] =
7e50: 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20 20 22   {.  "line",.  "
7e60: 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69 73 74  column",.  "list
7e70: 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20 20 22  ",.  "semi",.  "
7e80: 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65 72 74  html",.  "insert
7e90: 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a 20 20  ",.  "quote",.  
7ea0: 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a  "tcl",.  "csv",.
7eb0: 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20 22    "explain",.  "
7ec0: 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65 74 74  ascii",.  "prett
7ed0: 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a 2f 2a 0a  yprint",.};../*.
7ee0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
7ef0: 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65   column/row/line
7f00: 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64   separators used
7f10: 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a   by the various.
7f20: 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74  ** import/export
7f30: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
7f40: 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20  ne SEP_Column   
7f50: 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   "|".#define SEP
7f60: 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a  _Row       "\n".
7f70: 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20  #define SEP_Tab 
7f80: 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69        "\t".#defi
7f90: 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20  ne SEP_Space    
7fa0: 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50   " ".#define SEP
7fb0: 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23  _Comma     ",".#
7fc0: 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20  define SEP_CrLf 
7fd0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66       "\r\n".#def
7fe0: 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20  ine SEP_Unit    
7ff0: 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65    "\x1F".#define
8000: 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22   SEP_Record    "
8010: 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  \x1E"../*.** A c
8020: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
8030: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e  sqlite3_log() in
8040: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
8050: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67  ic void shellLog
8060: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
8070: 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74   iErrCode, const
8080: 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
8090: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
80a0: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72  (ShellState*)pAr
80b0: 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  g;.  if( p->pLog
80c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
80d0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70  utf8_printf(p->p
80e0: 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22  Log, "(%d) %s\n"
80f0: 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67  , iErrCode, zMsg
8100: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70  );.  fflush(p->p
8110: 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Log);.}../*.** O
8120: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
8130: 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d  string as a hex-
8140: 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67  encoded blob (eg
8150: 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73  . X'1234' ).*/.s
8160: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
8170: 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20  t_hex_blob(FILE 
8180: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  *out, const void
8190: 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
81a0: 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ob){.  int i;.  
81b0: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63  char *zBlob = (c
81c0: 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72  har *)pBlob;.  r
81d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58  aw_printf(out,"X
81e0: 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '");.  for(i=0; 
81f0: 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72  i<nBlob; i++){ r
8200: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  aw_printf(out,"%
8210: 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78  02x",zBlob[i]&0x
8220: 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69  ff); }.  raw_pri
8230: 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a  ntf(out,"'");.}.
8240: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74  ./*.** Find a st
8250: 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  ring that is not
8260: 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20   found anywhere 
8270: 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20  in z[].  Return 
8280: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8290: 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  that string..**.
82a0: 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41  ** Try to use zA
82b0: 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20   and zB first.  
82c0: 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65  If both of those
82d0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75   are already fou
82e0: 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65  nd in z[].** the
82f0: 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73  n make up some s
8300: 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20  tring and store 
8310: 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  it in the buffer
8320: 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
8330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75   const char *unu
8340: 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f  sed_string(.  co
8350: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20  nst char *z,    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e  /* Result must n
8380: 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65  ot appear anywhe
8390: 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e  re in z */.  con
83a0: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e  st char *zA, con
83b0: 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f  st char *zB,   /
83c0: 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73  * Try these firs
83d0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75  t */.  char *zBu
83e0: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
83f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
8400: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e  e to store a gen
8410: 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f  erated string */
8420: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
8430: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73   = 0;.  if( strs
8440: 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72  tr(z, zA)==0 ) r
8450: 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20  eturn zA;.  if( 
8460: 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30  strstr(z, zB)==0
8470: 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20   ) return zB;.  
8480: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
8490: 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66  snprintf(20,zBuf
84a0: 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69  ,"(%s%u)", zA, i
84b0: 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73  ++);.  }while( s
84c0: 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30  trstr(z,zBuf)!=0
84d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75   );.  return zBu
84e0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  f;.}../*.** Outp
84f0: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
8500: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
8510: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c  string using SQL
8520: 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74   quoting convent
8530: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ions..**.** See 
8540: 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f  also: output_quo
8550: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
8560: 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ng().*/.static v
8570: 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  oid output_quote
8580: 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  d_string(FILE *o
8590: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
85a0: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  z){.  int i;.  c
85b0: 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61  har c;.  setBina
85c0: 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  ryMode(out, 1);.
85d0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
85e0: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
85f0: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  \''; i++){}.  if
8600: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( c==0 ){.    ut
8610: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27  f8_printf(out,"'
8620: 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65  %s'",z);.  }else
8630: 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
8640: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
8650: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
8660: 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
8670: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
8680: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  '\''; i++){}.   
8690: 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29     if( c=='\'' )
86a0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   i++;.      if( 
86b0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  i ){.        utf
86c0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
86d0: 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20  .*s", i, z);.   
86e0: 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20       z += i;.   
86f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
8700: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
8710: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8720: 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20  , "'");.        
8730: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8740: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
8750: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
8760: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
8770: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   z++;.    }.    
8780: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
8790: 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54  "'");.  }.  setT
87a0: 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  extMode(out, 1);
87b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
87c0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
87d0: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
87e0: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
87f0: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
8800: 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  ns..** Additiona
8810: 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68  llly , escape th
8820: 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20  e "\n" and "\r" 
8830: 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68  characters so th
8840: 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a  at they do not.*
8850: 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20  * get corrupted 
8860: 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74  by end-of-line t
8870: 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c  ranslation facil
8880: 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70  ities in some op
8890: 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
88a0: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ms..**.** This i
88b0: 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75  s like output_qu
88c0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75  oted_string() bu
88d0: 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  t with the addit
88e0: 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a  ion of the \r\n.
88f0: 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e  ** escape mechan
8900: 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ism..*/.static v
8910: 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  oid output_quote
8920: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
8930: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
8940: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
8950: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
8960: 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f   setBinaryMode(o
8970: 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ut, 1);.  for(i=
8980: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
8990: 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63   && c!='\'' && c
89a0: 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72  !='\n' && c!='\r
89b0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
89c0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  c==0 ){.    utf8
89d0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73  _printf(out,"'%s
89e0: 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  '",z);.  }else{.
89f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8a00: 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  zNL = 0;.    con
8a10: 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30  st char *zCR = 0
8a20: 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20  ;.    int nNL = 
8a30: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d  0;.    int nCR =
8a40: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   0;.    char zBu
8a50: 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30  f1[20], zBuf2[20
8a60: 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ];.    for(i=0; 
8a70: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
8a80: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27    if( z[i]=='\n'
8a90: 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20   ) nNL++;.      
8aa0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29  if( z[i]=='\r' )
8ab0: 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   nCR++;.    }.  
8ac0: 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20    if( nNL ){.   
8ad0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8ae0: 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a  t, "replace(");.
8af0: 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73        zNL = unus
8b00: 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c  ed_string(z, "\\
8b10: 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75  n", "\\012", zBu
8b20: 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  f1);.    }.    i
8b30: 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20  f( nCR ){.      
8b40: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
8b50: 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20  "replace(");.   
8b60: 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f     zCR = unused_
8b70: 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c  string(z, "\\r",
8b80: 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29   "\\015", zBuf2)
8b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
8ba0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
8bb0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
8bc0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
8bd0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
8be0: 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21  && c!='\n' && c!
8bf0: 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27  ='\r' && c!='\''
8c00: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69  ; i++){}.      i
8c10: 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b  f( c=='\'' ) i++
8c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b  ;.      if( i ){
8c30: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
8c40: 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22  intf(out, "%.*s"
8c50: 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , i, z);.       
8c60: 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d   z += i;.      }
8c70: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
8c80: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  '' ){.        ra
8c90: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
8ca0: 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ");.        cont
8cb0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
8cc0: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
8cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b       }.      z++
8cf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
8d00: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \n' ){.        r
8d10: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
8d20: 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20  %s", zNL);.     
8d30: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8d40: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
8d50: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
8d60: 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20   zCR);.    }.   
8d70: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8d80: 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e   "'");.    if( n
8d90: 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  CR ){.      raw_
8da0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25  printf(out, ",'%
8db0: 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a  s',char(13))", z
8dc0: 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  CR);.    }.    i
8dd0: 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20  f( nNL ){.      
8de0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
8df0: 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29  ",'%s',char(10))
8e00: 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20  ", zNL);.    }. 
8e10: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
8e20: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
8e30: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
8e40: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
8e50: 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67  quoted according
8e60: 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f   to C or TCL quo
8e70: 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73  ting rules..*/.s
8e80: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
8e90: 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  t_c_string(FILE 
8ea0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
8eb0: 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64   *z){.  unsigned
8ec0: 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28   int c;.  fputc(
8ed0: 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69  '"', out);.  whi
8ee0: 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29  le( (c = *(z++))
8ef0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63  !=0 ){.    if( c
8f00: 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
8f10: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
8f20: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
8f30: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
8f40: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
8f50: 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75    fputc('\\', ou
8f60: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
8f70: 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  '"', out);.    }
8f80: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27  else if( c=='\t'
8f90: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
8fa0: 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  '\\', out);.    
8fb0: 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74    fputc('t', out
8fc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8fd0: 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20   c=='\n' ){.    
8fe0: 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75    fputc('\\', ou
8ff0: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
9000: 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  'n', out);.    }
9010: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27  else if( c=='\r'
9020: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
9030: 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  '\\', out);.    
9040: 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74    fputc('r', out
9050: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
9060: 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66   !isprint(c&0xff
9070: 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ) ){.      raw_p
9080: 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30  rintf(out, "\\%0
9090: 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20  3o", c&0xff);.  
90a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
90b0: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
90c0: 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28    }.  }.  fputc(
90d0: 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a  '"', out);.}../*
90e0: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
90f0: 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68  iven string with
9100: 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
9110: 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a   are special to.
9120: 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e  ** HTML escaped.
9130: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9140: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
9150: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
9160: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9170: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d  int i;.  if( z==
9180: 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68  0 ) z = "";.  wh
9190: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66  ile( *z ){.    f
91a0: 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20  or(i=0;   z[i]. 
91b0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
91c0: 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20  i]!='<'.        
91d0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27      && z[i]!='&'
91e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
91f0: 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20  z[i]!='>'.      
9200: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
9210: 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  \"'.            
9220: 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20  && z[i]!='\'';. 
9230: 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20         i++){}.  
9240: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
9250: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
9260: 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a  ut,"%.*s",i,z);.
9270: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b      }.    if( z[
9280: 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20  i]=='<' ){.     
9290: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
92a0: 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&lt;");.    }el
92b0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27  se if( z[i]=='&'
92c0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
92d0: 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22  intf(out,"&amp;"
92e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
92f0: 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20   z[i]=='>' ){.  
9300: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9310: 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20  ut,"&gt;");.    
9320: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
9330: 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61  '\"' ){.      ra
9340: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71  w_printf(out,"&q
9350: 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  uot;");.    }els
9360: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27  e if( z[i]=='\''
9370: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
9380: 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22  intf(out,"&#39;"
9390: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
93a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
93b0: 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b  .    z += i + 1;
93c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
93d0: 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e   a field contain
93e0: 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20  s any character 
93f0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20  identified by a 
9400: 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  1 in the followi
9410: 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65  ng.** array, the
9420: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73  n the string mus
9430: 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20  t be quoted for 
9440: 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  CSV..*/.static c
9450: 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73  onst char needCs
9460: 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31  vQuote[] = {.  1
9470: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9480: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
9490: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
94a0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
94b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
94c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
94d0: 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20  , 1,.  1, 0, 1, 
94e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20  0, 0, 0, 0, 1,  
94f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9500: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
9510: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9520: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
9530: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
9540: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9550: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
9560: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9570: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
9580: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
9590: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
95a0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
95b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
95c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
95d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
95e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
95f0: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
9600: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31   0, 0, 0, 1,.  1
9610: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9620: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
9630: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9640: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
9650: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
9660: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9670: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
9680: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
9690: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
96a0: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
96b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
96c0: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
96d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
96e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
96f0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
9700: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9710: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
9720: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
9730: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9740: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
9750: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
9760: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9770: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
9780: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9790: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
97a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a   1, 1, 1, 1,.};.
97b0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20  ./*.** Output a 
97c0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43  single term of C
97d0: 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70  SV.  Actually, p
97e0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69  ->colSeparator i
97f0: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68  s used for.** th
9800: 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69  e separator, whi
9810: 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ch may or may no
9820: 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70  t be a comma.  p
9830: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a  ->nullValue is.*
9840: 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65  * the null value
9850: 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71  .  Strings are q
9860: 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61  uoted if necessa
9870: 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74  ry.  The separat
9880: 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73  or.** is only is
9890: 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20  sued if bSep is 
98a0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
98b0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28  void output_csv(
98c0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
98d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
98e0: 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20  t bSep){.  FILE 
98f0: 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20  *out = p->out;. 
9900: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
9910: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
9920: 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c  ,"%s",p->nullVal
9930: 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ue);.  }else{.  
9940: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
9950: 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
9960: 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
9970: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9980: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
9990: 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f    if( needCsvQuo
99a0: 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68  te[((unsigned ch
99b0: 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20  ar*)z)[i]].     
99c0: 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d      || (z[i]==p-
99d0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d  >colSeparator[0]
99e0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
99f0: 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d   (nSep==1 || mem
9a00: 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70  cmp(z, p->colSep
9a10: 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30  arator, nSep)==0
9a20: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  )) ){.        i 
9a30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
9a40: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9a50: 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  }.    if( i==0 )
9a60: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51  {.      char *zQ
9a70: 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  uoted = sqlite3_
9a80: 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22  mprintf("\"%w\""
9a90: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38  , z);.      utf8
9aa0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
9ab0: 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20  ", zQuoted);.   
9ac0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9ad0: 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65  zQuoted);.    }e
9ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
9af0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
9b00: 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , z);.    }.  }.
9b10: 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20    if( bSep ){.  
9b20: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
9b30: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
9b40: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
9b50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9b60: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65  routine runs whe
9b70: 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73 73  n the user press
9b80: 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61  es Ctrl-C.*/.sta
9b90: 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75  tic void interru
9ba0: 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e  pt_handler(int N
9bb0: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
9bc0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
9bd0: 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65  sed);.  seenInte
9be0: 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73  rrupt++;.  if( s
9bf0: 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29  eenInterrupt>2 )
9c00: 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20   exit(1);.  if( 
9c10: 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74  globalDb ) sqlit
9c20: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f  e3_interrupt(glo
9c30: 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28  balDb);.}..#if (
9c40: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
9c50: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
9c60: 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  )) && !defined(_
9c70: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a  WIN32_WCE)./*.**
9c80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
9c90: 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65  ns for console e
9ca0: 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c  vents (e.g. Ctrl
9cb0: 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a  -C) on Win32.*/.
9cc0: 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41  static BOOL WINA
9cd0: 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61  PI ConsoleCtrlHa
9ce0: 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64  ndler(.  DWORD d
9cf0: 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65  wCtrlType /* One
9d00: 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45   of the CTRL_*_E
9d10: 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a  VENT constants *
9d20: 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72  /.){.  if( dwCtr
9d30: 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56  lType==CTRL_C_EV
9d40: 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72  ENT ){.    inter
9d50: 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b  rupt_handler(0);
9d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45  .    return TRUE
9d70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46  ;.  }.  return F
9d80: 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ALSE;.}.#endif..
9d90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9da0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
9db0: 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  N./*.** When the
9dc0: 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73   ".auth ON" is s
9dd0: 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  et, the followin
9de0: 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c  g authorizer cal
9df0: 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f  lback is.** invo
9e00: 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20  ked.  It always 
9e10: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
9e20: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
9e30: 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f   shellAuth(.  vo
9e40: 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
9e50: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
9e60: 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20  st char *zA1,.  
9e70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c  const char *zA2,
9e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9e90: 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  A3,.  const char
9ea0: 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c   *zA4.){.  Shell
9eb0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
9ec0: 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44  lState*)pClientD
9ed0: 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ata;.  static co
9ee0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69  nst char *azActi
9ef0: 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20  on[] = { 0,.    
9f00: 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c   "CREATE_INDEX",
9f10: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
9f20: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  _TABLE",        
9f30: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e   "CREATE_TEMP_IN
9f40: 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41  DEX",.     "CREA
9f50: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20  TE_TEMP_TABLE", 
9f60: 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f     "CREATE_TEMP_
9f70: 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45 41  TRIGGER",  "CREA
9f80: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20  TE_TEMP_VIEW",. 
9f90: 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49 47      "CREATE_TRIG
9fa0: 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52 45  GER",       "CRE
9fb0: 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20  ATE_VIEW",      
9fc0: 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20      "DELETE",.  
9fd0: 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c     "DROP_INDEX",
9fe0: 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50             "DROP
9ff0: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  _TABLE",        
a000: 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e     "DROP_TEMP_IN
a010: 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  DEX",.     "DROP
a020: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20  _TEMP_TABLE",   
a030: 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52     "DROP_TEMP_TR
a040: 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50  IGGER",    "DROP
a050: 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20  _TEMP_VIEW",.   
a060: 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22    "DROP_TRIGGER"
a070: 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f  ,         "DROP_
a080: 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20  VIEW",          
a090: 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20    "INSERT",.    
a0a0: 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20   "PRAGMA",      
a0b0: 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22 2c           "READ",
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20   "SELECT",.     
a0e0: 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20  "TRANSACTION",  
a0f0: 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45 22          "UPDATE"
a100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a110: 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22  "ATTACH",.     "
a120: 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 20  DETACH",        
a130: 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41         "ALTER_TA
a140: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 22  BLE",          "
a150: 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22  REINDEX",.     "
a160: 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20  ANALYZE",       
a170: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56         "CREATE_V
a180: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22  TABLE",        "
a190: 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20  DROP_VTABLE",.  
a1a0: 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20     "FUNCTION",  
a1b0: 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56 45             "SAVE
a1c0: 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20  POINT",         
a1d0: 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a 20     "RECURSIVE". 
a1e0: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   };.  int i;.  c
a1f0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d  onst char *az[4]
a200: 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b  ;.  az[0] = zA1;
a210: 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a  .  az[1] = zA2;.
a220: 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20    az[2] = zA3;. 
a230: 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20   az[3] = zA4;.  
a240: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
a250: 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a  ut, "authorizer:
a260: 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f   %s", azAction[o
a270: 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  p]);.  for(i=0; 
a280: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  i<4; i++){.    r
a290: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
a2a0: 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20  , " ");.    if( 
a2b0: 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f  az[i] ){.      o
a2c0: 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
a2d0: 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20  ->out, az[i]);. 
a2e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2f0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
a300: 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  t, "NULL");.    
a310: 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  }.  }.  raw_prin
a320: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
a330: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a340: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
a350: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63  /*.** Print a sc
a360: 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  hema statement. 
a370: 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65   Part of MODE_Se
a380: 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74  mi and MODE_Pret
a390: 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a  ty output..**.**
a3a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   This routine co
a3b0: 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41  nverts some CREA
a3c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a3d0: 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74  nts for shadow t
a3e0: 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33  ables.** in FTS3
a3f0: 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45  /4/5 into CREATE
a400: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
a410: 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e  ISTS statements.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a430: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
a440: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
a450: 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20   char *z, const 
a460: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
a470: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
a480: 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c  lob("CREATE TABL
a490: 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30  E ['\"]*", z)==0
a4a0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
a4b0: 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45  ntf(out, "CREATE
a4c0: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
a4d0: 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33  ISTS %s%s", z+13
a4e0: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73  , zTail);.  }els
a4f0: 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
a500: 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20  tf(out, "%s%s", 
a510: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d  z, zTail);.  }.}
a520: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
a530: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49  ntSchemaLineN(FI
a540: 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a  LE *out, char *z
a550: 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63  , int n, const c
a560: 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63  har *zTail){.  c
a570: 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20  har c = z[n];.  
a580: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e  z[n] = 0;.  prin
a590: 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c  tSchemaLine(out,
a5a0: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b   z, zTail);.  z[
a5b0: 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n] = c;.}../*.**
a5c0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
a5d0: 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e  string z[] has n
a5e0: 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65  othing but white
a5f0: 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e  space and commen
a600: 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ts to the.** end
a610: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 69   of the first li
a620: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
a630: 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20  t wsToEol(const 
a640: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
a650: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  i;.  for(i=0; z[
a660: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
a670: 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72  ( z[i]=='\n' ) r
a680: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
a690: 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29   IsSpace(z[i]) )
a6a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
a6b0: 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20  f( z[i]=='-' && 
a6c0: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65  z[i+1]=='-' ) re
a6d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
a6e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
a6f0: 72 6e 20 31 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a  rn 1;.}.    ../*
a700: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
a710: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
a720: 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a   that the shell.
a730: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
a740: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
a750: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
a760: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63  atic int shell_c
a770: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
a780: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72  *pArg,.  int nAr
a790: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
a7a0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
a7b0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  lumns */.  char 
a7c0: 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54  **azArg,    /* T
a7d0: 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73 75  ext of each resu
a7e0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
a7f0: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20  har **azCol,    
a800: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
a810: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65  */.  int *aiType
a820: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
a830: 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  types */.){.  in
a840: 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  t i;.  ShellStat
a850: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
a860: 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28  te*)pArg;..  if(
a870: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
a880: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
a890: 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20  p->cMode ){.    
a8a0: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20  case MODE_Line: 
a8b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20  {.      int w = 
a8c0: 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  5;.      if( azA
a8d0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
a8e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a8f0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
a900: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
a910: 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20  rlen30(azCol[i] 
a920: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
a930: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
a940: 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20  n>w ) w = len;. 
a950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a960: 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74   p->cnt++>0 ) ut
a970: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
a980: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
a990: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
a9a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a9b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
a9c0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
a9d0: 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20  t,"%*s = %s%s", 
a9e0: 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  w, azCol[i],.   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
aa00: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
aa10: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c   : p->nullValue,
aa20: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
aa30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
aa40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
aa50: 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c    case MODE_Expl
aa60: 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f  ain:.    case MO
aa70: 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20  DE_Column: {.   
aa80: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
aa90: 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74  int aExplainWidt
aaa0: 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34  hs[] = {4, 13, 4
aab0: 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31  , 4, 4, 13, 2, 1
aac0: 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  3};.      const 
aad0: 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20  int *colWidth;. 
aae0: 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72       int showHdr
aaf0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f  ;.      char *ro
ab00: 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20  wSep;.      if( 
ab10: 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43  p->cMode==MODE_C
ab20: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
ab30: 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63   colWidth = p->c
ab40: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20  olWidth;.       
ab50: 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68   showHdr = p->sh
ab60: 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20  owHeader;.      
ab70: 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f    rowSep = p->ro
ab80: 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20  wSeparator;.    
ab90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aba0: 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70   colWidth = aExp
abb0: 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20  lainWidths;.    
abc0: 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b      showHdr = 1;
abd0: 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20  .        rowSep 
abe0: 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20  = SEP_Row;.     
abf0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
ac00: 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20  cnt++==0 ){.    
ac10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ac20: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
ac30: 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20       int w, n;. 
ac40: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
ac50: 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
ac60: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
ac70: 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74       w = colWidt
ac80: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
ac90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
aca0: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
acb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
acc0: 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20  if( w==0 ){.    
acd0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
ace0: 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20  enChar(azCol[i] 
acf0: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
ad00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
ad10: 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b  ( w<10 ) w = 10;
ad20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
ad30: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
ad40: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
ad50: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
ad60: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
ad70: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
ad80: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
ad90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
ada0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
adb0: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
add0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
ade0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
adf0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f           if( sho
ae00: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
ae10: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
ae20: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
ae30: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
ae40: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ae50: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
ae60: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
ae70: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
ae80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae90: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
aea0: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
aeb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
aec0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
aed0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
aee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
aef0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
af00: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
af10: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
af20: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
af30: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
af40: 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20    if( w<0 ) w = 
af50: 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -w;.            
af60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
af70: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
af80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
af90: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
afa0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e  ntf(p->out,"%-*.
afb0: 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20  *s%s",w,w,.     
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
afd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20  ---------".     
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
b080: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
b090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b0a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b0b0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
b0c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
b0d0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b0e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ){.        int w
b0f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
b100: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
b110: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
b120: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
b130: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
b140: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b150: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
b160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b170: 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d     if( p->cMode=
b180: 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26  =MODE_Explain &&
b190: 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72   azArg[i] && str
b1a0: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
b1b0: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
b1c0: 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   w = strlenChar(
b1d0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
b1e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b1f0: 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e   i==1 && p->aiIn
b200: 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74  dent && p->pStmt
b210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
b220: 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e  ( p->iIndent<p->
b230: 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20  nIndent ){.     
b240: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b250: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73  tf(p->out, "%*.s
b260: 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70  ", p->aiIndent[p
b270: 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b  ->iIndent], "");
b280: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b290: 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e         p->iInden
b2a0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
b2b0: 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74         utf8_widt
b2c0: 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20  h_print(p->out, 
b2d0: 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  w, azArg[i] ? az
b2e0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
b2f0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
b300: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b310: 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72  ut, "%s", i==nAr
b320: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
b330: 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20    ");.      }.  
b340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b350: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53  .    case MODE_S
b360: 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68  emi: {   /* .sch
b370: 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68  ema and .fullsch
b380: 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ema output */.  
b390: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
b3a0: 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ine(p->out, azAr
b3b0: 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  g[0], ";\n");.  
b3c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b3d0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50  .    case MODE_P
b3e0: 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63  retty: {  /* .sc
b3f0: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
b400: 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65  hema with --inde
b410: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  nt */.      char
b420: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a   *z;.      int j
b430: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72  ;.      int nPar
b440: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  en = 0;.      ch
b450: 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20  ar cEnd = 0;.   
b460: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20     char c;.     
b470: 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a   int nLine = 0;.
b480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
b490: 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  rg==1 );.      i
b4a0: 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29  f( azArg[0]==0 )
b4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
b4c0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
b4d0: 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25 22  e("CREATE VIEW%"
b4e0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
b4f0: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
b500: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
b510: 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72  ATE TRIG%", azAr
b520: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
b530: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66    ){.        utf
b540: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b550: 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b   "%s;\n", azArg[
b560: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  0]);.        bre
b570: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b580: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
b590: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
b5a0: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d  g[0]);.      j =
b5b0: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
b5c0: 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  0; IsSpace(z[i])
b5d0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66  ; i++){}.      f
b5e0: 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  or(; (c = z[i])!
b5f0: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
b600: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
b610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
b620: 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29  ( z[j-1]=='\r' )
b630: 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a   z[j-1] = '\n';.
b640: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
b650: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c  Space(z[j-1]) ||
b660: 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63   z[j-1]=='(' ) c
b670: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b680: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
b690: 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26  (' || c==')') &&
b6a0: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
b6b0: 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  z[j-1]) ){.     
b6c0: 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
b6d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b    }.        z[j+
b6e0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
b6f0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
b700: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
b710: 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  1]) ){ j--; }.  
b720: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
b730: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30      if( strlen30
b740: 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20  (z)>=79 ){.     
b750: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63     for(i=j=0; (c
b760: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
b770: 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e  ){  /* Copy chan
b780: 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61  ges from z[i] ba
b790: 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20  ck to z[j] */.  
b7a0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
b7b0: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
b7c0: 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20     cEnd = 0;.   
b7d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b7e0: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c   c=='"' || c=='\
b7f0: 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a  '' || c=='`' ){.
b800: 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64              cEnd
b810: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
b820: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
b830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b840: 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20  cEnd = ']';.    
b850: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b860: 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d  c=='-' && z[i+1]
b870: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
b880: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27       cEnd = '\n'
b890: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b8a0: 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a  e if( c=='(' ){.
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72              nPar
b8c0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
b8d0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27  }else if( c==')'
b8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b8f0: 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20  nParen--;.      
b900: 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e        if( nLine>
b910: 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26  0 && nParen==0 &
b920: 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & j>0 ){.       
b930: 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65         printSche
b940: 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20  maLineN(p->out, 
b950: 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  z, j, "\n");.   
b960: 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30             j = 0
b970: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b980: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b990: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63        z[j++] = c
b9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b9b0: 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e  nParen==1 && cEn
b9c0: 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
b9d0: 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  && (c=='(' || c=
b9e0: 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27  ='\n' || (c==','
b9f0: 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69   && !wsToEol(z+i
ba00: 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  +1))).          
ba10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
ba20: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d  f( c=='\n' ) j--
ba30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
ba40: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70  intSchemaLineN(p
ba50: 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e  ->out, z, j, "\n
ba60: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
ba70: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    j = 0;.       
ba80: 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20       nLine++;.  
ba90: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
baa0: 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29   IsSpace(z[i+1])
bab0: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ i++; }.     
bac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
bad0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20  .        z[j] = 
bae0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
baf0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
bb00: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e  (p->out, z, ";\n
bb10: 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
bb20: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
bb30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bb40: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74    case MODE_List
bb50: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
bb60: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
bb70: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
bb80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bb90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bba0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
bbb0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
bbc0: 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20  ,azCol[i],.     
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d               i==
bbe0: 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53  nArg-1 ? p->rowS
bbf0: 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f  eparator : p->co
bc00: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
bc10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bc20: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
bc30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
bc40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
bc50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
bc60: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
bc70: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
bc80: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75  z==0 ) z = p->nu
bc90: 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  llValue;.       
bca0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bcb0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
bcc0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
bcd0: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
bce0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bcf0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
bd00: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
bd10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bd20: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
bd30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bd40: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
bd50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bd60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
bd70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bd80: 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20  MODE_Html: {.   
bd90: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
bda0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
bdb0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  der ){.        r
bdc0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
bdd0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
bde0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
bdf0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
be00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
be10: 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20  >out,"<TH>");.  
be20: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
be30: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
be40: 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t, azCol[i]);.  
be50: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
be60: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e  tf(p->out,"</TH>
be70: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
be80: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
be90: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
bea0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
beb0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
bec0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
bed0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bee0: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
bef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
bf00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
bf10: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bf20: 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20  t,"<TD>");.     
bf30: 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73     output_html_s
bf40: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
bf50: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
bf60: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
bf70: 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
bf80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
bf90: 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  TD>\n");.      }
bfa0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
bfb0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c  f(p->out,"</TR>\
bfc0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
bfd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bfe0: 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20   MODE_Tcl: {.   
bff0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
c000: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
c010: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
c020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
c030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
c040: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
c050: 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20  p->out,azCol[i] 
c060: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
c070: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 69  ;.          if(i
c080: 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72  <nArg-1) utf8_pr
c090: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c0a0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
c0b0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
c0c0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c0d0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
c0e0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
c0f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c100: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c110: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
c120: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c130: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70  +){.        outp
c140: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
c150: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
c160: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
c170: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
c180: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
c190: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c1a0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
c1b0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
c1c0: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
c1d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
c1e0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
c1f0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
c200: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c210: 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20  MODE_Csv: {.    
c220: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
c230: 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
c240: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
c250: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
c260: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
c270: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
c280: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
c290: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43  utput_csv(p, azC
c2a0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
c2b0: 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29   : "", i<nArg-1)
c2c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c2d0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c2e0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
c2f0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
c300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c310: 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ( nArg>0 ){.    
c320: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c330: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
c340: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
c350: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e  p, azArg[i], i<n
c360: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
c370: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
c380: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c390: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
c3a0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
c3b0: 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28      setTextMode(
c3c0: 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
c3d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c3e0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73     case MODE_Ins
c3f0: 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ert: {.      if(
c400: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
c410: 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  k;.      utf8_pr
c420: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53  intf(p->out,"INS
c430: 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e  ERT INTO %s",p->
c440: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
c450: 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65     if( p->showHe
c460: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
c470: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
c480: 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20  t,"(");.        
c490: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
c4a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
c4b0: 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70   if( i>0 ) raw_p
c4c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c  rintf(p->out, ",
c4d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
c4e0: 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  ( quoteChar(azCo
c4f0: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
c500: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
c510: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
c520: 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69  \"%w\"", azCol[i
c530: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
c540: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c550: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
c560: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c570: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
c580: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c590: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
c5a0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
c5b0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
c5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c5d0: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
c5e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29  intf(p->out,")")
c5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c600: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  p->cnt++;.      
c610: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
c620: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
c630: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
c640: 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20  , i>0 ? "," : " 
c650: 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20  VALUES(");.     
c660: 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d     if( (azArg[i]
c670: 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20  ==0) || (aiType 
c680: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
c690: 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20  LITE_NULL) ){.  
c6a0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
c6b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c  ntf(p->out,"NULL
c6c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
c6d0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
c6e0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
c6f0: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
c700: 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73      if( ShellHas
c710: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
c720: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
c730: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
c740: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
c750: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
c760: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c770: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
c780: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
c790: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
c7a0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c7c0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
c7d0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
c7e0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
c7f0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
c800: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
c810: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
c820: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
c830: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
c840: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  e[i]==SQLITE_FLO
c850: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
c860: 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20  char z[50];.    
c870: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
c880: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c890: 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c  double(p->pStmt,
c8a0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   i);.          s
c8b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c8c0: 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72  50,z,"%!.20g", r
c8d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
c8e0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c8f0: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
c900: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
c910: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
c920: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
c930: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
c940: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
c950: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
c960: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
c970: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
c980: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
c990: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c9a0: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
c9b0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f   i);.          o
c9c0: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70  utput_hex_blob(p
c9d0: 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42  ->out, pBlob, nB
c9e0: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lob);.        }e
c9f0: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
ca00: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
ca10: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
ca20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
ca30: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
ca40: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ca50: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
ca60: 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29   SHFLG_Newlines)
ca70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75   ){.          ou
ca80: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
ca90: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
caa0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
cab0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
cac0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
cad0: 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  aped_string(p->o
cae0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
caf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cb00: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
cb10: 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29  f(p->out,");\n")
cb20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cb30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
cb40: 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20  DE_Quote: {.    
cb50: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
cb60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
cb70: 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70  ( p->cnt==0 && p
cb80: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
cb90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
cba0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
cbb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
cbc0: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
cbd0: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
cbe0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
cbf0: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
cc00: 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t, azCol[i]);.  
cc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cc20: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
cc30: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  t,"\n");.      }
cc40: 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b  .      p->cnt++;
cc50: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cc60: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
cc70: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
cc80: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
cc90: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
cca0: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
ccb0: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
ccc0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ccd0: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
cce0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ccf0: 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29  f(p->out,"NULL")
cd00: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
cd10: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
cd20: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
cd30: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
cd40: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
cd50: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
cd60: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
cd70: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
cd80: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
cd90: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
cda0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
cdb0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cdc0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
cdd0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
cde0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
cdf0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
ce00: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
ce10: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
ce20: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
ce30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ce40: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
ce50: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
ce60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ce70: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
ce80: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   r);.          r
ce90: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
cea0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
ceb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
cec0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ced0: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
cee0: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
cef0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
cf00: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
cf10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
cf20: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
cf30: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
cf40: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
cf50: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
cf60: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
cf70: 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62   output_hex_blob
cf80: 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20  (p->out, pBlob, 
cf90: 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20  nBlob);.        
cfa0: 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62  }else if( isNumb
cfb0: 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20  er(azArg[i], 0) 
cfc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
cfd0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cfe0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
cff0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d000: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
d010: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
d020: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
d030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d040: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
d050: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
d060: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d070: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d080: 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20  ODE_Ascii: {.   
d090: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
d0a0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
d0b0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
d0c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
d0d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d0e0: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
d0f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d100: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
d110: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tor);.          
d120: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d130: 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d  ut,"%s",azCol[i]
d140: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
d150: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d160: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d170: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d180: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
d190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d1a0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
d1b0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
d1c0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
d1d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
d1e0: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
d1f0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
d200: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
d210: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d220: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
d230: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
d240: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
d250: 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue);.      }.   
d260: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d270: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
d280: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
d290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d2a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
d2b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d2c0: 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  is the callback 
d2d0: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65  routine that the
d2e0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a   SQLite library.
d2f0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
d300: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
d310: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
d320: 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63  atic int callbac
d330: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
d340: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
d350: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43  zArg, char **azC
d360: 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20  ol){.  /* since 
d370: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79  we don't have ty
d380: 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68  pe info, call th
d390: 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  e shell_callback
d3a0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
d3b0: 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ue */.  return s
d3c0: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41  hell_callback(pA
d3d0: 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c  rg, nArg, azArg,
d3e0: 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d   azCol, NULL);.}
d3f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
d400: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
d410: 74 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  tine from sqlite
d420: 33 5f 65 78 65 63 28 29 20 74 68 61 74 20 61 70  3_exec() that ap
d430: 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74  pends all.** out
d440: 70 75 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  put onto the end
d450: 20 6f 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20   of a ShellText 
d460: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
d470: 63 20 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74  c int captureOut
d480: 70 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  putCallback(void
d490: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
d4a0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
d4b0: 63 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68  char **az){.  Sh
d4c0: 65 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68  ellText *p = (Sh
d4d0: 65 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20  ellText*)pArg;. 
d4e0: 20 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44   int i;.  UNUSED
d4f0: 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a  _PARAMETER(az);.
d500: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
d510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d520: 20 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65   p->n ) appendTe
d530: 78 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20  xt(p, "|", 0);. 
d540: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
d560: 69 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  i ) appendText(p
d570: 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69  , ",", 0);.    i
d580: 66 28 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70  f( azArg[i] ) ap
d590: 70 65 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72  pendText(p, azAr
d5a0: 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  g[i], 0);.  }.  
d5b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d5c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61  ** Generate an a
d5d0: 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54  ppropriate SELFT
d5e0: 45 53 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65  EST table in the
d5f0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a   main database..
d600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d610: 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62  reateSelftestTab
d620: 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  le(ShellState *p
d630: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  ){.  char *zErrM
d640: 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sg = 0;.  sqlite
d650: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20  3_exec(p->db,.  
d660: 20 20 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c    "SAVEPOINT sel
d670: 66 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20  ftest_init;\n". 
d680: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
d690: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
d6a0: 65 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20  elftest(\n".    
d6b0: 22 20 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50  "  tno INTEGER P
d6c0: 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20  RIMARY KEY,\n"  
d6d0: 20 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20   /* Test number 
d6e0: 2a 2f 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58  */.    "  op TEX
d6f0: 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20  T,\n"           
d700: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
d710: 74 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a  tor:  memo run *
d720: 2f 0a 20 20 20 20 22 20 20 63 6d 64 20 54 45 58  /.    "  cmd TEX
d730: 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20  T,\n"           
d740: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e         /* Comman
d750: 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20  d text */.    " 
d760: 20 61 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20   ans TEXT\n"    
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d780: 2a 20 44 65 73 69 72 65 64 20 61 6e 73 77 65 72  * Desired answer
d790: 20 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20   */.    ");".   
d7a0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
d7b0: 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  BLE [_shell$self
d7c0: 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e  ](op,cmd,ans);\n
d7d0: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
d7e0: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
d7f0: 28 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e  (rowid,op,cmd)\n
d800: 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
d810: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
d820: 20 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f   (max(tno)+100)/
d830: 31 30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  10 FROM selftest
d840: 29 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20  ),10),\n".    " 
d850: 20 20 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27          'memo','
d860: 54 65 73 74 73 20 67 65 6e 65 72 61 74 65 64 20  Tests generated 
d870: 62 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a  by --init');\n".
d880: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
d890: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
d8a0: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
d8b0: 27 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20  'run',\n".    " 
d8c0: 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
d8d0: 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
d8e0: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
d8f0: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52               "FR
d920: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
d930: 20 4f 52 44 45 52 20 42 59 20 32 27 27 2c 32 32   ORDER BY 2'',22
d940: 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  4))',\n".    "  
d950: 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79    hex(sha3_query
d960: 28 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ('SELECT type,na
d970: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
d980: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
d990: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
d9a0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
d9b0: 4f 52 44 45 52 20 42 59 20 32 27 2c 32 32 34 29  ORDER BY 2',224)
d9c0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
d9d0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
d9e0: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
d9f0: 45 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20  ELECT 'run',".  
da00: 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68    "    'SELECT h
da10: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27  ex(sha3_query(''
da20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
da30: 27 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ' ||".    "     
da40: 20 20 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e     printf('%w',n
da50: 61 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20  ame) || '\" NOT 
da60: 49 4e 44 45 58 45 44 27 27 2c 32 32 34 29 29 27  INDEXED'',224))'
da70: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
da80: 78 28 73 68 61 33 5f 71 75 65 72 79 28 70 72 69  x(sha3_query(pri
da90: 6e 74 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52  ntf('SELECT * FR
daa0: 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e  OM \"%w\" NOT IN
dab0: 44 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34  DEXED',name),224
dac0: 29 29 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f  ))\n".    "  FRO
dad0: 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  M (\n".    "    
dae0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
daf0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e   sqlite_master\n
db00: 22 0a 20 20 20 20 22 20 20 20 20 20 57 48 45 52  ".    "     WHER
db10: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e  E type='table'\n
db20: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
db30: 44 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73  D name<>'selftes
db40: 74 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  t'\n".    "     
db50: 20 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72    AND coalesce(r
db60: 6f 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a  ootpage,0)>0\n".
db70: 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20      "  )\n".    
db80: 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  " ORDER BY name;
db90: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
dba0: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
dbb0: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c  f]\n".    "  VAL
dbc0: 55 45 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d  UES('run','PRAGM
dbd0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
dbe0: 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20  k','ok');\n".   
dbf0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65   "INSERT INTO se
dc00: 6c 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d  lftest(tno,op,cm
dc10: 64 2c 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53  d,ans)".    "  S
dc20: 45 4c 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f  ELECT rowid*10,o
dc30: 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b  p,cmd,ans FROM [
dc40: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22  _shell$self];\n"
dc50: 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
dc60: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22   [_shell$self];"
dc70: 0a 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d  .    ,0,0,&zErrM
dc80: 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
dc90: 73 67 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  sg ){.    utf8_p
dca0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
dcb0: 45 4c 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69  ELFTEST initiali
dcc0: 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20  zation failure: 
dcd0: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
dce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dcf0: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  e(zErrMsg);.  }.
dd00: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
dd10: 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73  ->db, "RELEASE s
dd20: 65 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c  elftest_init",0,
dd30: 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  0,0);.}.../*.** 
dd40: 53 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74  Set the destinat
dd50: 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20  ion table field 
dd60: 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  of the ShellStat
dd70: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  e structure to.*
dd80: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
dd90: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20  e table given.  
dda0: 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65  Escape any quote
ddb0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
ddc0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65  he.** table name
ddd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dde0: 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
ddf0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
de00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
de10: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
de20: 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20   char cQuote;.  
de30: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
de40: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b  p->zDestTable ){
de50: 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65  .    free(p->zDe
de60: 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d  stTable);.    p-
de70: 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b  >zDestTable = 0;
de80: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
de90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
dea0: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
deb0: 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  ar(zName);.  n =
dec0: 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29   strlen30(zName)
ded0: 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29  ;.  if( cQuote )
dee0: 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d   n += n+2;.  z =
def0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
df00: 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a   malloc( n+1 );.
df10: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
df20: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
df30: 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20  err,"Error: out 
df40: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
df50: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
df60: 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    n = 0;.  if( c
df70: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
df80: 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69   cQuote;.  for(i
df90: 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
dfa0: 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
dfb0: 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
dfc0: 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75  f( zName[i]==cQu
dfd0: 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
dfe0: 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Quote;.  }.  if(
dff0: 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
e000: 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e   = cQuote;.  z[n
e010: 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
e020: 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
e030: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
e040: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
e050: 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
e060: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
e070: 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
e080: 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
e090: 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
e0a0: 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
e0b0: 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
e0c0: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
e0d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
e0e0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
e0f0: 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
e100: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
e110: 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
e120: 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
e130: 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
e140: 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
e150: 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d  way, if a.** "--
e160: 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73  " comment occurs
e170: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
e180: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
e190: 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e  e comment.** won
e1a0: 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73  't consume the s
e1b0: 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
e1c0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
e1d0: 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d  nt run_table_dum
e1e0: 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
e1f0: 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
e200: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e      /* Query con
e210: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
e220: 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20  char *zSelect,  
e230: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
e240: 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63  tement to extrac
e250: 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63  t content */.  c
e260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73  onst char *zFirs
e270: 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74  tRow    /* Print
e280: 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f   before first ro
e290: 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  w, if not NULL *
e2a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
e2b0: 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20  tmt *pSelect;.  
e2c0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
e2d0: 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
e2e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
e2f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
e300: 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
e310: 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26  , zSelect, -1, &
e320: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
e330: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e340: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a   || !pSelect ){.
e350: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e360: 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
e370: 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
e380: 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e3a0: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
e3b0: 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
e3c0: 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
e3d0: 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
e3e0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ++;.    return r
e3f0: 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
e400: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
e410: 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  ct);.  nResult =
e420: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e430: 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a  count(pSelect);.
e440: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
e450: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
e460: 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a  f( zFirstRow ){.
e470: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e480: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e490: 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
e4a0: 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
e4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
e4c0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
e4d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
e4e0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
e4f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e500: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e510: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52     for(i=1; i<nR
e520: 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
e530: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e540: 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71  ->out, ",%s", sq
e550: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
e560: 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a  t(pSelect, i));.
e570: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
e580: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
e590: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
e5a0: 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
e5b0: 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
e5c0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
e5d0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e5e0: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
e5f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e600: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e610: 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20  ->out, ";\n");. 
e620: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
e630: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
e640: 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
e650: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
e660: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
e670: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e680: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
e690: 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
e6a0: 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
e6b0: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e6d0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
e6e0: 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
e6f0: 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
e700: 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
e710: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
e720: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e730: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  Allocate space a
e740: 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72  nd save off curr
e750: 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67  ent error string
e760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
e770: 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a   *save_err_msg(.
e780: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20    sqlite3 *db   
e790: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e7a0: 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
e7b0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73  .){.  int nErrMs
e7c0: 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73  g = 1+strlen30(s
e7d0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
e7e0: 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ));.  char *zErr
e7f0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Msg = sqlite3_ma
e800: 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b  lloc64(nErrMsg);
e810: 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
e820: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
e830: 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
e840: 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
e850: 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
e860: 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66   zErrMsg;.}..#if
e870: 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
e880: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  .** Attempt to d
e890: 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73  isplay I/O stats
e8a0: 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20   on Linux using 
e8b0: 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a  /proc/PID/io.*/.
e8c0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
e8d0: 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
e8e0: 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49  FILE *out){.  FI
e8f0: 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a  LE *in;.  char z
e900: 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
e910: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
e920: 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25  (z), z, "/proc/%
e930: 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29  d/io", getpid())
e940: 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
e950: 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
e960: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
e970: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c   while( fgets(z,
e980: 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21   sizeof(z), in)!
e990: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
e9a0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
e9b0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e9c0: 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20   *zPattern;.    
e9d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
e9e0: 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e  esc;.    } aTran
e9f0: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
ea00: 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "rchar: ",      
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
ea20: 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72  es received by r
ea30: 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20  ead():" },.     
ea40: 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20   { "wchar: ",   
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ea60: 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72  Bytes sent to wr
ea70: 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20  ite():"    },.  
ea80: 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c      { "syscr: ",
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d    "Read() system
eab0: 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c   calls:"      },
eac0: 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a  .      { "syscw:
ead0: 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
eae0: 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79       "Write() sy
eaf0: 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
eb00: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61   },.      { "rea
eb10: 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  d_bytes: ",     
eb20: 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
eb30: 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65  ead from storage
eb40: 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  :"  },.      { "
eb50: 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
eb60: 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
eb70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f  s written to sto
eb80: 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20  rage:" },.      
eb90: 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69  { "cancelled_wri
eba0: 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43  te_bytes: ",  "C
ebb0: 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62  ancelled write b
ebc0: 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20  ytes:"    },.   
ebd0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
ebe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
ebf0: 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b  raySize(aTrans);
ec00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ec10: 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54   n = strlen30(aT
ec20: 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
ec30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
ec40: 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
ec50: 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
ec60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
ec70: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
ec80: 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73  -36s %s", aTrans
ec90: 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d  [i].zDesc, &z[n]
eca0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
ecb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ecc0: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
ecd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
ece0: 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67  * Display a sing
ecf0: 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75  le line of statu
ed00: 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76  s using 64-bit v
ed10: 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
ed20: 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61   void displaySta
ed30: 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74  tLine(.  ShellSt
ed40: 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
ed50: 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20     /* The shell 
ed60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61  context */.  cha
ed70: 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
ed80: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
ed90: 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e  for this one lin
eda0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f  e */.  char *zFo
edb0: 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20  rmat,           
edc0: 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74   /* Format for t
edd0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
ede0: 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20  nt iStatusCtrl, 
edf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
ee00: 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70  h status to disp
ee10: 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  lay */.  int bRe
ee20: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
ee30: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
ee40: 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
ee50: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
ee60: 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  t64 iCur = -1;. 
ee70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
ee80: 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Hiwtr = -1;.  in
ee90: 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20  t i, nPercent;. 
eea0: 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d   char zLine[200]
eeb0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
eec0: 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c  us64(iStatusCtrl
eed0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
eee0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72  , bReset);.  for
eef0: 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30  (i=0, nPercent=0
ef00: 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b  ; zFormat[i]; i+
ef10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72  +){.    if( zFor
ef20: 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50  mat[i]=='%' ) nP
ef30: 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  ercent++;.  }.  
ef40: 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29  if( nPercent>1 )
ef50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
ef60: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
ef70: 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
ef80: 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77  rmat, iCur, iHiw
ef90: 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tr);.  }else{.  
efa0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
efb0: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
efc0: 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
efd0: 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20  , iHiwtr);.  }. 
efe0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
eff0: 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
f000: 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29  , zLabel, zLine)
f010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
f020: 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e  ay memory stats.
f030: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
f040: 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20  isplay_stats(.  
f050: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
f070: 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
f080: 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
f090: 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
f0a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
f0b0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
f0c0: 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f0e0: 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
f0f0: 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69   stats */.){.  i
f100: 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
f110: 48 69 77 74 72 3b 0a 0a 20 20 69 66 28 20 70 41  Hiwtr;..  if( pA
f120: 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20  rg && pArg->out 
f130: 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  ){.    displaySt
f140: 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65  atLine(pArg, "Me
f150: 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20  mory Used:",.   
f160: 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
f170: 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
f180: 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
f190: 59 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  Y_USED, bReset);
f1a0: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
f1b0: 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
f1c0: 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e  er of Outstandin
f1d0: 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c  g Allocations:",
f1e0: 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  .       "%lld (m
f1f0: 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54  ax %lld)", SQLIT
f200: 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
f210: 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a  COUNT, bReset);.
f220: 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
f230: 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
f240: 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20  Pagecache ){.   
f250: 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
f260: 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
f270: 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73   of Pcache Pages
f280: 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20   Used:",.       
f290: 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
f2a0: 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54  d) pages", SQLIT
f2b0: 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
f2c0: 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29  HE_USED, bReset)
f2d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73 70  ;.    }.    disp
f2e0: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
f2f0: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61  , "Number of Pca
f300: 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  che Overflow Byt
f310: 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  es:",.       "%l
f320: 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79  ld (max %lld) by
f330: 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
f340: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
f350: 45 52 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b  ERFLOW, bReset);
f360: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
f370: 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
f380: 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22  est Allocation:"
f390: 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 62  ,.       "%lld b
f3a0: 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
f3b0: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45  ATUS_MALLOC_SIZE
f3c0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 64  , bReset);.    d
f3d0: 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
f3e0: 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63  Arg, "Largest Pc
f3f0: 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a  ache Allocation:
f400: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
f410: 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
f420: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
f430: 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23  SIZE, bReset);.#
f440: 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58  ifdef YYTRACKMAX
f450: 53 54 41 43 4b 44 45 50 54 48 0a 20 20 20 20 64  STACKDEPTH.    d
f460: 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
f470: 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61  Arg, "Deepest Pa
f480: 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20  rser Stack:",.  
f490: 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
f4a0: 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
f4b0: 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41  TATUS_PARSER_STA
f4c0: 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e  CK, bReset);.#en
f4d0: 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
f4e0: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74  Arg && pArg->out
f4f0: 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 69 66   && db ){.    if
f500: 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67  ( pArg->shellFlg
f510: 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  s & SHFLG_Lookas
f520: 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48 69  ide ){.      iHi
f530: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
f540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
f550: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
f560: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
f570: 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20 20  KASIDE_USED,.   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
f5a0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
f5b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f5c0: 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20  Arg->out,.      
f5d0: 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69          "Lookasi
f5e0: 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20 20  de Slots Used:  
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
f600: 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20   (max %d)\n",.  
f610: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
f620: 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20  , iHiwtr);.     
f630: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
f640: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
f650: 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
f660: 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20  _HIT,.          
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
f680: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
f690: 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
f6a0: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
f6b0: 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c  t, "Successful l
f6c0: 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74  ookaside attempt
f6d0: 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a  s:       %d\n",.
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48                iH
f6f0: 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  iwtr);.      sql
f700: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
f710: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
f720: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53  US_LOOKASIDE_MIS
f730: 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  S_SIZE,.        
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
f760: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
f770: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
f780: 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20  out, "Lookaside 
f790: 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20  failures due to 
f7a0: 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e 22  size:      %d\n"
f7b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f7c0: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73  iHiwtr);.      s
f7d0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
f7e0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
f7f0: 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d  ATUS_LOOKASIDE_M
f800: 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20  ISS_FULL,.      
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
f830: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
f840: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f850: 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
f860: 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
f870: 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c  o OOM:       %d\
f880: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
f890: 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d    iHiwtr);.    }
f8a0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
f8b0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
f8c0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
f8d0: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
f8e0: 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26  US_CACHE_USED, &
f8f0: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
f900: 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
f910: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
f920: 2c 20 22 50 61 67 65 72 20 48 65 61 70 20 55 73  , "Pager Heap Us
f930: 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
f940: 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
f950: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f960: 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
f970: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
f980: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
f990: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
f9a0: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
f9b0: 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69  HIT, &iCur, &iHi
f9c0: 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
f9d0: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
f9e0: 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68  t, "Page cache h
f9f0: 69 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  its:            
fa00: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
fa10: 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
fa20: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
fa30: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
fa40: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
fa50: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d  DBSTATUS_CACHE_M
fa60: 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69  ISS, &iCur, &iHi
fa70: 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
fa80: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
fa90: 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d  t, "Page cache m
faa0: 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20  isses:          
fab0: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
fac0: 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
fad0: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
fae0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
faf0: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
fb00: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57  DBSTATUS_CACHE_W
fb10: 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48  RITE, &iCur, &iH
fb20: 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
fb30: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
fb40: 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
fb50: 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20  writes:         
fb60: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
fb70: 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
fb80: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
fb90: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
fba0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
fbb0: 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41  _DBSTATUS_SCHEMA
fbc0: 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
fbd0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
fbe0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
fbf0: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d  Arg->out, "Schem
fc00: 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  a Heap Usage:   
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
fc30: 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
fc40: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
fc50: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
fc60: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
fc70: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
fc80: 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69 43  S_STMT_USED, &iC
fc90: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
fca0: 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
fcb0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
fcc0: 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70 2f  "Statement Heap/
fcd0: 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65 3a  Lookaside Usage:
fce0: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
fcf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
fd00: 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
fd10: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f   pArg && pArg->o
fd20: 75 74 20 26 26 20 64 62 20 26 26 20 70 41 72 67  ut && db && pArg
fd30: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ->pStmt ){.    i
fd40: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
fd50: 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
fd60: 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
fd70: 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
fd80: 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20  N_STEP,.        
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 20 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a         bReset);.
fdb0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
fdc0: 41 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73  Arg->out, "Fulls
fdd0: 63 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20  can Steps:      
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
fe00: 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
fe10: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
fe20: 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
fe30: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
fe40: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
fe50: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
fe60: 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61  out, "Sort Opera
fe70: 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20  tions:          
fe80: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
fe90: 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
fea0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
feb0: 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
fec0: 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
fed0: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
fee0: 2c 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61  ,bReset);.    ra
fef0: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
ff00: 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49  ut, "Autoindex I
ff10: 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20  nserts:         
ff20: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
ff30: 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
ff40: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
ff50: 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
ff60: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
ff70: 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62  TATUS_VM_STEP, b
ff80: 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
ff90: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
ffa0: 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69  , "Virtual Machi
ffb0: 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  ne Steps:       
ffc0: 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
ffd0: 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  Cur);.  }..#ifde
ffe0: 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69  f __linux__.  di
fff0: 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
10000 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65  s(pArg->out);.#e
10010 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ndif..  /* Do no
10020 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61  t remove this ma
10030 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63  chine readable c
10040 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74  omment: extra-st
10050 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20  ats-output-here 
10060 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  */..  return 0;.
10070 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
10080 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a   scan stats..*/.
10090 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
100a0 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20  lay_scanstats(. 
100b0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
100e0 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c  query */.  Shell
100f0 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20 20  State *pArg     
10100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10110 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
10120 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ate */.){.#ifnde
10130 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10140 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10160 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
10170 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29  _PARAMETER(pArg)
10180 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c  ;.#else.  int i,
10190 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77   k, n, mx;.  raw
101a0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
101b0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61  t, "-------- sca
101c0 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c  nstats --------\
101d0 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20  n");.  mx = 0;. 
101e0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b   for(k=0; k<=mx;
101f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c   k++){.    doubl
10200 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30  e rEstLoop = 1.0
10210 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
10220 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20   1; i++){.      
10230 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20  sqlite3_stmt *p 
10240 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20  = pArg->pStmt;. 
10250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
10260 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74  64 nLoop, nVisit
10270 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  ;.      double r
10280 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Est;.      int i
10290 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Sid;.      const
102a0 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
102b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
102c0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
102d0 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
102e0 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20  SCANSTAT_NLOOP, 
102f0 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29  (void*)&nLoop) )
10300 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
10310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10320 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
10330 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
10340 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c  ITE_SCANSTAT_SEL
10350 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69  ECTID, (void*)&i
10360 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sid);.      if( 
10370 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69  iSid>mx ) mx = i
10380 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Sid;.      if( i
10390 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75  Sid!=k ) continu
103a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  e;.      if( n==
103b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73  0 ){.        rEs
103c0 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29  tLoop = (double)
103d0 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  nLoop;.        i
103e0 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69  f( k>0 ) raw_pri
103f0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
10400 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72  -------- subquer
10410 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  y %d -------\n",
10420 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   k);.      }.   
10430 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71     n++;.      sq
10440 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
10450 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
10460 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53  TE_SCANSTAT_NVIS
10470 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73  IT, (void*)&nVis
10480 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
10490 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
104a0 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
104b0 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76  SCANSTAT_EST, (v
104c0 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20  oid*)&rEst);.   
104d0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
104e0 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
104f0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
10500 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a  _EXPLAIN, (void*
10510 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  )&zExplain);.   
10520 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10530 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20  Arg->out, "Loop 
10540 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a  %2d: %s\n", n, z
10550 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
10560 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74  rEstLoop *= rEst
10570 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
10580 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20  tf(pArg->out,.  
10590 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
105a0 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e    nLoop=%-8lld n
105b0 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f  Row=%-8lld estRo
105c0 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f  w=%-8lld estRow/
105d0 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20  Loop=%-8g\n",.  
105e0 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e          nLoop, n
105f0 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f  Visit, (sqlite3_
10600 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b  int64)(rEstLoop+
10610 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20  0.5), rEst.     
10620 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
10630 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
10640 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d  >out, "---------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d  --\n");.#endif.}
10670 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
10680 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73  r azArray points
10690 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69   to a zero-termi
106a0 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 73  nated array of s
106b0 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20  trings. zStr.** 
106c0 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67  points to a sing
106d0 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  le nul-terminate
106e0 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e  d string. Return
106f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74   non-zero if zSt
10700 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61  r.** is equal, a
10710 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63  ccording to strc
10720 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20  mp(), to any of 
10730 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74  the strings in t
10740 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68  he array..** Oth
10750 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a  erwise, return z
10760 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
10770 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  nt str_in_array(
10780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
10790 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
107a0 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69  zArray){.  int i
107b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41  ;.  for(i=0; azA
107c0 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  rray[i]; i++){. 
107d0 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
107e0 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69  (zStr, azArray[i
107f0 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ]) ) return 1;. 
10800 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
10810 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69  ../*.** If compi
10820 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53  led statement pS
10830 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ql appears to be
10840 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
10850 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a  ement, allocate.
10860 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  ** and populate 
10870 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61  the ShellState.a
10880 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20  iIndent[] array 
10890 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20  with the number 
108a0 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63  of.** spaces eac
108b0 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20  h opcode should 
108c0 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f  be indented befo
108d0 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e  re it is output.
108e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e  .**.** The inden
108f0 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a  ting rules are:.
10900 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20  **.**     * For 
10910 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72  each "Next", "Pr
10920 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20  ev", "VNext" or 
10930 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63 74  "VPrev" instruct
10940 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20  ion, indent.**  
10950 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73       all opcodes
10960 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74 77   that occur betw
10970 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20  een the p2 jump 
10980 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20  destination and 
10990 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20  the opcode.**   
109a0 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32 20      itself by 2 
109b0 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  spaces..**.**   
109c0 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f    * For each "Go
109d0 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70  to", if the jump
109e0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
109f0 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70  earlier in the p
10a00 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20  rogram.**       
10a10 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20  and ends on one 
10a20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  of:.**          
10a30 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53  Yield  SeekGt  S
10a40 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61  eekLt  RowSetRea
10a50 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20  d  Rewind.**    
10a60 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31 20     or if the P1 
10a70 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65  parameter is one
10a80 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f   instead of zero
10a90 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20  ,.**       then 
10aa0 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64  indent all opcod
10ab0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  es between the e
10ac0 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69  arlier instructi
10ad0 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  on.**       and 
10ae0 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63  "Goto" by 2 spac
10af0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10b00 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
10b10 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61  prepare(ShellSta
10b20 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73  te *p, sqlite3_s
10b30 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f  tmt *pSql){.  co
10b40 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b60 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
10b70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
10b80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10b90 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
10ba0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63      /* Used to c
10bb0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
10bc0 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20  an EXPLAIN */.  
10bd0 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30  int *abYield = 0
10be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10bf0 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69 73  /* True if op is
10c00 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a   an OP_Yield */.
10c10 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
10c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
10c40 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65  ize of p->aiInde
10c50 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f  nt[], abYield */
10c60 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20  .  int iOp;     
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f     /* Index of o
10c90 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61  peration in p->a
10ca0 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20  iIndent[] */..  
10cb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65  const char *azNe
10cc0 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c  xt[] = { "Next",
10cd0 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76 22   "Prev", "VPrev"
10ce0 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74  , "VNext", "Sort
10cf0 65 72 4e 65 78 74 22 2c 0a 20 20 20 20 20 20 20  erNext",.       
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 20 20 22 4e 65 78 74 49 66 4f 70 65 6e 22      "NextIfOpen"
10d20 2c 20 22 50 72 65 76 49 66 4f 70 65 6e 22 2c 20  , "PrevIfOpen", 
10d30 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
10d40 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b  r *azYield[] = {
10d50 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c   "Yield", "SeekL
10d60 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52  T", "SeekGT", "R
10d70 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20  owSetRead",.    
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 20 20 20 22 52 65 77 69 6e 64 22          "Rewind"
10da0 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
10db0 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20  har *azGoto[] = 
10dc0 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a  { "Goto", 0 };..
10dd0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75    /* Try to figu
10de0 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69  re out if this i
10df0 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c  s really an EXPL
10e00 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  AIN statement. I
10e10 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e  f this.  ** cann
10e20 6f 74 20 62 65 20 76 65 72 69 66 69 65 64 2c 20  ot be verified, 
10e30 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a  return early.  *
10e40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
10e50 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71  column_count(pSq
10e60 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e  l)!=8 ){.    p->
10e70 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
10e80 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10e90 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
10ea0 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69  3_sql(pSql);.  i
10eb0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
10ec0 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71  urn;.  for(z=zSq
10ed0 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  l; *z==' ' || *z
10ee0 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\t' || *z=='\
10ef0 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c  n' || *z=='\f' |
10f00 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29  | *z=='\r'; z++)
10f10 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
10f20 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70  strnicmp(z, "exp
10f30 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20  lain", 7) ){.   
10f40 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
10f50 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ode;.    return;
10f60 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d  .  }..  for(iOp=
10f70 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
10f80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
10f90 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69  ); iOp++){.    i
10fa0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41  nt i;.    int iA
10fb0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ddr = sqlite3_co
10fc0 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30  lumn_int(pSql, 0
10fd0 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
10fe0 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
10ff0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
11000 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
11010 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  1);..    /* Set 
11020 70 32 20 74 6f 20 74 68 65 20 50 32 20 66 69 65  p2 to the P2 fie
11030 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
11040 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20  t opcode. Then, 
11050 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20  assuming that.  
11060 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e    ** p2 is an in
11070 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
11080 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65 20  s, set variable 
11090 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65  p2op to the inde
110a0 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a  x of that.    **
110b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
110c0 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61  the aiIndent[] a
110d0 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f  rray. p2 and p2o
110e0 70 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  p may be differe
110f0 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  nt if.    ** the
11100 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63   current instruc
11110 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
11120 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65  a sub-program ge
11130 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20  nerated by an.  
11140 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72    ** SQL trigger
11150 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e   or foreign key.
11160 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20    */.    int p2 
11170 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
11180 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  _int(pSql, 3);. 
11190 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70     int p2op = (p
111a0 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29  2 + (iOp-iAddr))
111b0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
111c0 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61  he p->aiIndent a
111d0 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65 64  rray as required
111e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e   */.    if( iOp>
111f0 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
11200 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20   if( iOp==0 ){. 
11210 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72         /* Do fur
11220 74 68 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e  ther verfication
11230 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 78   that this is ex
11240 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41  plain output.  A
11250 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20 20 20  bort if.        
11260 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a  ** it is not */.
11270 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
11280 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61  onst char *expla
11290 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20  inCols[] = {.   
112a0 20 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20          "addr", 
112b0 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
112c0 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22  "p2", "p3", "p4"
112d0 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74  , "p5", "comment
112e0 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  " };.        int
112f0 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   jj;.        for
11300 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53  (jj=0; jj<ArrayS
11310 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29  ize(explainCols)
11320 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
11330 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71     if( strcmp(sq
11340 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
11350 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61  e(pSql,jj),expla
11360 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29  inCols[jj])!=0 )
11370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
11380 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
11390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
113a0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
113b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
113c0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
113d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
113e0 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f     }.      nAllo
113f0 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  c += 100;.      
11400 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69  p->aiIndent = (i
11410 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
11420 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e  loc64(p->aiInden
11430 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t, nAlloc*sizeof
11440 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 61 62  (int));.      ab
11450 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71  Yield = (int*)sq
11460 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
11470 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a  abYield, nAlloc*
11480 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
11490 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b    }.    abYield[
114a0 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72  iOp] = str_in_ar
114b0 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64  ray(zOp, azYield
114c0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  );.    p->aiInde
114d0 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20  nt[iOp] = 0;.   
114e0 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f   p->nIndent = iO
114f0 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74  p+1;..    if( st
11500 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
11510 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20  azNext) ){.     
11520 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69   for(i=p2op; i<i
11530 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e  Op; i++) p->aiIn
11540 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20  dent[i] += 2;.  
11550 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f    }.    if( str_
11560 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
11570 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d  Goto) && p2op<p-
11580 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26  >nIndent.     &&
11590 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20   (abYield[p2op] 
115a0 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
115b0 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a  n_int(pSql, 2)).
115c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72      ){.      for
115d0 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
115e0 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
115f0 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
11600 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e    }..  p->iInden
11610 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
11620 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a  _free(abYield);.
11630 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
11640 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pSql);.}../*.** 
11650 46 72 65 65 20 74 68 65 20 61 72 72 61 79 20 61  Free the array a
11660 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c  llocated by expl
11670 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
11680 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
11690 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
116a0 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74  delete(ShellStat
116b0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
116c0 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e  _free(p->aiInden
116d0 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e  t);.  p->aiInden
116e0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64  t = 0;.  p->nInd
116f0 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49  ent = 0;.  p->iI
11700 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ndent = 0;.}../*
11710 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20  .** Disable and 
11720 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72  restore .wheretr
11730 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74  ace and .selectt
11740 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a  race settings..*
11750 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
11760 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
11770 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
11780 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
11790 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
117a0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
117b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
117c0 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65  dSelectTrace;.#e
117d0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
117e0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
117f0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
11800 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
11810 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
11820 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
11830 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
11840 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
11850 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64  ndif.static void
11860 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74   disable_debug_t
11870 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29  race_modes(void)
11880 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
11890 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
118a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
118b0 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
118c0 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63 74 54  ).  savedSelectT
118d0 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65  race = sqlite3Se
118e0 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c  lectTrace;.  sql
118f0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
11900 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
11910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11920 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
11930 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
11940 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 61 76  HERETRACE).  sav
11950 65 64 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  edWhereTrace = s
11960 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
11970 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
11980 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
11990 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f.}.static void 
119a0 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
119b0 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b  ace_modes(void){
119c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
119d0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
119e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
119f0 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
11a00 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11a10 54 72 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c  Trace = savedSel
11a20 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
11a30 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
11a40 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
11a50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
11a60 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
11a70 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
11a80 61 63 65 20 3d 20 73 61 76 65 64 57 68 65 72 65  ace = savedWhere
11a90 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Trace;.#endif.}.
11aa0 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65  ./*.** Run a pre
11ab0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
11ac0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
11ad0 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
11ae0 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  t(.  ShellState 
11af0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11b20 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
11b30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
11b40 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20   *pStmt,        
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74       /* Statment
11b70 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74   to run */.  int
11b80 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
11b90 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63  id*,int,char**,c
11ba0 68 61 72 2a 2a 2c 69 6e 74 2a 29 20 20 20 2f 2a  har**,int*)   /*
11bb0 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
11bc0 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  on */.){.  int r
11bd0 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d  c;..  /* perform
11be0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e   the first step.
11bf0 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c    this will tell
11c00 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68   us if we.  ** h
11c10 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
11c20 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20   or not and how 
11c30 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f  wide it is..  */
11c40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
11c50 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f  step(pStmt);.  /
11c60 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72  * if we have a r
11c70 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a  esult set... */.
11c80 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
11c90 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a   == rc ){.    /*
11ca0 20 69 66 20 77 65 20 68 61 76 65 20 61 20 63 61   if we have a ca
11cb0 6c 6c 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20  llback... */.   
11cc0 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 20 29   if( xCallback )
11cd0 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
11ce0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f  ate space for co
11cf0 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75  l name ptr, valu
11d00 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20  e ptr, and type 
11d10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  */.      int nCo
11d20 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
11d30 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
11d40 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
11d50 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
11d60 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a  loc64(3*nCol*siz
11d70 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  eof(const char*)
11d80 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28   + 1);.      if(
11d90 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20   !pData ){.     
11da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11db0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
11dc0 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
11dd0 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72  **azCols = (char
11de0 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20   **)pData;      
11df0 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75  /* Names of resu
11e00 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
11e10 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56        char **azV
11e20 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43  als = &azCols[nC
11e30 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  ol];       /* Re
11e40 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  sults */.       
11e50 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20   int *aiTypes = 
11e60 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e  (int *)&azVals[n
11e70 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20  Col]; /* Result 
11e80 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
11e90 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 20   int i, x;.     
11ea0 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
11eb0 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28  (int) <= sizeof(
11ec0 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20 20  char *));.      
11ed0 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74    /* save off pt
11ee0 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  rs to column nam
11ef0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  es */.        fo
11f00 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11f10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
11f20 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zCols[i] = (char
11f30 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
11f40 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  n_name(pStmt, i)
11f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11f60 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
11f70 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65    /* extract the
11f80 20 64 61 74 61 20 61 6e 64 20 64 61 74 61 20 74   data and data t
11f90 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ypes */.        
11fa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
11fb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
11fc0 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20       aiTypes[i] 
11fd0 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  = x = sqlite3_co
11fe0 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
11ff0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
12000 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42   if( x==SQLITE_B
12010 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70  LOB && pArg && p
12020 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
12030 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20  _Insert ){.     
12040 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
12050 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  i] = "";.       
12060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12070 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73            azVals
12080 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  [i] = (char*)sql
12090 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
120a0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
120b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
120c0 20 20 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c        if( !azVal
120d0 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65 73  s[i] && (aiTypes
120e0 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  [i]!=SQLITE_NULL
120f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
12100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12110 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
12120 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72      break; /* fr
12130 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  om for */.      
12140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12150 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a    } /* end for *
12160 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  /..          /* 
12170 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70 65  if data and type
12180 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63 63  s extracted succ
12190 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20  essfully... */. 
121a0 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c           if( SQL
121b0 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
121c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
121d0 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65  call the supplie
121e0 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  d callback with 
121f0 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64  the result row d
12200 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ata */.         
12210 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b     if( xCallback
12220 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56  (pArg, nCol, azV
12230 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54  als, azCols, aiT
12240 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ypes) ){.       
12250 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
12260 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20  TE_ABORT;.      
12270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12280 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
12290 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
122a0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mt);.           
122b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
122c0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
122d0 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
122e0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
122f0 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
12300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
12310 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  se{.      do{.  
12320 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12330 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
12340 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 72        } while( r
12350 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20  c == SQLITE_ROW 
12360 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
12370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12380 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
123a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
123b0 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69 66  o process SQL if
123c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 68   the previous sh
123d0 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77  ell command.** w
123e0 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49 74  as ".expert". It
123f0 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c 20   passes the SQL 
12400 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
12410 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20  gument directly 
12420 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  to.** the sqlite
12430 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a  3expert object..
12440 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
12450 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
12460 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12470 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
12480 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
12490 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
124a0 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
124b0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
124c0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
124d0 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
124e0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
124f0 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
12500 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
12510 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
12520 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
12530 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
12540 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
12550 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
12560 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64 6c   int expertHandl
12570 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61  eSQL(.  ShellSta
12580 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20 63  te *pState, .  c
12590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
125a0 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
125b0 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 53  .){.  assert( pS
125c0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
125d0 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74  pert );.  assert
125e0 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  ( pzErr==0 || *p
125f0 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74  zErr==0 );.  ret
12600 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70 65  urn sqlite3_expe
12610 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e 65  rt_sql(pState->e
12620 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 7a  xpert.pExpert, z
12630 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Sql, pzErr);.}..
12640 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12650 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65 69  ion is called ei
12660 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79  ther to silently
12670 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f 62   clean up the ob
12680 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64 20  ject.** created 
12690 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74 22  by the ".expert"
126a0 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43 61   command (if bCa
126b0 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20  ncel==1), or to 
126c0 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20 72  generate a .** r
126d0 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61 6e  eport from it an
126e0 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74 20  d then clean it 
126f0 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  up (if bCancel==
12700 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  0)..**.** If suc
12710 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
12720 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
12730 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
12740 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
12750 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
12760 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
12770 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
12780 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
12790 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
127a0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
127b0 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
127c0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
127d0 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
127e0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
127f0 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
12800 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
12810 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
12820 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 46  atic int expertF
12830 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53 74  inish(.  ShellSt
12840 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20 69  ate *pState,.  i
12850 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68  nt bCancel,.  ch
12860 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
12870 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12880 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  OK;.  sqlite3exp
12890 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65 2d  ert *p = pState-
128a0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3b  >expert.pExpert;
128b0 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
128c0 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63 65    assert( bCance
128d0 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  l || pzErr==0 ||
128e0 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
128f0 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29  if( bCancel==0 )
12900 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
12910 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20  = pState->out;. 
12920 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
12930 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
12940 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20  .bVerbose;..    
12950 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  rc = sqlite3_exp
12960 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70  ert_analyze(p, p
12970 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
12980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12990 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72 79        int nQuery
129a0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
129b0 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20  t_count(p);.    
129c0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
129d0 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
129e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
129f0 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69  ar *zCand = sqli
12a00 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
12a10 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45 50  t(p,0,EXPERT_REP
12a20 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29 3b  ORT_CANDIDATES);
12a30 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
12a40 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e  ntf(out, "-- Can
12a50 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d  didates --------
12a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a70 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
12a80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
12a90 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64  t, "%s\n", zCand
12aa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12ab0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65   for(i=0; i<nQue
12ac0 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ry; i++){.      
12ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
12ae0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
12af0 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
12b00 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53   EXPERT_REPORT_S
12b10 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  QL);.        con
12b20 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
12b30 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
12b40 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
12b50 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58 45  RT_REPORT_INDEXE
12b60 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  S);.        cons
12b70 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73  t char *zEQP = s
12b80 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
12b90 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
12ba0 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a  T_REPORT_PLAN);.
12bb0 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78          if( zIdx
12bc0 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28 6e  ==0 ) zIdx = "(n
12bd0 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c 6e  o new indexes)\n
12be0 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
12bf0 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
12c00 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12c10 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20 25  out, "-- Query %
12c20 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d --------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c40 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20  --\n",i+1);.    
12c50 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12c60 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20  (out, "%s\n\n", 
12c70 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
12c80 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
12c90 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
12ca0 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   zIdx);.        
12cb0 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
12cc0 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20  "%s\n", zEQP);. 
12cd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12ce0 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  .  sqlite3_exper
12cf0 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20  t_destroy(p);.  
12d00 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
12d10 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72 65  Expert = 0;.  re
12d20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12d30 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
12d40 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64 6f   of ".expert" do
12d50 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
12d60 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44  atic int expertD
12d70 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
12d80 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12da0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
12db0 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
12dc0 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12de0 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
12df0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
12e00 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
12e10 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
12e40 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
12e50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12e60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
12e70 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
12e80 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d  nt i;.  int iSam
12e90 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ple = 0;..  asse
12ea0 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
12eb0 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 3b  rt.pExpert==0 );
12ec0 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61 74  .  memset(&pStat
12ed0 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73 69  e->expert, 0, si
12ee0 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f 29  zeof(ExpertInfo)
12ef0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  );..  for(i=1; r
12f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12f10 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
12f20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
12f30 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  g[i];.    int n;
12f40 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
12f50 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
12f60 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73  ) z++;.    n = s
12f70 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
12f80 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
12f90 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62  trncmp(z, "-verb
12fa0 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ose", n) ){.    
12fb0 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
12fc0 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  .bVerbose = 1;. 
12fd0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
12fe0 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72  ( n>=2 && 0==str
12ff0 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65  ncmp(z, "-sample
13000 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ", n) ){.      i
13010 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29  f( i==(nArg-1) )
13020 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
13030 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
13040 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
13050 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
13060 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
13070 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
13080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13090 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
130a0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
130b0 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20  e(azArg[++i]);. 
130c0 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d 70         if( iSamp
130d0 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e  le<0 || iSample>
130e0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
130f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
13100 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20 6f  rr, "value out o
13110 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20  f range: %s\n", 
13120 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
13130 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13140 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
13150 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13160 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
13170 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
13180 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
13190 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
131a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
131b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
131c0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
131d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53  ITE_OK ){.    pS
131e0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
131f0 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  pert = sqlite3_e
13200 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74 65  xpert_new(pState
13210 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20  ->db, &zErr);.  
13220 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 78    if( pState->ex
13230 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
13240 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
13250 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
13260 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a  ite3_expert_new:
13270 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
13280 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13290 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
132a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
132b0 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a  _expert_config(.
132c0 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65            pState
132d0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
132e0 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f  , EXPERT_CONFIG_
132f0 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a  SAMPLE, iSample.
13300 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
13310 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
13320 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
13330 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13340 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
13350 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
13360 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
13370 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
13380 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72    Print.** any r
13390 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d  esult rows/colum
133a0 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ns depending on 
133b0 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65  the current mode
133c0 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
133d0 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
133e0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
133f0 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
13400 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
13410 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
13420 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78  ).** function ex
13430 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
13440 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
13450 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61  nt callback.** a
13460 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
13470 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
13480 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
13490 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xec(.  sqlite3 *
134a0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61   /* An open data
134d0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
134e0 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65      /* SQL to be
13510 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20   evaluated */.  
13520 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
13530 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a  (void*,int,char*
13540 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 2c 20  *,char**,int*), 
13550 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75    /* Callback fu
13560 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20 74 68        /* (not th
135a0 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
135b0 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53 68 65  3_exec) */.  She
135c0 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20  llState *pArg,  
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
135f0 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
13600 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
13610 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13630 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
13640 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
13650 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
13660 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  Stmt = NULL;    
13670 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
13680 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69   execute. */.  i
13690 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
136a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
136b0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
136c0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f  .  int rc2;.  co
136d0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f  nst char *zLefto
136e0 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ver;          /*
136f0 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65   Tail of unproce
13700 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20 20 69  ssed SQL */..  i
13710 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
13720 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e     *pzErrMsg = N
13730 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ULL;.  }..#ifnde
13740 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13750 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
13760 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45   pArg->expert.pE
13770 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20  xpert ){.    rc 
13780 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51  = expertHandleSQ
13790 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a  L(pArg, zSql, pz
137a0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
137b0 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68  urn expertFinish
137c0 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49  (pArg, (rc!=SQLI
137d0 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67  TE_OK), pzErrMsg
137e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
137f0 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20   while( zSql[0] 
13800 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d  && (SQLITE_OK ==
13810 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74   rc) ){.    stat
13820 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
13830 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20  StmtSql;.    rc 
13840 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
13850 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
13860 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
13870 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20  tover);.    if( 
13880 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20  SQLITE_OK != rc 
13890 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45  ){.      if( pzE
138a0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
138b0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
138c0 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
138d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
138e0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 74  {.      if( !pSt
138f0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mt ){.        /*
13900 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   this happens fo
13910 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77  r a comment or w
13920 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20  hite-space */.  
13930 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
13940 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
13950 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
13960 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
13970 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
13980 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
13990 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c    zStmtSql = sql
139a0 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
139b0 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74  .      if( zStmt
139c0 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71  Sql==0 ) zStmtSq
139d0 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68  l = "";.      wh
139e0 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 74  ile( IsSpace(zSt
139f0 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d  mtSql[0]) ) zStm
13a00 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  tSql++;..      /
13a10 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
13a20 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
13a30 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
13a40 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
13a50 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
13a60 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
13a70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
13a80 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
13a90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
13aa0 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
13ab0 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
13ac0 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
13ad0 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53 68    if( pArg && Sh
13ae0 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c  ellHasFlag(pArg,
13af0 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a   SHFLG_Echo) ){.
13b00 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
13b10 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
13b20 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20  %s\n", zStmtSql 
13b30 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71  ? zStmtSql : zSq
13b40 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
13b50 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45     /* Show the E
13b60 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
13b70 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20  N if .eqp is on 
13b80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
13b90 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45  g && pArg->autoE
13ba0 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  QP && sqlite3_st
13bb0 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
13bc0 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20  ,zStmtSql,0)!=0 
13bd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13be0 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
13bf0 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
13c00 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20 69  *zEQP;.        i
13c10 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d 20  nt triggerEQP = 
13c20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  0;.        disab
13c30 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
13c40 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20  odes();.        
13c50 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
13c60 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
13c70 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
13c80 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72 45  P, -1, &triggerE
13c90 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QP);.        if(
13ca0 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
13cb0 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
13cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13cd0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
13ce0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
13cf0 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
13d00 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
13d10 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20  .        zEQP = 
13d20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13d30 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
13d40 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71  LAN %s", zStmtSq
13d50 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  l);.        rc =
13d60 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
13d70 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
13d80 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
13d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13db0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
13dc0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
13dd0 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  lain)==SQLITE_RO
13de0 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
13df0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
13e00 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d 20 25  ->out,"--EQP-- %
13e10 64 2c 22 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d,",sqlite3_colu
13e20 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
13e30 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
13e40 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
13e50 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71  g->out,"%d,", sq
13e60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13e70 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a  (pExplain, 1));.
13e80 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
13e90 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
13ea0 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f  ,"%d,", sqlite3_
13eb0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
13ec0 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20 20  ain, 2));.      
13ed0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
13ee0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c  f(pArg->out,"%s\
13ef0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
13f00 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e  mn_text(pExplain
13f10 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 3));.         
13f20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
13f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
13f40 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
13f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13f60 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
13f70 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
13f80 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f  utoEQP>=AUTOEQP_
13f90 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  full ){.        
13fa0 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20    /* Also do an 
13fb0 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71  EXPLAIN for ".eq
13fc0 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a  p full" mode */.
13fd0 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d            zEQP =
13fe0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13ff0 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a  ("EXPLAIN %s", z
14000 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
14010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14020 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
14030 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
14040 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ain, 0);.       
14050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14070 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
14080 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
14090 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
140a0 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
140b0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
140c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
140d0 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
140e0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 2c  (pArg, pExplain,
140f0 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20   xCallback);.   
14100 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
14110 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
14120 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
14130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14140 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
14150 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
14160 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51  sqlite3_free(zEQ
14170 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  P);.        }.  
14180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
14190 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
141a0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
141b0 47 45 52 5f 45 51 50 2c 20 74 72 69 67 67 65 72  GER_EQP, trigger
141c0 45 51 50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  EQP, 0);.       
141d0 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74   restore_debug_t
141e0 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20  race_modes();.  
141f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14200 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
14210 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70   pArg->cMode = p
14220 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  Arg->mode;.     
14230 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
14240 6f 45 78 70 6c 61 69 6e 0a 20 20 20 20 20 20 20  oExplain.       
14250 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
14260 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
14270 3d 3d 38 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==8.         && 
14280 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
14290 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a 53 74 6d  "EXPLAIN%", zStm
142a0 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20 20 20 20  tSql,0)==0.     
142b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
142c0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
142d0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
142e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
142f0 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69  * If the shell i
14300 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22  s currently in "
14310 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20  .explain" mode, 
14320 67 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61  gather the extra
14330 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
14340 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64   required to add
14350 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20   indents to the 
14360 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20  output.*/.      
14370 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64    if( pArg->cMod
14380 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
14390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ){.          exp
143a0 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
143b0 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  e(pArg, pStmt);.
143c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143d0 7d 0a 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72  }..      exec_pr
143e0 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67  epared_stmt(pArg
143f0 2c 20 70 53 74 6d 74 2c 20 78 43 61 6c 6c 62 61  , pStmt, xCallba
14400 63 6b 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ck);.      expla
14410 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
14420 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Arg);..      /* 
14430 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61 74  print usage stat
14440 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f  s if stats on */
14450 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
14460 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  && pArg->statsOn
14470 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
14480 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41  lay_stats(db, pA
14490 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rg, 0);.      }.
144a0 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
144b0 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69 66  loop-counters if
144c0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
144d0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
144e0 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e  Arg->scanstatsOn
144f0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
14500 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64 62  lay_scanstats(db
14510 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , pArg);.      }
14520 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
14530 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ize the statemen
14540 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e  t just executed.
14550 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
14560 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
14570 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
14580 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72  r message. Other
14590 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74  wise, set zSql t
145a0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  o point to the. 
145b0 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61       ** next sta
145c0 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
145d0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20  e. */.      rc2 
145e0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
145f0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
14600 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14610 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32  NOMEM ) rc = rc2
14620 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
14630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14640 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
14650 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
14660 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
14670 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
14680 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14690 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
146a0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
146b0 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
146c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
146d0 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64    /* clear saved
146e0 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a   stmt handle */.
146f0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
14700 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
14710 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pStmt = NULL;.  
14720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
14730 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* end while */.
14740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14750 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
14760 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79  emory previously
14770 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 61   allocated by ta
14780 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e  bleColumnList().
14790 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
147a0 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63  freeColumnList(c
147b0 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20  har **azCol){.  
147c0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  int i;.  for(i=1
147d0 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
147e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
147f0 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ee(azCol[i]);.  
14800 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20  }.  /* azCol[0] 
14810 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  is a static stri
14820 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ng */.  sqlite3_
14830 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a  free(azCol);.}..
14840 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  /*.** Return a l
14850 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ist of pointers 
14860 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63 68  to strings which
14870 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f   are the names o
14880 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  f all.** columns
14890 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e 20   in table zTab. 
148a0 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20    The memory to 
148b0 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 69  hold the names i
148c0 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  s dynamically.**
148d0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
148e0 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20  ust be released 
148f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
14900 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e 74  ing a subsequent
14910 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65   call.** to free
14920 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a  ColumnList()..**
14930 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d  .** The azCol[0]
14940 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c 6c   entry is usuall
14950 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72  y NULL.  However
14960 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61 69  , if zTab contai
14970 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61  ns a rowid.** va
14980 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  lue that needs t
14990 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c 20  o be preserved, 
149a0 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73  then azCol[0] is
149b0 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
149c0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
149d0 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  he rowid column.
149e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
149f0 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20   regular column 
14a00 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
14a10 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c  azCol[1].  The l
14a20 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
14a30 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72 79  d.** by an entry
14a40 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d   with azCol[i]==
14a50 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  0..*/.static cha
14a60 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c  r **tableColumnL
14a70 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ist(ShellState *
14a80 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
14a90 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61  Tab){.  char **a
14aa0 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  zCol = 0;.  sqli
14ab0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
14ac0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
14ad0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
14ae0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
14af0 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20  .  int nPK = 0; 
14b00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14b10 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  of PRIMARY KEY c
14b20 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20  olumns seen */. 
14b30 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b 20   int isIPK = 0; 
14b40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
14b50 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ne PRIMARY KEY c
14b60 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e  olumn of type IN
14b70 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70  TEGER */.  int p
14b80 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20 53  reserveRowid = S
14b90 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
14ba0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
14bb0 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  id);.  int rc;..
14bc0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
14bd0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
14be0 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c   table_info=%Q",
14bf0 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73   zTab);.  rc = s
14c00 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
14c10 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
14c20 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
14c30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
14c40 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
14c50 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
14c60 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
14c70 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
14c80 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43  OW ){.    if( nC
14c90 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a  ol>=nAlloc-2 ){.
14ca0 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
14cb0 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b  Alloc*2 + nCol +
14cc0 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c   10;.      azCol
14cd0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
14ce0 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63  oc(azCol, nAlloc
14cf0 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d  *sizeof(azCol[0]
14d00 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
14d10 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
14d20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
14d30 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
14d40 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
14d50 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
14d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14d70 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
14d80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14d90 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
14da0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
14db0 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
14dc0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14dd0 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
14de0 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
14df0 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
14e00 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
14e10 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
14e20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
14e30 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
14e40 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
14e60 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
14e70 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
14e80 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
14e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
14ea0 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
14eb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14ec0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
14ed0 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
14ee0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14ef0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
14f00 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
14f10 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
14f20 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
14f30 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
14f40 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
14f50 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
14f60 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
14f70 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
14f80 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
14f90 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
14fa0 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
14fb0 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
14fc0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
14fd0 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
14fe0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
14ff0 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
15000 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
15010 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
15020 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
15030 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
15040 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
15050 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
15060 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
15070 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
15080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
15090 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
150a0 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
150b0 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
150c0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
150d0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
150e0 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
150f0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
15100 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
15110 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
15120 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
15130 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
15140 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
15150 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
15160 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
15170 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
15180 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
15190 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
151a0 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
151b0 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
151c0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
151d0 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
151e0 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
151f0 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
15200 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
15210 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
15220 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
15230 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
15240 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
15250 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
15260 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
15270 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
15280 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
15290 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
152c0 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
152d0 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
152e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
152f0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
15300 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
15310 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15320 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
15330 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
15340 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
15350 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15360 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
15370 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
15380 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
15390 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
153a0 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
153b0 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
153c0 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
153d0 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
153e0 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
153f0 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
15400 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
15410 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
15420 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
15430 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
15440 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
15450 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
15460 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
15470 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
15480 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
15490 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
154a0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
154b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
154c0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
154d0 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
154e0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
154f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15500 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
15510 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
15520 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
15530 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
15540 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
15550 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
15560 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
15570 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
15580 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
15590 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
155a0 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
155b0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
155c0 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
155d0 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
155e0 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
155f0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
15600 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
15610 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
15620 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15630 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
15640 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
15650 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
15660 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
15670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15680 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
15690 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
156a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
156b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
156c0 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
156d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
156e0 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
156f0 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
15700 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
15710 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
15720 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
15730 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
15740 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
15750 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
15760 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
15770 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
15780 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
15790 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
157a0 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
157b0 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
157c0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
157d0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
157e0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
157f0 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
15800 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
15810 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
15820 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
15830 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
15840 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
15850 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
15860 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
15870 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
15880 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
15890 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
158a0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
158b0 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
158c0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
158d0 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
158e0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
158f0 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
15900 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
15910 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
15920 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
15930 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
15940 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
15950 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
15960 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
15970 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
15980 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
15990 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
159a0 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
159b0 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
159c0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
159d0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
159e0 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
159f0 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
15a00 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
15a10 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
15a20 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
15a30 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
15a40 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
15a50 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
15a60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15a70 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
15a80 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
15a90 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
15aa0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
15ab0 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
15ac0 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
15ad0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
15ae0 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
15af0 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
15b00 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
15b10 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
15b20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
15b30 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
15b40 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
15b50 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
15b60 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
15b70 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
15b80 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
15b90 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
15ba0 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
15bb0 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
15bc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
15bd0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
15be0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
15bf0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
15c00 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
15c10 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
15c20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
15c30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
15c40 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
15c50 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
15c60 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
15c70 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
15c80 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
15c90 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
15ca0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
15cb0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
15cc0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
15cd0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
15ce0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
15cf0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
15d00 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
15d10 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
15d20 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
15d30 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
15d40 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
15d50 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
15d60 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
15d70 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
15d80 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
15d90 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
15da0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
15db0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
15dc0 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
15dd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
15de0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
15df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
15e00 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
15e10 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
15e20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
15e30 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
15e40 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
15e50 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
15e60 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
15e70 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
15e80 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
15e90 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
15ea0 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
15eb0 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
15ec0 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
15ed0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
15ee0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
15ef0 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
15f00 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
15f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15f20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
15f30 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
15f40 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
15f50 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
15f60 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
15f70 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
15f80 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
15f90 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
15fa0 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
15fb0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
15fc0 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
15fd0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
15fe0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
15ff0 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
16000 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
16010 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
16020 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
16030 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
16040 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
16050 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
16060 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
16070 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
16080 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
16090 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
160a0 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
160b0 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
160c0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
160d0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
160e0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
160f0 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
16100 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
16110 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
16120 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
16130 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
16140 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
16150 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
16160 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
16170 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
16180 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
16190 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
161a0 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
161b0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
161c0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
161d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
161e0 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
161f0 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
16200 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
16210 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
16220 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
16230 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
16240 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
16250 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
16260 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
16270 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
16280 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
16290 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
162a0 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
162b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
162c0 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
162d0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
162e0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
162f0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
16300 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
16310 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
16320 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
16330 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
16340 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
16350 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
16360 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
16370 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
16380 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
16390 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
163a0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
163b0 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
163c0 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
163d0 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
163e0 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
163f0 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
16400 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
16410 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
16420 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
16430 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
16440 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
16450 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
16460 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
16470 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c  ect.z, shell_cal
16480 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20  lback, p, 0);.  
16490 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
164a0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
164b0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
164c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
164d0 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20  **** CORRUPTION 
164e0 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e  ERROR *******/\n
164f0 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65  ");.      toggle
16500 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64  SelectOrder(p->d
16510 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  b);.      shell_
16520 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
16530 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c  ect.z, shell_cal
16540 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20  lback, p, 0);.  
16550 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
16560 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
16570 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
16580 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
16590 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
165a0 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
165b0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
165c0 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
165d0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
165e0 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
165f0 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
16600 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16610 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
16620 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
16630 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
16640 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
16650 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
16660 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
16670 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
16680 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
16690 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
166a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
166b0 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
166c0 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
166d0 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
166e0 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
166f0 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
16700 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
16710 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
16720 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
16730 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
16740 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
16750 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
16760 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
16770 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
16780 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
16790 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
167a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
167b0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
167c0 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
167d0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
167e0 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
167f0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
16800 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
16810 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
16820 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
16830 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
16840 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
16850 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
16860 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
16870 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
16880 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
16890 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
168a0 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
168b0 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
168c0 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
168d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
168e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
168f0 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
16900 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
16910 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
16920 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
16930 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
16940 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
16950 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
16960 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16970 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
16980 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
16990 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
169a0 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
169b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
169c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
169d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
169e0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
169f0 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
16a00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
16a20 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
16a30 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
16a40 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20 64 65  zHelp[] =.#if de
16a50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
16a60 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69  E_ZLIB) && !defi
16a70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16a80 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
16a90 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20  ".archive ...   
16aa0 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
16ab0 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c 22 2e  QL archives: \".
16ac0 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22  archive --help\"
16ad0 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e 22 0a   for details\n".
16ae0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
16af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
16b00 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74  RIZATION.  ".aut
16b10 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  h ON|OFF        
16b20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a     Show authoriz
16b30 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a  er callbacks\n".
16b40 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b 75  #endif.  ".backu
16b50 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20  p ?DB? FILE     
16b60 20 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61   Backup DB (defa
16b70 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f  ult \"main\") to
16b80 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62 61 69   FILE\n".  ".bai
16b90 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  l on|off        
16ba0 20 20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69     Stop after hi
16bb0 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20  tting an error. 
16bc0 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a   Default OFF\n".
16bd0 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66    ".binary on|of
16be0 66 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 62  f         Turn b
16bf0 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20  inary output on 
16c00 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74  or off.  Default
16c10 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64 20 44   OFF\n".  ".cd D
16c20 49 52 45 43 54 4f 52 59 20 20 20 20 20 20 20 20  IRECTORY        
16c30 20 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72    Change the wor
16c40 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74  king directory t
16c50 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 0a 20  o DIRECTORY\n". 
16c60 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66   ".changes on|of
16c70 66 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75  f        Show nu
16c80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61  mber of rows cha
16c90 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22 0a 20  nged by SQL\n". 
16ca0 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20   ".check GLOB   
16cb0 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66           Fail if
16cc0 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74   output since .t
16cd0 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  estcase does not
16ce0 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e 63 6c   match\n".  ".cl
16cf0 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20  one NEWDB       
16d00 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69      Clone data i
16d10 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74  nto NEWDB from t
16d20 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
16d30 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61  base\n".  ".data
16d40 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
16d50 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64    List names and
16d60 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68   files of attach
16d70 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a  ed databases\n".
16d80 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20    ".dbinfo ?DB? 
16d90 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73            Show s
16da0 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tatus informatio
16db0 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
16dc0 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75 6d 70  base\n".  ".dump
16dd0 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20   ?TABLE? ...    
16de0 20 20 44 75 6d 70 20 74 68 65 20 64 61 74 61 62    Dump the datab
16df0 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20 74 65  ase in an SQL te
16e00 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22  xt format\n".  "
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c           If TABL
16e30 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  E specified, onl
16e40 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20 6d 61  y dump tables ma
16e50 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  tching\n".  "   
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65        LIKE patte
16e80 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22  rn TABLE.\n".  "
16e90 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20  .echo on|off    
16ea0 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d         Turn comm
16eb0 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f  and echo on or o
16ec0 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20 6f 6e  ff\n".  ".eqp on
16ed0 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20 20 20  |off|full       
16ee0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
16ef0 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c  e automatic EXPL
16f00 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 5c 6e  AIN QUERY PLAN\n
16f10 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20 20  ".  ".exit      
16f20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
16f30 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22   this program\n"
16f40 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20 20 20  .  ".expert     
16f50 20 20 20 20 20 20 20 20 20 20 20 45 58 50 45 52             EXPER
16f60 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65 73 74  IMENTAL. Suggest
16f70 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73 70 65   indexes for spe
16f80 63 69 66 69 65 64 20 71 75 65 72 69 65 73 5c 6e  cified queries\n
16f90 22 0a 2f 2a 20 42 65 63 61 75 73 65 20 65 78 70  "./* Because exp
16fa0 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73 20  lain mode comes 
16fb0 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  on automatically
16fc0 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78 70 6c   now, the ".expl
16fd0 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73 20  ain" mode.** is 
16fe0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
16ff0 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20 20 49   help screen.  I
17000 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70 70 6f  t is still suppo
17010 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63 79 2c  rted for legacy,
17020 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e   however */./*".
17030 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c  explain ?on|off|
17040 61 75 74 6f 3f 20 54 75 72 6e 20 45 58 50 4c 41  auto? Turn EXPLA
17050 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f  IN output mode o
17060 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61  n or off or to a
17070 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a 20 20  utomatic\n"*/.  
17080 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d  ".fullschema ?--
17090 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73 63 68  indent? Show sch
170a0 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ema and the cont
170b0 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  ent of sqlite_st
170c0 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22  at tables\n".  "
170d0 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20  .headers on|off 
170e0 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70         Turn disp
170f0 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f  lay of headers o
17100 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
17110 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20  help            
17120 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73 20        Show this 
17130 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69  message\n".  ".i
17140 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45  mport FILE TABLE
17150 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61       Import data
17160 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20   from FILE into 
17170 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64 65 66  TABLE\n".#ifndef
17180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53   SQLITE_OMIT_TES
17190 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d  T_CONTROL.  ".im
171a0 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41 42  poster INDEX TAB
171b0 4c 45 20 20 43 72 65 61 74 65 20 69 6d 70 6f 73  LE  Create impos
171c0 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45 20  ter table TABLE 
171d0 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 5c 6e  on index INDEX\n
171e0 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64  ".#endif.  ".ind
171f0 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  exes ?TABLE?    
17200 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66     Show names of
17210 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22 0a   all indexes\n".
17220 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
17230 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
17240 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
17250 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78 65  only show indexe
17260 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22 0a  s for tables\n".
17270 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
17280 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63              matc
17290 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72  hing LIKE patter
172a0 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66 64  n TABLE.\n".#ifd
172b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
172c0 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74  _IOTRACE.  ".iot
172d0 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20 20  race FILE       
172e0 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69     Enable I/O di
172f0 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67  agnostic logging
17300 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64   to FILE\n".#end
17310 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49  if.  ".limit ?LI
17320 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69 73  MIT? ?VAL?   Dis
17330 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74  play or change t
17340 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53  he value of an S
17350 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a 20  QLITE_LIMIT\n". 
17360 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20   ".lint OPTIONS 
17370 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74 20           Report 
17380 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d 61  potential schema
17390 20 69 73 73 75 65 73 2e 20 4f 70 74 69 6f 6e 73   issues. Options
173a0 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  :\n".  "        
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20   fkey-indexes   
173d0 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66    Find missing f
173e0 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78  oreign key index
173f0 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51  es\n".#ifndef SQ
17400 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
17410 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61  XTENSION.  ".loa
17420 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20  d FILE ?ENTRY?  
17430 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e     Load an exten
17440 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a  sion library\n".
17450 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46  #endif.  ".log F
17460 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
17470 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e   Turn logging on
17480 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63   or off.  FILE c
17490 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64  an be stderr/std
174a0 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20  out\n".  ".mode 
174b0 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20  MODE ?TABLE?    
174c0 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   Set output mode
174d0 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f   where MODE is o
174e0 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20  ne of:\n".  "   
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 20 20 20 20 61 73 63 69 69 20 20 20 20 43        ascii    C
17510 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69  olumns/rows deli
17520 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61 6e  mited by 0x1F an
17530 64 20 30 78 31 45 5c 6e 22 0a 20 20 22 20 20 20  d 0x1E\n".  "   
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17550 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43        csv      C
17560 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76  omma-separated v
17570 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  alues\n".  "    
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17590 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65       column   Le
175a0 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d  ft-aligned colum
175b0 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68  ns.  (See .width
175c0 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  )\n".  "        
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c   html     HTML <
175f0 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20  table> code\n". 
17600 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
17610 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72             inser
17620 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
17630 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
17640 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  BLE\n".  "      
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20     line     One 
17670 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e  value per line\n
17680 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
176a0 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
176b0 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22  limited by \"|\"
176c0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65 20  quote    Escape 
176f0 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20 53  answers as for S
17700 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  QL\n".  "       
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d 73    tabs     Tab-s
17730 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c  eparated values\
17740 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17760 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73 74  cl      TCL list
17770 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22   elements\n".  "
17780 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
17790 47 20 20 20 20 20 20 55 73 65 20 53 54 52 49 4e  G      Use STRIN
177a0 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55  G in place of NU
177b0 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  LL values\n".  "
177c0 2e 6f 6e 63 65 20 46 49 4c 45 4e 41 4d 45 20 20  .once FILENAME  
177d0 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f         Output fo
177e0 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63  r the next SQL c
177f0 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46  ommand only to F
17800 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f  ILENAME\n".  ".o
17810 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46  pen ?OPTIONS? ?F
17820 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69 73 74  ILE? Close exist
17830 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e 64  ing database and
17840 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e 22 0a   reopen FILE\n".
17850 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
17860 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
17870 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73 74 61  --new option sta
17880 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70 74  rts with an empt
17890 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 2e 6f 75  y file\n".  ".ou
178a0 74 70 75 74 20 3f 46 49 4c 45 4e 41 4d 45 3f 20  tput ?FILENAME? 
178b0 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
178c0 74 6f 20 46 49 4c 45 4e 41 4d 45 20 6f 72 20 73  to FILENAME or s
178d0 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72 69  tdout\n".  ".pri
178e0 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
178f0 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c     Print literal
17900 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70   STRING\n".  ".p
17910 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49  rompt MAIN CONTI
17920 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74 68 65  NUE  Replace the
17930 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74   standard prompt
17940 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20  s\n".  ".quit   
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
17960 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
17970 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c  \n".  ".read FIL
17980 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45 78  ENAME         Ex
17990 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c  ecute SQL in FIL
179a0 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73  ENAME\n".  ".res
179b0 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20  tore ?DB? FILE  
179c0 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65     Restore conte
179d0 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c  nt of DB (defaul
179e0 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d  t \"main\") from
179f0 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61 76   FILE\n".  ".sav
17a00 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  e FILE          
17a10 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f     Write in-memo
17a20 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f  ry database into
17a30 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 61   FILE\n".  ".sca
17a40 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20  nstats on|off   
17a50 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f     Turn sqlite3_
17a60 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
17a70 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20  ) metrics on or 
17a80 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d  off\n".  ".schem
17a90 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20  a ?PATTERN?     
17aa0 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45   Show the CREATE
17ab0 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63   statements matc
17ac0 68 69 6e 67 20 50 41 54 54 45 52 4e 5c 6e 22 0a  hing PATTERN\n".
17ad0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64               Add
17af0 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72 20 70 72   --indent for pr
17b00 65 74 74 79 2d 70 72 69 6e 74 69 6e 67 5c 6e 22  etty-printing\n"
17b10 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 2d  .  ".selftest ?-
17b20 2d 69 6e 69 74 3f 20 20 20 20 20 52 75 6e 20 74  -init?     Run t
17b30 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ests defined in 
17b40 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
17b50 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72 61  le\n".  ".separa
17b60 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20  tor COL ?ROW?   
17b70 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d  Change the colum
17b80 6e 20 73 65 70 61 72 61 74 6f 72 20 61 6e 64 20  n separator and 
17b90 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65 20 72  optionally the r
17ba0 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  ow\n".  "       
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 73 65 70 61 72 61 74 6f 72 20 66 6f 72 20    separator for 
17bd0 62 6f 74 68 20 74 68 65 20 6f 75 74 70 75 74 20  both the output 
17be0 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74  mode and .import
17bf0 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28  \n".#if defined(
17c00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
17c10 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69  SSION).  ".sessi
17c20 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20  on CMD ...      
17c30 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74 72   Create or contr
17c40 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e 22 0a 23  ol sessions\n".#
17c50 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75  endif.  ".sha3su
17c60 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20  m ?OPTIONS...?  
17c70 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68  Compute a SHA3 h
17c80 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  ash of database 
17c90 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 22 2e 73  content\n".  ".s
17ca0 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e  hell CMD ARGS...
17cb0 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47       Run CMD ARG
17cc0 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d  S... in a system
17cd0 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68   shell\n".  ".sh
17ce0 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
17cf0 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72      Show the cur
17d00 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
17d10 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73  various settings
17d20 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f  \n".  ".stats ?o
17d30 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 53 68  n|off?        Sh
17d40 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e  ow stats or turn
17d50 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66   stats on or off
17d60 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d 20 43  \n".  ".system C
17d70 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52 75  MD ARGS...    Ru
17d80 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
17d90 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c   a system shell\
17da0 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  n".  ".tables ?T
17db0 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73  ABLE?        Lis
17dc0 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
17dd0 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
17e00 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74  ied, only list t
17e10 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
17e20 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
17e40 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
17e50 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63 61 73  .\n".  ".testcas
17e60 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 42  e NAME         B
17e70 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67  egin redirecting
17e80 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74   output to 'test
17e90 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22  case-out.txt'\n"
17ea0 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20  .  ".timeout MS 
17eb0 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 6f             Try o
17ec0 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61  pening locked ta
17ed0 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c  bles for MS mill
17ee0 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e  iseconds\n".  ".
17ef0 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20  timer on|off    
17f00 20 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74        Turn SQL t
17f10 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  imer on or off\n
17f20 22 0a 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45  ".  ".trace FILE
17f30 7c 6f 66 66 20 20 20 20 20 20 20 20 4f 75 74 70  |off        Outp
17f40 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
17f50 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
17f60 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69 6e 66  un\n".  ".vfsinf
17f70 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  o ?AUX?         
17f80 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
17f90 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  t the top-level 
17fa0 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73 6c 69  VFS\n".  ".vfsli
17fb0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
17fc0 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61   List all availa
17fd0 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20 20 22  ble VFSes\n".  "
17fe0 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20  .vfsname ?AUX?  
17ff0 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65         Print the
18000 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
18010 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69   stack\n".  ".wi
18020 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e  dth NUM1 NUM2 ..
18030 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77  .   Set column w
18040 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75  idths for \"colu
18050 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22  mn\" mode\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 20 20 4e 65 67 61 74 69 76           Negativ
18080 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a  e values right-j
18090 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66  ustify\n".;..#if
180a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
180b0 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
180c0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65 6c 70  /*.** Print help
180d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
180e0 20 74 68 65 20 22 2e 73 65 73 73 69 6f 6e 73 22   the ".sessions"
180f0 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64   command.*/.void
18100 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 53 68   session_help(Sh
18110 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
18120 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18130 74 2c 0a 20 20 20 20 22 2e 73 65 73 73 69 6f 6e  t,.    ".session
18140 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d 4d 41   ?NAME? SUBCOMMA
18150 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a  ND ?ARGS...?\n".
18160 20 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f 20 69      "If ?NAME? i
18170 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20 66  s omitted, the f
18180 69 72 73 74 20 64 65 66 69 6e 65 64 20 73 65 73  irst defined ses
18190 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c 6e 22  sion is used.\n"
181a0 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d 61 6e 64  .    "Subcommand
181b0 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 61 74  s:\n".    "   at
181c0 74 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20  tach TABLE      
181d0 20 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41         Attach TA
181e0 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63  BLE\n".    "   c
181f0 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20  hangeset FILE   
18200 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
18210 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46  changeset into F
18220 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63  ILE\n".    "   c
18230 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
18240 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e          Close on
18250 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20 20 20  e session\n".   
18260 20 22 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f   "   enable ?BOO
18270 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65  LEAN?         Se
18280 74 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65  t or query the e
18290 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20 20 20  nable bit\n".   
182a0 20 22 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42   "   filter GLOB
182b0 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65  ...           Re
182c0 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63  ject tables matc
182d0 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a 20 20  hing GLOBs\n".  
182e0 20 20 22 20 20 20 69 6e 64 69 72 65 63 74 20 3f    "   indirect ?
182f0 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d  BOOLEAN?       M
18300 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65  ark or query the
18310 20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73   indirect status
18320 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 73 65 6d  \n".    "   isem
18330 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20  pty             
18340 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68       Query wheth
18350 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69  er the session i
18360 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20 20 22  s empty\n".    "
18370 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20     list         
18380 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
18390 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
183a0 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22  session names\n"
183b0 0a 20 20 20 20 22 20 20 20 6f 70 65 6e 20 44 42  .    "   open DB
183c0 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20   NAME           
183d0 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73    Open a new ses
183e0 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a 20 20  sion on DB\n".  
183f0 20 20 22 20 20 20 70 61 74 63 68 73 65 74 20 46    "   patchset F
18400 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57  ILE            W
18410 72 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20  rite a patchset 
18420 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 29  into FILE\n".  )
18430 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ;.}.#endif.../* 
18440 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
18450 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
18460 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68  process_input(Sh
18470 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c  ellState *p, FIL
18480 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  E *in);../*.** R
18490 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
184a0 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e  of file zName in
184b0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
184c0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
184d0 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e  malloc64().** an
184e0 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
184f0 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  er to the buffer
18500 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  . The caller is 
18510 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
18520 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d  freeing.** the m
18530 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  emory..**.** If 
18540 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74 65  parameter pnByte
18550 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a   is not NULL, (*
18560 70 6e 42 79 74 65 29 20 69 73 20 73 65 74 20 74  pnByte) is set t
18570 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
18580 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a  bytes.** read..*
18590 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69  *.** For conveni
185a0 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d  ence, a nul-term
185b0 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
185c0 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64 20 74  lways appended t
185d0 6f 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  o the data read.
185e0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
185f0 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
18600 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  er is returned. 
18610 54 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74  This byte is not
18620 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20   included in.** 
18630 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  the final value 
18640 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69 66  of (*pnByte), if
18650 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a   applicable..**.
18660 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
18670 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ned if any error
18680 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e   is encountered.
18690 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
186a0 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69   of *pnByte.** i
186b0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
186c0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
186d0 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46 69  tic char *readFi
186e0 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
186f0 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74  Name, int *pnByt
18700 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d  e){.  FILE *in =
18710 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72   fopen(zName, "r
18720 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b  b");.  long nIn;
18730 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b  .  size_t nRead;
18740 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20  .  char *pBuf;. 
18750 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
18760 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69  urn 0;.  fseek(i
18770 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b  n, 0, SEEK_END);
18780 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69  .  nIn = ftell(i
18790 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29  n);.  rewind(in)
187a0 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74  ;.  pBuf = sqlit
187b0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e  e3_malloc64( nIn
187c0 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  +1 );.  if( pBuf
187d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
187e0 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28    nRead = fread(
187f0 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e  pBuf, nIn, 1, in
18800 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  );.  fclose(in);
18810 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20  .  if( nRead!=1 
18820 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
18830 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72  ree(pBuf);.    r
18840 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
18850 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20  Buf[nIn] = 0;.  
18860 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
18870 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65  Byte = nIn;.  re
18880 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69  turn pBuf;.}..#i
18890 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
188a0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
188b0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73  ./*.** Close a s
188c0 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f  ingle OpenSessio
188d0 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c  n object and rel
188e0 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  ease all of its 
188f0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65  associated.** re
18900 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  sources..*/.stat
18910 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f  ic void session_
18920 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f  close(OpenSessio
18930 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20  n *pSession){.  
18940 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
18950 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70  session_delete(p
18960 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73  Session->p);.  s
18970 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
18980 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  sion->zName);.  
18990 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73  for(i=0; i<pSess
189a0 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b  ion->nFilter; i+
189b0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
189c0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61  free(pSession->a
189d0 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d  zFilter[i]);.  }
189e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
189f0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
18a00 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53  er);.  memset(pS
18a10 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f  ession, 0, sizeo
18a20 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b  f(OpenSession));
18a30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18a40 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53   Close all OpenS
18a50 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61  ession objects a
18a60 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61  nd release all a
18a70 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72  ssociated resour
18a80 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ces..*/.#if defi
18a90 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18aa0 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69  E_SESSION).stati
18ab0 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
18ac0 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74  lose_all(ShellSt
18ad0 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ate *p){.  int i
18ae0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
18af0 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29  ->nSession; i++)
18b00 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c  {.    session_cl
18b10 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e  ose(&p->aSession
18b20 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  [i]);.  }.  p->n
18b30 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23  Session = 0;.}.#
18b40 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
18b50 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28  ssion_close_all(
18b60 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
18b70 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
18b80 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66  of the xFilter f
18b90 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f  unction for an o
18ba0 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d  pen session.  Om
18bb0 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73  it.** any tables
18bc0 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73   named by ".sess
18bd0 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20  ion filter" but 
18be0 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  let all other ta
18bf0 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  ble through..*/.
18c00 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18c10 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
18c20 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  N).static int se
18c30 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69  ssion_filter(voi
18c40 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63  d *pCtx, const c
18c50 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70  har *zTab){.  Op
18c60 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
18c70 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69  ion = (OpenSessi
18c80 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  on*)pCtx;.  int 
18c90 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
18ca0 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
18cb0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
18cc0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
18cd0 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
18ce0 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30  ter[i], zTab)==0
18cf0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
18d00 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
18d10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
18d20 20 74 6f 20 64 65 64 75 63 65 20 74 68 65 20 74   to deduce the t
18d30 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20  ype of file for 
18d40 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69  zName based on i
18d50 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74  ts content.  Ret
18d60 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  urn.** one of th
18d70 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63  e SHELL_OPEN_* c
18d80 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61  onstants..*/.sta
18d90 74 69 63 20 69 6e 74 20 64 65 64 75 63 65 44 61  tic int deduceDa
18da0 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74  tabaseType(const
18db0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
18dc0 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e   FILE *f = fopen
18dd0 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20  (zName, "rb");. 
18de0 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74   size_t n;.  int
18df0 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
18e00 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68 61 72 20  _UNSPEC;.  char 
18e10 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zBuf[100];.  if(
18e20 20 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   f==0 ) return S
18e30 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
18e40 3b 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 35  ;.  fseek(f, -25
18e50 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
18e60 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
18e70 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20  5, 1, f);.  if( 
18e80 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==1 && memcmp(z
18e90 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66 2d 53  Buf, "Start-Of-S
18ea0 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d 3d 30  QLite3-", 17)==0
18eb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 48 45   ){.    rc = SHE
18ec0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
18ed0 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
18ee0 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20 53 45  fseek(f, -22, SE
18ef0 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e 20 3d  EK_END);.    n =
18f00 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32 32 2c   fread(zBuf, 22,
18f10 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66 28 20   1, f);.    if( 
18f20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30 5d 3d  n==1 && zBuf[0]=
18f30 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b 31 5d  =0x50 && zBuf[1]
18f40 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66 5b 32  ==0x4b && zBuf[2
18f50 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20 20 26  ]==0x05.       &
18f60 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30 36 20  & zBuf[3]==0x06 
18f70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48  ){.      rc = SH
18f80 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
18f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63  ;.    }.  }.  fc
18fa0 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72  lose(f);.  retur
18fb0 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  n rc;  .}../*.**
18fc0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   Make sure the d
18fd0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e  atabase is open.
18fe0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
18ff0 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49  then open it.  I
19000 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
19010 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c  e fails to open,
19020 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   print an error 
19030 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74  message and exit
19040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19050 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74   open_db(ShellSt
19060 61 74 65 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70  ate *p, int keep
19070 41 6c 69 76 65 29 7b 0a 20 20 69 66 28 20 70 2d  Alive){.  if( p-
19080 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  >db==0 ){.    sq
19090 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
190a0 28 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  ();.    if( p->o
190b0 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
190c0 50 45 4e 5f 55 4e 53 50 45 43 20 26 26 20 61 63  PEN_UNSPEC && ac
190d0 63 65 73 73 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  cess(p->zDbFilen
190e0 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ame,0)==0 ){.   
190f0 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
19100 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54   deduceDatabaseT
19110 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  ype(p->zDbFilena
19120 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
19130 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d 6f  witch( p->openMo
19140 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
19150 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
19160 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20 20  NDVFS: {.       
19170 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
19180 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
19190 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20   &p->db, .      
191a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
191b0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
191c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 22  E_OPEN_CREATE, "
191d0 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20 20  apndvfs");.     
191e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
191f0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
19200 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a  LL_OPEN_ZIPFILE:
19210 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
19220 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
19230 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  :", &p->db);.   
19240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19250 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
19260 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
19270 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  :.      case SHE
19280 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20  LL_OPEN_NORMAL: 
19290 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
192a0 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c  3_open(p->zDbFil
192b0 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  ename, &p->db);.
192c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
192d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
192e0 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64   globalDb = p->d
192f0 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  b;.    if( p->db
19300 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ==0 || SQLITE_OK
19310 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
19320 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
19330 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
19340 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
19350 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
19360 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c  base \"%s\": %s\
19370 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  n",.          p-
19380 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
19390 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
193a0 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
193b0 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74 75  keepAlive ) retu
193c0 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  rn;.      exit(1
193d0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
193e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
193f0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
19400 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
19410 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
19420 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
19430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
19440 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
19450 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
19460 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
19470 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
19480 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
19490 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
194a0 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
194b0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
194c0 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
194d0 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
194e0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
194f0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
19500 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
19510 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
19520 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
19530 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
19540 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
19550 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
19580 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
19590 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
195a0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
195b0 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
195c0 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
195d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
195e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
19600 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
19610 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
19620 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
19630 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29  L_OPEN_ZIPFILE )
19640 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
19650 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
19660 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 22  intf(.         "
19670 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
19680 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47 20 7a  ABLE zip USING z
19690 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d  ipfile(%Q);", p-
196a0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  >zDbFilename);. 
196b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
196c0 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  c(p->db, zSql, 0
196d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
196e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
196f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
19700 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  #if HAVE_READLIN
19710 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49  E || HAVE_EDITLI
19720 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e  NE./*.** Readlin
19730 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c  e completion cal
19740 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63  lbacks.*/.static
19750 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f   char *readline_
19760 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
19770 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
19780 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65  *text, int state
19790 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
197a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
197b0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  = 0;.  char *zRe
197c0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d  t;.  if( state==
197d0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
197e0 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Sql;.    sqlite3
197f0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
19800 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
19810 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
19820 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61  LECT DISTINCT ca
19830 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20  ndidate COLLATE 
19840 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
19870 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20  etion(%Q) ORDER 
19880 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20  BY 1", text);.  
19890 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
198a0 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
198b0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
198c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
198d0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
198e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
198f0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
19900 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52  TE_ROW ){.    zR
19910 65 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e  et = strdup((con
19920 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
19930 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
19940 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
19950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
19960 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
19970 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
19980 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    zRet = 0;.  }.
19990 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
199a0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72  .static char **r
199b0 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
199c0 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
199d0 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74  Text, int iStart
199e0 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72  , int iEnd){.  r
199f0 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70  l_attempted_comp
19a00 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b  letion_over = 1;
19a10 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d  .  return rl_com
19a20 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28  pletion_matches(
19a30 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f  zText, readline_
19a40 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
19a50 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20  ator);.}..#elif 
19a60 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f  HAVE_LINENOISE./
19a70 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63  *.** Linenoise c
19a80 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
19a90 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
19aa0 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70  d linenoise_comp
19ab0 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
19ac0 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f  r *zLine, lineno
19ad0 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a  iseCompletions *
19ae0 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  lc){.  int nLine
19af0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
19b00 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  e);.  int i, iSt
19b10 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  art;.  sqlite3_s
19b20 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
19b30 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
19b40 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
19b50 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69  ..  if( nLine>si
19b60 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20  zeof(zBuf)-30 ) 
19b70 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c  return;.  if( zL
19b80 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20 72 65  ine[0]=='.' ) re
19b90 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c  turn;.  for(i=nL
19ba0 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28  ine-1; i>=0 && (
19bb0 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d  isalnum(zLine[i]
19bc0 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27  ) || zLine[i]=='
19bd0 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  _'); i--){}.  if
19be0 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72  ( i==nLine-1 ) r
19bf0 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20  eturn;.  iStart 
19c00 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28  = i+1;.  memcpy(
19c10 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74  zBuf, zLine, iSt
19c20 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  art);.  zSql = s
19c30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
19c40 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
19c50 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
19c60 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
19c90 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44  etion(%Q,%Q) ORD
19ca0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74     &zLine[iStart
19cd0 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c  ], zLine);.  sql
19ce0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
19cf0 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
19d00 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
19d10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19d20 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql);.  sqlite3_
19d30 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22  exec(globalDb, "
19d40 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
19d50 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a  t", 0, 0, 0); /*
19d60 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61   Load the schema
19d70 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   */.  while( sql
19d80 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
19d90 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
19da0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19db0 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63  zCompletion = (c
19dc0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
19dd0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
19de0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e  Stmt, 0);.    in
19df0 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20  t nCompletion = 
19e00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
19e10 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a  ytes(pStmt, 0);.
19e20 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e      if( iStart+n
19e30 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a  Completion < siz
19e40 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20  eof(zBuf)-1 ){. 
19e50 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
19e60 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65  +iStart, zComple
19e70 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f  tion, nCompletio
19e80 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  n+1);.      line
19e90 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69  noiseAddCompleti
19ea0 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20  on(lc, zBuf);.  
19eb0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
19ec0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
19ed0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
19ee0 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65  ** Do C-language
19ef0 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67   style dequoting
19f00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20  ..**.**    \a   
19f10 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20   -> alarm.**    
19f20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61  \b    -> backspa
19f30 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d  ce.**    \t    -
19f40 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20  > tab.**    \n  
19f50 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20    -> newline.** 
19f60 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74     \v    -> vert
19f70 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c  ical tab.**    \
19f80 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65  f    -> form fee
19f90 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e  d.**    \r    ->
19fa0 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72 6e   carriage return
19fb0 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20  .**    \s    -> 
19fc0 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20  space.**    \"  
19fd0 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20    -> ".**    \' 
19fe0 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c     -> '.**    \\
19ff0 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
1a000 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20  .**    \NNN  -> 
1a010 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72 20  ascii character 
1a020 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a  NNN in octal.*/.
1a030 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
1a040 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
1a050 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1a060 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a  i, j;.  char c;.
1a070 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
1a080 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20  z!='\\' ) z++;. 
1a090 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
1a0a0 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20   z[i])!=0; i++, 
1a0b0 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  j++){.    if( c=
1a0c0 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21  ='\\' && z[i+1]!
1a0d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  =0 ){.      c = 
1a0e0 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66  z[++i];.      if
1a0f0 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20  ( c=='a' ){.    
1a100 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20      c = '\a';.  
1a110 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1a120 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='b' ){.        
1a130 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20  c = '\b';.      
1a140 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27  }else if( c=='t'
1a150 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1a160 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\t';.      }els
1a170 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a  e if( c=='n' ){.
1a180 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
1a190 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a1a0 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20  ( c=='v' ){.    
1a1b0 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20      c = '\v';.  
1a1c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1a1d0 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
1a1e0 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20  c = '\f';.      
1a1f0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27  }else if( c=='r'
1a200 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1a210 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\r';.      }els
1a220 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
1a230 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b          c = '"';
1a240 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a250 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
1a260 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20      c = '\'';.  
1a270 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1a280 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
1a290 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20   c = '\\';.     
1a2a0 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
1a2b0 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20  ' && c<='7' ){. 
1a2c0 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b         c -= '0';
1a2d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
1a2e0 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
1a2f0 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
1a300 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1a310 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
1a320 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
1a330 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
1a340 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
1a350 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1a360 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1a370 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
1a380 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
1a390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a3a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a3b0 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b   }.    z[j] = c;
1a3c0 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29  .  }.  if( j<i )
1a3d0 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
1a3e0 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41  .** Interpret zA
1a3f0 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e 20  rg as either an 
1a400 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f  integer or a boo
1a410 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
1a420 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f  urn 1 or 0.** fo
1a430 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45  r TRUE and FALSE
1a440 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1a450 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20 61  teger value if a
1a460 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
1a470 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
1a480 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  nValue(const cha
1a490 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  r *zArg){.  int 
1a4a0 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  i;.  if( zArg[0]
1a4b0 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
1a4c0 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72  =='x' ){.    for
1a4d0 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61  (i=2; hexDigitVa
1a4e0 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b  lue(zArg[i])>=0;
1a4f0 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b   i++){}.  }else{
1a500 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41  .    for(i=0; zA
1a510 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41  rg[i]>='0' && zA
1a520 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29  rg[i]<='9'; i++)
1a530 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30  {}.  }.  if( i>0
1a540 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29   && zArg[i]==0 )
1a550 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e   return (int)(in
1a560 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29  tegerValue(zArg)
1a570 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
1a580 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1a590 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22  ricmp(zArg, "on"
1a5a0 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
1a5b0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65  stricmp(zArg,"ye
1a5c0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  s")==0 ){.    re
1a5d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1a5e0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
1a5f0 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d  p(zArg, "off")==
1a600 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
1a610 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d  icmp(zArg,"no")=
1a620 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1a630 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70   0;.  }.  utf8_p
1a640 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1a650 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c  RROR: Not a bool
1a660 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c  ean value: \"%s\
1a670 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f  ". Assuming \"no
1a680 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
1a690 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72    zArg);.  retur
1a6a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
1a6b0 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73 68 65  t or clear a she
1a6c0 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64 69 6e  ll flag accordin
1a6d0 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g to a boolean v
1a6e0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1a6f0 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61 72 46  void setOrClearF
1a700 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  lag(ShellState *
1a710 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61  p, unsigned mFla
1a720 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
1a730 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c  Arg){.  if( bool
1a740 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29 20 29  eanValue(zArg) )
1a750 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c  {.    ShellSetFl
1a760 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1a770 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c  }else{.    Shell
1a780 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c  ClearFlag(p, mFl
1a790 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ag);.  }.}../*.*
1a7a0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75  * Close an outpu
1a7b0 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67  t file, assuming
1a7c0 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 65 72   it is not stder
1a7d0 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73  r or stdout.*/.s
1a7e0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
1a7f0 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c  t_file_close(FIL
1a800 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66 20 26  E *f){.  if( f &
1a810 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26 20 66  & f!=stdout && f
1a820 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73  !=stderr ) fclos
1a830 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(f);.}../*.** T
1a840 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75  ry to open an ou
1a850 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54 68 65  tput file.   The
1a860 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74 22 20   names "stdout" 
1a870 61 6e 64 20 22 73 74 64 65 72 72 22 20 61 72 65  and "stderr" are
1a880 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  .** recognized a
1a890 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68 74 20  nd do the right 
1a8a0 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20  thing.  NULL is 
1a8b0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1a8c0 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61  output.** filena
1a8d0 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a  me is "off"..*/.
1a8e0 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f 75 74  static FILE *out
1a8f0 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f  put_file_open(co
1a900 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 29  nst char *zFile)
1a910 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69  {.  FILE *f;.  i
1a920 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
1a930 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a  "stdout")==0 ){.
1a940 20 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a      f = stdout;.
1a950 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1a960 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72  mp(zFile, "stder
1a970 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  r")==0 ){.    f 
1a980 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73  = stderr;.  }els
1a990 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
1a9a0 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b  le, "off")==0 ){
1a9b0 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65  .    f = 0;.  }e
1a9c0 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70  lse{.    f = fop
1a9d0 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b  en(zFile, "wb");
1a9e0 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  .    if( f==0 ){
1a9f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1aa00 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1aa10 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
1aa20 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29  "%s\"\n", zFile)
1aa30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1aa40 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20 21  turn f;.}..#if !
1aa50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
1aa60 4e 54 45 53 54 41 42 4c 45 29 0a 23 69 66 20 21  NTESTABLE).#if !
1aa70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1aa80 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64  MIT_TRACE) && !d
1aa90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1aaa0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1aab0 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69  T)./*.** A routi
1aac0 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  ne for handling 
1aad0 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69  output from sqli
1aae0 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a  te3_trace()..*/.
1aaf0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 5f 74  static int sql_t
1ab00 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  race_callback(. 
1ab10 20 75 6e 73 69 67 6e 65 64 20 6d 54 79 70 65 2c   unsigned mType,
1ab20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
1ab30 20 76 6f 69 64 20 2a 70 50 2c 0a 20 20 76 6f 69   void *pP,.  voi
1ab40 64 20 2a 70 58 0a 29 7b 0a 20 20 46 49 4c 45 20  d *pX.){.  FILE 
1ab50 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41 72 67  *f = (FILE*)pArg
1ab60 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1ab70 45 54 45 52 28 6d 54 79 70 65 29 3b 0a 20 20 55  ETER(mType);.  U
1ab80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ab90 70 50 29 3b 0a 20 20 69 66 28 20 66 20 29 7b 0a  pP);.  if( f ){.
1aba0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1abb0 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
1abc0 29 70 58 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d  )pX;.    int i =
1abd0 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
1abe0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
1abf0 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 69  z[i-1]==';' ){ i
1ac00 2d 2d 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f 70  --; }.    utf8_p
1ac10 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b 5c  rintf(f, "%.*s;\
1ac20 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20  n", i, z);.  }. 
1ac30 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1ac40 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
1ac50 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
1ac60 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
1ac70 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
1ac80 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
1ac90 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
1aca0 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
1acb0 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
1acc0 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
1acd0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
1ace0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
1acf0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
1ad00 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
1ad10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
1ad20 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
1ad30 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
1ad40 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
1ad50 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1ad60 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
1ad70 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
1ad80 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
1ad90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1ada0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
1adb0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
1adc0 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
1add0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
1ade0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
1adf0 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
1ae00 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
1ae10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
1ae20 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
1ae30 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
1ae40 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1ae50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ae60 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
1ae70 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
1ae80 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
1ae90 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
1aea0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
1aeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1aec0 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
1aed0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
1aee0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
1aef0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
1af00 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
1af10 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
1af20 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
1af30 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
1af40 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
1af50 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
1af60 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
1af70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1af80 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
1af90 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
1afa0 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
1afb0 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
1afc0 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
1afd0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
1afe0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
1aff0 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
1b000 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
1b010 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
1b020 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
1b030 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
1b040 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
1b050 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
1b060 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1b070 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
1b080 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
1b090 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
1b0a0 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
1b0b0 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
1b0c0 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a   if( p->z==0 ){.
1b0d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
1b0e0 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66  (stderr, "out of
1b0f0 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
1b100 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
1b110 7d 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e  }.  }.  p->z[p->
1b120 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a  n++] = (char)c;.
1b130 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
1b140 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56  gle field of CSV
1b150 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62   text.  Compatib
1b160 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30 20  le with rfc4180 
1b170 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20  and extended.** 
1b180 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20  with the option 
1b190 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70 61  of having a sepa
1b1a0 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
1b1b0 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20   ","..**.**   + 
1b1c0 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
1b1d0 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
1b1e0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
1b1f0 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
1b200 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
1b210 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
1b220 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
1b230 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1b240 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1b250 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
1b260 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
1b270 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
1b280 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ,"..**   +  Use 
1b290 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
1b2a0 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
1b2b0 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
1b2c0 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70  n"..**   +  Keep
1b2d0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69   track of the li
1b2e0 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ne number in p->
1b2f0 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
1b300 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
1b310 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1b320 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
1b330 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
1b340 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
1b350 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
1b360 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
1b370 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
1b380 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
1b390 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
1b3a0 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
1b3b0 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
1b3c0 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1b3d0 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
1b3e0 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
1b3f0 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
1b400 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
1b410 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1b420 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
1b430 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
1b440 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
1b450 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
1b460 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22  .  }.  if( c=='"
1b470 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c  ' ){.    int pc,
1b480 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74   ppc;.    int st
1b490 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69  artLine = p->nLi
1b4a0 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f  ne;.    int cQuo
1b4b0 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d  te = c;.    pc =
1b4c0 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68   ppc = 0;.    wh
1b4d0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
1b4e0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1b4f0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72  ;.      if( c==r
1b500 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  Sep ) p->nLine++
1b510 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63  ;.      if( c==c
1b520 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
1b530 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
1b540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  ){.          pc 
1b550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
1b560 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b570 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1b580 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26   if( (c==cSep &&
1b590 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1b5a0 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
1b5b0 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
1b5c0 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65        || (c==rSe
1b5d0 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26  p && pc=='\r' &&
1b5e0 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20   ppc==cQuote).  
1b5f0 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20       || (c==EOF 
1b600 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  && pc==cQuote). 
1b610 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b620 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69  do{ p->n--; }whi
1b630 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d  le( p->z[p->n]!=
1b640 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20  cQuote );.      
1b650 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
1b660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b680 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63   pc==cQuote && c
1b690 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  !='\r' ){.      
1b6a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1b6b0 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
1b6c0 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72 61  escaped %c chara
1b6d0 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  cter\n",.       
1b6e0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c           p->zFil
1b6f0 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75  e, p->nLine, cQu
1b700 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ote);.      }.  
1b710 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29      if( c==EOF )
1b720 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1b730 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
1b740 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74  s:%d: unterminat
1b750 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65  ed %c-quoted fie
1b760 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
1b770 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
1b780 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f   startLine, cQuo
1b790 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  te);.        p->
1b7a0 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20  cTerm = c;.     
1b7b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b7c0 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  }.      import_a
1b7d0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1b7e0 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70 63  ;.      ppc = pc
1b7f0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a  ;.      pc = c;.
1b800 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b810 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1b820 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1b830 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e   being parsed an
1b840 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74 68  d it begins with
1b850 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d   the.    ** UTF-
1b860 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20  8 BOM  (0xEF BB 
1b870 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  BF) then skip th
1b880 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28  e BOM */.    if(
1b890 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20   (c&0xff)==0xef 
1b8a0 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d  && p->bNotFirst=
1b8b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  =0 ){.      impo
1b8c0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1b8d0 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
1b8e0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1b8f0 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
1b900 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20  ==0xbb ){.      
1b910 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1b920 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1b930 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
1b940 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >in);.        if
1b950 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66  ( (c&0xff)==0xbf
1b960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1b970 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
1b980 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d            p->n =
1b990 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1b9a0 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e  turn csv_read_on
1b9b0 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20  e_field(p);.    
1b9c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b9d0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63    }.    while( c
1b9e0 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70  !=EOF && c!=cSep
1b9f0 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20   && c!=rSep ){. 
1ba00 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
1ba10 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
1ba20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
1ba30 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->in);.    }.   
1ba40 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
1ba50 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b        p->nLine++
1ba60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
1ba70 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d  >0 && p->z[p->n-
1ba80 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d  1]=='\r' ) p->n-
1ba90 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  -;.    }.    p->
1baa0 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20  cTerm = c;.  }. 
1bab0 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a   if( p->z ) p->z
1bac0 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d  [p->n] = 0;.  p-
1bad0 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a  >bNotFirst = 1;.
1bae0 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d    return p->z;.}
1baf0 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67  ../* Read a sing
1bb00 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49  le field of ASCI
1bb10 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74  I delimited text
1bb20 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
1bb30 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
1bb40 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
1bb50 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
1bb60 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
1bb70 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
1bb80 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
1bb90 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
1bba0 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
1bbb0 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
1bbc0 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
1bbd0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1bbe0 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46  default is "\x1F
1bbf0 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  "..**   +  Use p
1bc00 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f  ->rSep as the ro
1bc10 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
1bc20 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78  e default is "\x
1bc30 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  1E"..**   +  Kee
1bc40 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72  p track of the r
1bc50 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e  ow number in p->
1bc60 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53  nLine..**   +  S
1bc70 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63 74  tore the charact
1bc80 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1bc90 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20  es the field in 
1bca0 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65  p->cTerm.  Store
1bcb0 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20  .**      EOF on 
1bcc0 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20  end-of-file..** 
1bcd0 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74    +  Report synt
1bce0 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64  ax errors on std
1bcf0 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  err.*/.static ch
1bd00 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c  ar *SQLITE_CDECL
1bd10 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
1bd20 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20  field(ImportCtx 
1bd30 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *p){.  int c;.  
1bd40 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43  int cSep = p->cC
1bd50 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65  olSep;.  int rSe
1bd60 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a  p = p->cRowSep;.
1bd70 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20    p->n = 0;.  c 
1bd80 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1bd90 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20    if( c==EOF || 
1bda0 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b  seenInterrupt ){
1bdb0 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
1bdc0 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  EOF;.    return 
1bdd0 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
1bde0 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
1bdf0 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
1be00 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
1be10 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
1be20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1be30 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d  n);.  }.  if( c=
1be40 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e  =rSep ){.    p->
1be50 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70  nLine++;.  }.  p
1be60 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69  ->cTerm = c;.  i
1be70 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
1be80 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  ->n] = 0;.  retu
1be90 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn p->z;.}../*.*
1bea0 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
1beb0 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  r data for table
1bec0 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20   zTable.  If an 
1bed0 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68  error is seen wh
1bee0 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f  ile.** moving fo
1bef0 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f  rward, try to go
1bf00 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65   backwards.  The
1bf10 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d   backwards movem
1bf20 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72  ent won't.** wor
1bf30 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  k for WITHOUT RO
1bf40 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  WID tables..*/.s
1bf50 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
1bf60 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65  CloneData(.  She
1bf70 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
1bf80 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
1bf90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1bfa0 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  le.){.  sqlite3_
1bfb0 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
1bfc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1bfd0 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
1bfe0 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20   char *zQuery = 
1bff0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65  0;.  char *zInse
1c000 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rt = 0;.  int rc
1c010 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
1c020 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20  .  int nTable = 
1c030 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29  strlen30(zTable)
1c040 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20  ;.  int k = 0;. 
1c050 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1c060 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61  const int spinRa
1c070 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a  te = 10000;..  z
1c080 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
1c090 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1c0a0 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20  * FROM \"%w\"", 
1c0b0 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20  zTable);.  rc = 
1c0c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1c0d0 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
1c0e0 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
1c0f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1c100 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1c110 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64  tderr, "Error %d
1c120 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  : %s on [%s]\n",
1c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1c140 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1c150 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
1c160 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1c170 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
1c180 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f   zQuery);.    go
1c190 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  to end_data_xfer
1c1a0 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69  ;.  }.  n = sqli
1c1b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
1c1c0 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73  (pQuery);.  zIns
1c1d0 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ert = sqlite3_ma
1c1e0 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61  lloc64(200 + nTa
1c1f0 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66  ble + n*3);.  if
1c200 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a  ( zInsert==0 ){.
1c210 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
1c220 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d  tderr, "out of m
1c230 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 67  emory\n");.    g
1c240 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
1c250 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
1c260 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54  _snprintf(200+nT
1c270 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20  able,zInsert,.  
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c290 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
1c2a0 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56  RE INTO \"%s\" V
1c2b0 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
1c2c0 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33  );.  i = strlen3
1c2d0 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f  0(zInsert);.  fo
1c2e0 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29  r(j=1; j<n; j++)
1c2f0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e  {.    memcpy(zIn
1c300 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29  sert+i, ",?", 2)
1c310 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20  ;.    i += 2;.  
1c320 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65  }.  memcpy(zInse
1c330 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a  rt+i, ");", 3);.
1c340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1c350 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c  repare_v2(newDb,
1c360 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70   zInsert, -1, &p
1c370 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66  Insert, 0);.  if
1c380 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
1c390 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1c3a0 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
1c3b0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
1c3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1c3d0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
1c3e0 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ewDb), sqlite3_e
1c3f0 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20  rrmsg(newDb),.  
1c400 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
1c410 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
1c420 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
1c430 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b   for(k=0; k<2; k
1c440 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ++){.    while( 
1c450 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
1c460 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
1c470 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
1c480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
1c490 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69  ++){.        swi
1c4a0 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
1c4b0 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c  umn_type(pQuery,
1c4c0 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
1c4d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
1c4e0 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
1c4f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1c500 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29  ll(pInsert, i+1)
1c510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1c520 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1c530 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1c540 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
1c550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1c560 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1c570 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
1c580 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1c590 74 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  t64(pQuery,i));.
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1c5b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1c5c0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
1c5d0 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
1c5e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c5f0 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49  3_bind_double(pI
1c600 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
1c610 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
1c620 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  e(pQuery,i));.  
1c630 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c650 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1c660 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
1c670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1c680 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74  ind_text(pInsert
1c690 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20  , i+1,.         
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
1c6c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1c6d0 74 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a  text(pQuery,i),.
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
1c700 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1c710 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1c720 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1c730 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
1c740 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
1c750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c760 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73  3_bind_blob(pIns
1c770 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
1c780 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51  3_column_blob(pQ
1c790 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1c7d0 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79  umn_bytes(pQuery
1c7e0 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1c820 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1c830 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1c840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c850 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a  } /* End for */.
1c860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c870 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
1c880 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c890 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1c8a0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72  =SQLITE_ROW && r
1c8b0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1c8c0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1c8d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1c8e0 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20  rror %d: %s\n", 
1c8f0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1c900 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
1c910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c930 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b  _errmsg(newDb));
1c940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c950 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e  qlite3_reset(pIn
1c960 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74  sert);.      cnt
1c970 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  ++;.      if( (c
1c980 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20  nt%spinRate)==0 
1c990 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
1c9a0 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c  f("%c\b", "|/-\\
1c9b0 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29  "[(cnt/spinRate)
1c9c0 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66  %4]);.        ff
1c9d0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
1c9e0 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45      }.    } /* E
1c9f0 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20  nd while */.    
1ca00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1ca10 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ONE ) break;.   
1ca20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1ca30 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  e(pQuery);.    s
1ca40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
1ca50 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20  ry);.    zQuery 
1ca60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1ca70 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
1ca80 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59   \"%w\" ORDER BY
1ca90 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20   rowid DESC;",. 
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 7a 54 61 62              zTab
1cac0 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
1cad0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1cae0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
1caf0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
1cb00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1cb10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1cb20 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
1cb30 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c  g: cannot step \
1cb40 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22  "%s\" backwards"
1cb50 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , zTable);.     
1cb60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1cb70 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30  } /* End for(k=0
1cb80 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74  ...) */..end_dat
1cb90 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
1cba0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
1cbb0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  y);.  sqlite3_fi
1cbc0 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
1cbd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1cbe0 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  zQuery);.  sqlit
1cbf0 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29  e3_free(zInsert)
1cc00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
1cc10 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20  to transfer all 
1cc20 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65  rows of the sche
1cc30 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57  ma that match zW
1cc40 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61  here.  For.** ea
1cc50 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78  ch row, invoke x
1cc60 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65  ForEach() on the
1cc70 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20   object defined 
1cc80 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20  by that row..** 
1cc90 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
1cca0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
1ccb0 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20   moving forward 
1ccc0 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73  through the.** s
1ccd0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1cce0 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f  le, try again mo
1ccf0 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a  ving backwards..
1cd00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1cd10 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
1cd20 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
1cd30 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ,.  sqlite3 *new
1cd40 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
1cd50 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64   *zWhere,.  void
1cd60 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65   (*xForEach)(She
1cd70 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33  llState*,sqlite3
1cd80 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  *,const char*).)
1cd90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1cda0 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
1cdb0 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30  char *zQuery = 0
1cdc0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
1cdd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1cde0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
1cdf0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ce00 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
1ce10 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a  ErrMsg = 0;..  z
1ce20 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
1ce30 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1ce40 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  name, sql FROM s
1ce50 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
1ce80 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20   %s", zWhere);. 
1ce90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1cea0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
1ceb0 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
1cec0 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ery, 0);.  if( r
1ced0 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1cee0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1cef0 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
1cf00 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1cf20 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1cf30 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
1cf40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1cf50 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
1cf60 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
1cf70 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  ;.    goto end_s
1cf80 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  chema_xfer;.  }.
1cf90 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
1cfa0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
1cfb0 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ry))==SQLITE_ROW
1cfc0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
1cfd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1cfe0 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
1cff0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1d000 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1d010 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70  Query, 1);.    p
1d020 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
1d030 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
1d040 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  tdout);.    sqli
1d050 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
1d060 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
1d070 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
1d080 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
1d090 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
1d0a0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1d0b0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
1d0c0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
1d0d0 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
1d0e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
1d0f0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45  rrMsg);.      zE
1d100 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
1d110 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63  .    if( xForEac
1d120 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45  h ){.      xForE
1d130 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
1d140 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
1d150 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
1d160 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20  ntf("done\n");. 
1d170 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1d180 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1d190 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1d1a0 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
1d1b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1d1c0 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
1d1d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1d1e0 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73  ("SELECT name, s
1d1f0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
1d200 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f      " WHERE %s O
1d230 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
1d240 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  SC", zWhere);.  
1d250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1d260 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
1d270 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
1d280 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
1d290 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
1d2a0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1d2b0 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25  , "Error: (%d) %
1d2c0 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
1d2f0 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e  nded_errcode(p->
1d300 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
1d310 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20  msg(p->db),.    
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20    zQuery);.     
1d340 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
1d350 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  _xfer;.    }.   
1d360 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
1d370 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
1d380 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
1d390 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
1d3a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d3b0 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
1d3c0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
1d3d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1d3e0 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
1d3f0 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e      printf("%s..
1d400 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c  . ", zName); ffl
1d410 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
1d420 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1d430 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
1d440 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  ar*)zSql, 0, 0, 
1d450 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
1d460 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
1d470 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1d480 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d490 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
1d4a0 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
1d4b0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Sql);.        sq
1d4c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1d4d0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  sg);.        zEr
1d4e0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
1d4f0 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72  }.      if( xFor
1d500 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Each ){.        
1d510 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44  xForEach(p, newD
1d520 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
1d530 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1d540 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f        printf("do
1d550 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ne\n");.    }.  
1d560 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  }.end_schema_xfe
1d570 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
1d580 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
1d590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
1d5a0 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  uery);.}../*.** 
1d5b0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1d5c0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  ase file named "
1d5d0 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f  zNewDb".  Try to
1d5e0 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68   recover as much
1d5f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1d600 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20  as possible out 
1d610 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
1d620 62 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68  base (which migh
1d630 74 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e  t be corrupt) an
1d640 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e  d write it.** in
1d650 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74  to zNewDb..*/.st
1d660 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
1d670 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lone(ShellState 
1d680 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1d690 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72  zNewDb){.  int r
1d6a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  c;.  sqlite3 *ne
1d6b0 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  wDb = 0;.  if( a
1d6c0 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d  ccess(zNewDb,0)=
1d6d0 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
1d6e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
1d6f0 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ile \"%s\" alrea
1d700 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a  dy exists.\n", z
1d710 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75  NewDb);.    retu
1d720 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rn;.  }.  rc = s
1d730 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77  qlite3_open(zNew
1d740 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69  Db, &newDb);.  i
1d750 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1d760 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1d770 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
1d780 6f 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a  output database:
1d790 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1d7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
1d7b0 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65  sg(newDb));.  }e
1d7c0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1d7d0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
1d7e0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
1d7f0 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c  hema=ON;", 0, 0,
1d800 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1d810 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45  _exec(newDb, "BE
1d820 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c  GIN EXCLUSIVE;",
1d830 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74   0, 0, 0);.    t
1d840 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
1d850 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d  p, newDb, "type=
1d860 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43  'table'", tryToC
1d870 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74  loneData);.    t
1d880 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
1d890 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21  p, newDb, "type!
1d8a0 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20  ='table'", 0);. 
1d8b0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1d8c0 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22  newDb, "COMMIT;"
1d8d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1d8e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1d8f0 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
1d900 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
1d910 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
1d920 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
1d930 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (newDb);.}../*.*
1d940 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74  * Change the out
1d950 70 75 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  put file back to
1d960 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69   stdout.*/.stati
1d970 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65  c void output_re
1d980 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
1d990 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74  p){.  if( p->out
1d9a0 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  file[0]=='|' ){.
1d9b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d9c0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63  MIT_POPEN.    pc
1d9d0 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65  lose(p->out);.#e
1d9e0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1d9f0 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
1da00 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d  ose(p->out);.  }
1da10 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  .  p->outfile[0]
1da20 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d   = 0;.  p->out =
1da30 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   stdout;.}../*.*
1da40 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d  * Run an SQL com
1da50 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  mand and return 
1da60 74 68 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67  the single integ
1da70 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  er result..*/.st
1da80 61 74 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28  atic int db_int(
1da90 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
1daa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
1dab0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1dac0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
1dad0 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  es = 0;.  sqlite
1dae0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1daf0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
1db00 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
1db10 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
1db20 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
1db30 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1db40 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  res = sqlite3_co
1db50 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
1db60 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1db70 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1db80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1db90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1dba0 20 61 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62   a 2-byte or 4-b
1dbb0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1dbc0 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61  nteger into a na
1dbd0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
1dbe0 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
1dbf0 69 6e 74 20 67 65 74 32 62 79 74 65 49 6e 74 28  int get2byteInt(
1dc00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1dc10 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30  ){.  return (a[0
1dc20 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a  ]<<8) + a[1];.}.
1dc30 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
1dc40 69 6e 74 20 67 65 74 34 62 79 74 65 49 6e 74 28  int get4byteInt(
1dc50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1dc60 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30  ){.  return (a[0
1dc70 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c  ]<<24) + (a[1]<<
1dc80 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20  16) + (a[2]<<8) 
1dc90 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  + a[3];.}../*.**
1dca0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1dcb0 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63  of the ".info" c
1dcc0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ommand..**.** Re
1dcd0 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
1dce0 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
1dcf0 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
1dd00 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
1dd10 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28  _dbinfo_command(
1dd20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69  ShellState *p, i
1dd30 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
1dd40 61 7a 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63  azArg){.  static
1dd50 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
1dd60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1dd70 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61  e; int ofst; } a
1dd80 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  Field[] = {.    
1dd90 20 7b 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20   { "file change 
1dda0 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20  counter:",  24  
1ddb0 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62  },.     { "datab
1ddc0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22  ase page count:"
1ddd0 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  28  },.     {
1dde0 20 22 66 72 65 65 6c 69 73 74 20 70 61 67 65 20   "freelist page 
1ddf0 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c  count:",  36  },
1de00 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
1de10 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20  cookie:",       
1de20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   40  },.     { "
1de30 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c  schema format:",
1de40 20 20 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20          44  },. 
1de50 20 20 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63      { "default c
1de60 61 63 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34  ache size:",   4
1de70 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75  8  },.     { "au
1de80 74 6f 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f  tovacuum top roo
1de90 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20  t:",  52  },.   
1dea0 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c    { "incremental
1deb0 20 76 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20   vacuum:",   64 
1dec0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74   },.     { "text
1ded0 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20   encoding:",    
1dee0 20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20      56  },.     
1def0 7b 20 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a  { "user version:
1df00 22 2c 20 20 20 20 20 20 20 20 20 36 30 20 20 7d  ",         60  }
1df10 2c 0a 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63  ,.     { "applic
1df20 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20  ation id:",     
1df30 20 20 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    68  },.     { 
1df40 22 73 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f  "software versio
1df50 6e 3a 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a  n:",     96  },.
1df60 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
1df70 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
1df80 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
1df90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
1dfa0 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b  ; } aQuery[] = {
1dfb0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
1dfc0 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20  of tables:",.   
1dfd0 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
1dfe0 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
1dff0 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22  RE type='table'"
1e000 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62   },.     { "numb
1e010 65 72 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c  er of indexes:",
1e020 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1e030 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
1e040 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64   WHERE type='ind
1e050 65 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ex'" },.     { "
1e060 6e 75 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65  number of trigge
1e070 72 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  rs:",.       "SE
1e080 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1e090 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
1e0a0 3d 27 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20  ='trigger'" },. 
1e0b0 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
1e0c0 20 76 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20   views:",.      
1e0d0 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
1e0e0 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
1e0f0 74 79 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a  type='view'" },.
1e100 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73       { "schema s
1e110 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ize:",.       "S
1e120 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67  ELECT total(leng
1e130 74 68 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73  th(sql)) FROM %s
1e140 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  " },.  };.  int 
1e150 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65  i;.  char *zSche
1e160 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a  maTab;.  char *z
1e170 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  Db = nArg>=2 ? a
1e180 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22  zArg[1] : "main"
1e190 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1e1a0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75   *pStmt = 0;.  u
1e1b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64  nsigned char aHd
1e1c0 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64  r[100];.  open_d
1e1d0 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  b(p, 0);.  if( p
1e1e0 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
1e1f0 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72   1;.  sqlite3_pr
1e200 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22  epare_v2(p->db,"
1e210 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
1e220 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f   sqlite_dbpage(?
1e230 31 29 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22  1) WHERE pgno=1"
1e240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e250 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d         -1, &pStm
1e260 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
1e270 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
1e280 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51  , 1, zDb, -1, SQ
1e290 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1e2a0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
1e2b0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
1e2c0 52 4f 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ROW.   && sqlite
1e2d0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1e2e0 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b  Stmt,0)>100.  ){
1e2f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72  .    memcpy(aHdr
1e300 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1e310 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20  _blob(pStmt,0), 
1e320 31 30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  100);.    sqlite
1e330 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1e340 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e350 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1e360 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65  r, "unable to re
1e370 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
1e380 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  er\n");.    sqli
1e390 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1e3a0 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  mt);.    return 
1e3b0 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74  1;.  }.  i = get
1e3c0 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36  2byteInt(aHdr+16
1e3d0 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20  );.  if( i==1 ) 
1e3e0 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66  i = 65536;.  utf
1e3f0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
1e400 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
1e410 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
1e420 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38  ze:", i);.  utf8
1e430 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1e440 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77  "%-20s %d\n", "w
1e450 72 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61  rite format:", a
1e460 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38  Hdr[18]);.  utf8
1e470 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1e480 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72  "%-20s %d\n", "r
1e490 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48  ead format:", aH
1e4a0 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f  dr[19]);.  utf8_
1e4b0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1e4c0 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65  %-20s %d\n", "re
1e4d0 73 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20  served bytes:", 
1e4e0 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72  aHdr[20]);.  for
1e4f0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
1e500 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b  e(aField); i++){
1e510 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20  .    int ofst = 
1e520 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a  aField[i].ofst;.
1e530 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1e540 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49   val = get4byteI
1e550 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b  nt(aHdr + ofst);
1e560 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1e570 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
1e580 25 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a  %u", aField[i].z
1e590 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20  Name, val);.    
1e5a0 73 77 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a  switch( ofst ){.
1e5b0 20 20 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b        case 56: {
1e5c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
1e5d0 3d 3d 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==1 ) raw_printf
1e5e0 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38  (p->out, " (utf8
1e5f0 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )");.        if(
1e600 20 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72   val==2 ) raw_pr
1e610 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28  intf(p->out, " (
1e620 75 74 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20  utf16le)");.    
1e630 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29      if( val==3 )
1e640 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1e650 75 74 2c 20 22 20 28 75 74 66 31 36 62 65 29 22  ut, " (utf16be)"
1e660 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e670 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
1e680 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
1e690 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20   }.  if( zDb==0 
1e6a0 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  ){.    zSchemaTa
1e6b0 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
1e6c0 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65  ntf("main.sqlite
1e6d0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c  _master");.  }el
1e6e0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44  se if( strcmp(zD
1e6f0 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a  b,"temp")==0 ){.
1e700 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
1e710 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1e720 28 22 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74  ("%s", "sqlite_t
1e730 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20  emp_master");.  
1e740 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65  }else{.    zSche
1e750 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
1e760 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e  mprintf("\"%w\".
1e770 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
1e780 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  zDb);.  }.  for(
1e790 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1e7a0 28 61 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a  (aQuery); i++){.
1e7b0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
1e7c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1e7d0 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c  (aQuery[i].zSql,
1e7e0 20 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20   zSchemaTab);.  
1e7f0 20 20 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69    int val = db_i
1e800 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  nt(p, zSql);.   
1e810 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1e820 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  ql);.    utf8_pr
1e830 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1e840 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72  20s %d\n", aQuer
1e850 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29  y[i].zName, val)
1e860 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e870 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29  free(zSchemaTab)
1e880 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1e890 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1e8a0 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
1e8b0 5f 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20  _errmsg() value 
1e8c0 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
1e8d0 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  turn 1..*/.stati
1e8e0 63 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62  c int shellDatab
1e8f0 61 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33  aseError(sqlite3
1e900 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
1e910 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69  har *zErr = sqli
1e920 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
1e930 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1e940 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
1e950 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65  \n", zErr);.  re
1e960 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1e970 20 50 72 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66   Print an out-of
1e980 2d 6d 65 6d 6f 72 79 20 6d 65 73 73 61 67 65 20  -memory message 
1e990 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
1e9a0 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  turn 1..*/.stati
1e9b0 63 20 69 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d  c int shellNomem
1e9c0 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72  Error(void){.  r
1e9d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
1e9e0 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
1e9f0 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72   memory\n");.  r
1ea00 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1ea10 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61  * Compare the pa
1ea20 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d  ttern in zGlob[]
1ea30 20 61 67 61 69 6e 73 74 20 74 68 65 20 74 65 78   against the tex
1ea40 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72  t in z[].  Retur
1ea50 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65  n TRUE.** if the
1ea60 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53  y match and FALS
1ea70 45 20 28 30 29 20 69 66 20 74 68 65 79 20 64 6f  E (0) if they do
1ea80 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a   not match..**.*
1ea90 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73  * Globbing rules
1eaa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27  :.**.**      '*'
1eab0 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
1eac0 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a  ny sequence of z
1ead0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  ero or more char
1eae0 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  acters..**.**   
1eaf0 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74     '?'       Mat
1eb00 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  ches exactly one
1eb10 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a   character..**.*
1eb20 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20  *     [...]     
1eb30 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
1eb40 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20  racter from the 
1eb50 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66  enclosed list of
1eb60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1eb70 20 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a     characters..*
1eb80 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20  *.**     [^...] 
1eb90 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
1eba0 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e  character not in
1ebb0 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
1ebc0 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  st..**.**      '
1ebd0 23 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  #'       Matches
1ebe0 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
1ebf0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67   one or more dig
1ec00 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20  its with an.**  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
1ec20 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69  tional + or - si
1ec30 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a  gn in front.**.*
1ec40 2a 20 20 20 20 20 20 27 20 27 20 20 20 20 20 20  *      ' '      
1ec50 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69   Any span of whi
1ec60 74 65 73 70 61 63 65 20 6d 61 74 63 68 65 73 20  tespace matches 
1ec70 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f  any other span o
1ec80 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
1ec90 20 20 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a      whitespace..
1eca0 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74  **.** Extra whit
1ecb0 65 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e  espace at the en
1ecc0 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f  d of z[] is igno
1ecd0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1ece0 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  nt testcase_glob
1ecf0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c  (const char *zGl
1ed00 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ob, const char *
1ed10 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b  z){.  int c, c2;
1ed20 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20  .  int invert;. 
1ed30 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68   int seen;..  wh
1ed40 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c  ile( (c = (*(zGl
1ed50 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20  ob++)))!=0 ){.  
1ed60 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
1ed70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49   ){.      if( !I
1ed80 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74  sSpace(*z) ) ret
1ed90 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69  urn 0;.      whi
1eda0 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c  le( IsSpace(*zGl
1edb0 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20  ob) ) zGlob++;. 
1edc0 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
1edd0 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
1ede0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1edf0 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69  '*' ){.      whi
1ee00 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b  le( (c=(*(zGlob+
1ee10 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63  +))) == '*' || c
1ee20 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='?' ){.       
1ee30 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28   if( c=='?' && (
1ee40 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74  *(z++))==0 ) ret
1ee50 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1ee60 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
1ee70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ee80 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1ee90 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
1eea0 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26       while( *z &
1eeb0 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  & testcase_glob(
1eec0 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b  zGlob-1,z)==0 ){
1eed0 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a  .          z++;.
1eee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eef0 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30    return (*z)!=0
1ef00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ef10 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28  while( (c2 = (*(
1ef20 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  z++)))!=0 ){.   
1ef30 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d       while( c2!=
1ef40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  c ){.          c
1ef50 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  2 = *(z++);.    
1ef60 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
1ef70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1ef80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ef90 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  ( testcase_glob(
1efa0 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72  zGlob,z) ) retur
1efb0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1efc0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1efd0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f   }else if( c=='?
1efe0 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ' ){.      if( (
1eff0 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74  *(z++))==0 ) ret
1f000 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
1f010 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20   if( c=='[' ){. 
1f020 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63       int prior_c
1f030 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e   = 0;.      seen
1f040 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65   = 0;.      inve
1f050 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20  rt = 0;.      c 
1f060 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
1f070 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
1f080 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20  n 0;.      c2 = 
1f090 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
1f0a0 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b    if( c2=='^' ){
1f0b0 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72 74 20  .        invert 
1f0c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
1f0d0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
1f0e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f0f0 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2==']' ){.     
1f100 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
1f110 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
1f120 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
1f130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f140 20 77 68 69 6c 65 28 20 63 32 20 26 26 20 63 32   while( c2 && c2
1f150 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
1f160 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20   if( c2=='-' && 
1f170 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26  zGlob[0]!=']' &&
1f180 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20   zGlob[0]!=0 && 
1f190 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20  prior_c>0 ){.   
1f1a0 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
1f1b0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  lob++);.        
1f1c0 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63    if( c>=prior_c
1f1d0 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e   && c<=c2 ) seen
1f1e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1f1f0 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
1f200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f210 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20        if( c==c2 
1f220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1f230 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1f240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1f250 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
1f260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
1f270 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1f280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f290 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e  ( c2==0 || (seen
1f2a0 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20   ^ invert)==0 ) 
1f2b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
1f2c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29  lse if( c=='#' )
1f2d0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30  {.      if( (z[0
1f2e0 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d  ]=='-' || z[0]==
1f2f0 27 2b 27 29 20 26 26 20 49 73 44 69 67 69 74 28  '+') && IsDigit(
1f300 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  z[1]) ) z++;.   
1f310 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28     if( !IsDigit(
1f320 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30  z[0]) ) return 0
1f330 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
1f340 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
1f350 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20  t(z[0]) ){ z++; 
1f360 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1f370 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b     if( c!=(*(z++
1f380 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  )) ) return 0;. 
1f390 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65     }.  }.  while
1f3a0 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b  ( IsSpace(*z) ){
1f3b0 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e   z++; }.  return
1f3c0 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   *z==0;.}.../*.*
1f3d0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74  * Compare the st
1f3e0 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e  ring as a comman
1f3f0 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69  d-line option wi
1f400 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72  th either one or
1f410 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   two.** initial 
1f420 22 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a  "-" characters..
1f430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
1f440 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
1f450 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73  char *zStr, cons
1f460 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20  t char *zOpt){. 
1f470 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d   if( zStr[0]!='-
1f480 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
1f490 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53  zStr++;.  if( zS
1f4a0 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74  tr[0]=='-' ) zSt
1f4b0 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74  r++;.  return st
1f4c0 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29  rcmp(zStr, zOpt)
1f4d0 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ==0;.}../*.** De
1f4e0 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lete a file..*/.
1f4f0 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46  int shellDeleteF
1f500 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
1f510 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
1f520 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49  t rc;.#ifdef _WI
1f530 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a  N32.  wchar_t *z
1f540 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
1f550 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65  _utf8_to_unicode
1f560 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72  (zFilename);.  r
1f570 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b  c = _wunlink(z);
1f580 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1f590 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  z);.#else.  rc =
1f5a0 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
1f5b0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  e);.#endif.  ret
1f5c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1f5d0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1f5e0 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c  tion of SQL scal
1f5f0 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79  ar function fkey
1f600 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
1f610 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68  ), used.** by th
1f620 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e  e ".lint fkey-in
1f630 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20  dexes" command. 
1f640 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63  This scalar func
1f650 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a  tion is always.*
1f660 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f  * called with fo
1f670 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74  ur arguments - t
1f680 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
1f690 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74  name, the parent
1f6a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a   column name,.**
1f6b0 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
1f6c0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68   name and the ch
1f6d0 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  ild column name.
1f6e0 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f  .**.**   fkey_co
1f6f0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61  llate_clause('pa
1f700 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65  rent-tab', 'pare
1f710 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d  nt-col', 'child-
1f720 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c  tab', 'child-col
1f730 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  ').**.** If eith
1f740 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  er of the named 
1f750 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e  tables or column
1f760 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20  s do not exist, 
1f770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1f780 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74   returns an empt
1f790 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70  y string. An emp
1f7a0 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73  ty string is als
1f7b0 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f  o returned if bo
1f7c0 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64  th tables.** and
1f7d0 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62   columns exist b
1f7e0 75 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ut have the same
1f7f0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
1f800 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c  on sequence. Or,
1f810 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73  .** if both exis
1f820 74 20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c  t but the defaul
1f830 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
1f840 65 6e 63 65 73 20 61 72 65 20 64 69 66 66 65 72  ences are differ
1f850 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ent, this.** fun
1f860 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
1f870 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41  e string " COLLA
1f880 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61  TE <parent-colla
1f890 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a  tion>", where.**
1f8a0 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
1f8b0 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61 75  on> is the defau
1f8c0 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
1f8d0 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72  uence of the par
1f8e0 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ent column..*/.s
1f8f0 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
1f900 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73  FkeyCollateClaus
1f910 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
1f920 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e  text *pCtx,.  in
1f930 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65  t nVal,.  sqlite
1f940 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a  3_value **apVal.
1f950 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f960 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
1f970 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
1f980 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x);.  const char
1f990 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e   *zParent;.  con
1f9a0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
1f9b0 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Col;.  const cha
1f9c0 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20  r *zParentSeq;. 
1f9d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
1f9e0 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ild;.  const cha
1f9f0 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20  r *zChildCol;.  
1fa00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
1fa10 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49  ldSeq = 0;  /* I
1fa20 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f  nitialize to avo
1fa30 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76  id false-positiv
1fa40 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69  e warning */.  i
1fa50 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1fa60 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a  ( nVal==4 );.  z
1fa70 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20  Parent = (const 
1fa80 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1fa90 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
1faa0 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c  ]);.  zParentCol
1fab0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1fac0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1fad0 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  xt(apVal[1]);.  
1fae0 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20  zChild = (const 
1faf0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
1fb00 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
1fb10 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20  ]);.  zChildCol 
1fb20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1fb30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1fb40 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20  t(apVal[3]);..  
1fb50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1fb60 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31  ext(pCtx, "", -1
1fb70 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1fb80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fb90 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
1fba0 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62  tadata(.      db
1fbb0 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e  , "main", zParen
1fbc0 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30  t, zParentCol, 0
1fbd0 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30  , &zParentSeq, 0
1fbe0 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66  , 0, 0.  );.  if
1fbf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fc00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1fc10 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
1fc20 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20  _metadata(.     
1fc30 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
1fc40 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c  Child, zChildCol
1fc50 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c  , 0, &zChildSeq,
1fc60 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a   0, 0, 0.    );.
1fc70 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1fc80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
1fc90 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72  te3_stricmp(zPar
1fca0 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65  entSeq, zChildSe
1fcb0 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  q) ){.    char *
1fcc0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
1fcd0 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73  ntf(" COLLATE %s
1fce0 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a  ", zParentSeq);.
1fcf0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1fd00 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c  lt_text(pCtx, z,
1fd10 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
1fd20 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
1fd30 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
1fd40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  .}.../*.** The i
1fd50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1fd60 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c   dot-command ".l
1fd70 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73  int fkey-indexes
1fd80 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1fd90 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73   lintFkeyIndexes
1fda0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
1fdb0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
1fdc0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
1fdd0 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
1fde0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
1fdf0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1fe00 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1fe10 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
1fe20 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
1fe30 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fe60 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
1fe70 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71  Arg[] */.){.  sq
1fe80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61  lite3 *db = pSta
1fe90 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  te->db;       /*
1fea0 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
1feb0 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22   to query "main"
1fec0 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45   db of */.  FILE
1fed0 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e   *out = pState->
1fee0 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  out;        /* S
1fef0 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e  tream to write n
1ff00 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20  on-error output 
1ff10 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72  to */.  int bVer
1ff20 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  bose = 0;       
1ff30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76          /* If -v
1ff40 65 72 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e  erbose is presen
1ff50 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75  t */.  int bGrou
1ff60 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20  pByParent = 0;  
1ff70 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72         /* If -gr
1ff80 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73 20 70  oupbyparent is p
1ff90 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
1ffa0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ffc0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1ffd0 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63  h azArg[] */.  c
1ffe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65  onst char *zInde
1fff0 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f  nt = "";       /
20000 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e  * How much to in
20010 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45  dent CREATE INDE
20020 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  X by */.  int rc
20030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20050 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
20060 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
20070 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
20080 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f   Compiled versio
20090 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65  n of SQL stateme
200a0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f  nt below */..  /
200b0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45  *.  ** This SELE
200c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  CT statement ret
200d0 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72  urns one row for
200e0 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65   each foreign ke
200f0 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a  y constraint.  *
20100 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  * in the schema 
20110 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
20120 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  base. The column
20130 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a   values are:.  *
20140 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65  *.  ** 0. The te
20150 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61  xt of an SQL sta
20160 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74  tement similar t
20170 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
20180 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59    "EXPLAIN QUERY
20190 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46   PLAN SELECT 1 F
201a0 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20  ROM child_table 
201b0 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d  WHERE child_key=
201c0 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ?".  **.  **    
201d0 54 68 69 73 20 53 45 4c 45 43 54 20 69 73 20 73  This SELECT is s
201e0 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e  imilar to the on
201f0 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
20200 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e  gn keys implemen
20210 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e  tation.  **    n
20220 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65  eeds to run inte
20230 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20  rnally on child 
20240 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65  tables. If there
20250 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
20260 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65  t can.  **    be
20270 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
20280 65 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  e this query, th
20290 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62  en it can also b
202a0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 46 4b  e used by the FK
202b0 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65  .  **    impleme
202c0 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d  ntation to optim
202d0 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50  ize DELETE or UP
202e0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
202f0 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20  on the parent.  
20300 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a  **    table..  *
20310 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42  *.  ** 1. A GLOB
20320 20 70 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c   pattern suitabl
20330 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74  e for sqlite3_st
20340 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20  rglob(). If the 
20350 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20  plan output by. 
20360 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41   **    the EXPLA
20370 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
20380 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68  mmand matches th
20390 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e  is pattern, then
203a0 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a   the schema.  **
203b0 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20      contains an 
203c0 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62  index that can b
203d0 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  e used to optimi
203e0 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  ze the query..  
203f0 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e  **.  ** 2. Human
20400 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74   readable text t
20410 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
20420 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e  e child table an
20430 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a  d columns. e.g..
20440 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
20450 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69  "child_table(chi
20460 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b  ld_key1, child_k
20470 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ey2)".  **.  ** 
20480 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c  3. Human readabl
20490 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63  e text that desc
204a0 72 69 62 65 73 20 74 68 65 20 70 61 72 65 6e 74  ribes the parent
204b0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
204c0 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20  ns. e.g..  **.  
204d0 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e 74  **       "parent
204e0 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65  _table(parent_ke
204f0 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29  y1, parent_key2)
20500 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41  ".  **.  ** 4. A
20510 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44   full CREATE IND
20520 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  EX statement for
20530 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
20540 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a  ould be used to.
20550 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65    **    optimize
20560 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
20570 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
20580 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
20590 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
205a0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49         "CREATE I
205b0 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65  NDEX child_table
205c0 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68  _child_key ON ch
205d0 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
205e0 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  key)".  **.  ** 
205f0 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  5. The name of t
20600 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
20610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65  .  **.  ** These
20620 20 73 69 78 20 76 61 6c 75 65 73 20 61 72 65 20   six values are 
20630 75 73 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f  used by the C lo
20640 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e  gic below to gen
20650 65 72 61 74 65 20 74 68 65 20 72 65 70 6f 72 74  erate the report
20660 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
20670 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53  har *zSql =.  "S
20680 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20 20  ELECT ".    "   
20690 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59    'EXPLAIN QUERY
206a0 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46   PLAN SELECT 1 F
206b0 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73  ROM ' || quote(s
206c0 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52  .name) || ' WHER
206d0 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  E '".    "  || g
206e0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74  roup_concat(quot
206f0 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27  e(s.name) || '.'
20700 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f   || quote(f.[fro
20710 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20  m]) || '=?' ".  
20720 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c    "  || fkey_col
20730 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20  late_clause(".  
20740 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62    "       f.[tab
20750 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e  le], COALESCE(f.
20760 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c  [to], p.[name]),
20770 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d   s.name, f.[from
20780 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20  ]),' AND ')".   
20790 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
207a0 27 53 45 41 52 43 48 20 54 41 42 4c 45 20 27 20  'SEARCH TABLE ' 
207b0 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55  || s.name || ' U
207c0 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
207d0 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c  DEX*('".    "  |
207e0 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27  | group_concat('
207f0 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c  *=?', ' AND ') |
20800 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
20810 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65      "     s.name
20820 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75    || '(' || grou
20830 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d  p_concat(f.[from
20840 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27  ],  ', ') || ')'
20850 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
20860 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c       f.[table] |
20870 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
20880 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66  oncat(COALESCE(f
20890 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
208a0 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c  ) || ')'".    ",
208b0 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 43 52   ".    "     'CR
208c0 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20  EATE INDEX ' || 
208d0 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27  quote(s.name ||'
208e0 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  _'|| group_conca
208f0 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29  t(f.[from], '_')
20900 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f  )".    "  || ' O
20910 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  N ' || quote(s.n
20920 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20  ame) || '('".   
20930 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
20940 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f  cat(quote(f.[fro
20950 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20  m]) ||".    "   
20960 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74       fkey_collat
20970 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
20980 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62            f.[tab
20990 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e  le], COALESCE(f.
209a0 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c  [to], p.[name]),
209b0 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d   s.name, f.[from
209c0 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22  ]), ', ')".    "
209d0 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22    || ');'".    "
209e0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e  , ".    "     f.
209f0 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46  [table] ".    "F
20a00 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
20a10 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66  r AS s, pragma_f
20a20 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28  oreign_key_list(
20a30 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20  s.name) AS f ". 
20a40 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72     "LEFT JOIN pr
20a50 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20  agma_table_info 
20a60 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65  AS p ON (pk-1=se
20a70 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74  q AND p.arg=f.[t
20a80 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52  able]) ".    "GR
20a90 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66  OUP BY s.name, f
20aa0 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52  .id ".    "ORDER
20ab0 20 42 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f   BY (CASE WHEN ?
20ac0 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20   THEN f.[table] 
20ad0 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29  ELSE s.name END)
20ae0 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ".  ;.  const ch
20af0 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22  ar *zGlobIPK = "
20b00 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55  SEARCH TABLE * U
20b10 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
20b20 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d  MARY KEY (rowid=
20b30 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  ?)";..  for(i=2;
20b40 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
20b50 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
20b60 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n30(azArg[i]);. 
20b70 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71     if( n>1 && sq
20b80 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
20b90 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67  -verbose", azArg
20ba0 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
20bb0 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31      bVerbose = 1
20bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
20bd0 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
20be0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67  te3_strnicmp("-g
20bf0 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61  roupbyparent", a
20c00 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29  zArg[i], n)==0 )
20c10 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79  {.      bGroupBy
20c20 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  Parent = 1;.    
20c30 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20    zIndent = "   
20c40 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   ";.    }.    el
20c50 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
20c60 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
20c70 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72  age: %s %s ?-ver
20c80 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70  bose? ?-groupbyp
20c90 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20  arent?\n",.     
20ca0 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61       azArg[0], a
20cb0 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b  zArg[1].      );
20cc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20cd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
20ce0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  }.  }..  /* Regi
20cf0 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f  ster the fkey_co
20d00 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53  llate_clause() S
20d10 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
20d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
20d30 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
20d40 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  , "fkey_collate_
20d50 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49  clause", 4, SQLI
20d60 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30  TE_UTF8,.      0
20d70 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  , shellFkeyColla
20d80 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20  teClause, 0, 0. 
20d90 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d   );...  if( rc==
20da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
20dc0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
20dd0 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29  l, -1, &pSql, 0)
20de0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
20df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20e00 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
20e10 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75  t(pSql, 1, bGrou
20e20 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  pByParent);.  }.
20e30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
20e50 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  rc2;.    char *z
20e60 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68  Prev = 0;.    wh
20e70 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
20e80 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
20e90 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ql) ){.      int
20ea0 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20   res = -1;.     
20eb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20ec0 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
20ed0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20ee0 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  EQP = (const cha
20ef0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
20f00 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
20f10 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
20f20 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73  r *zGlob = (cons
20f30 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
20f40 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
20f50 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 1);.      cons
20f60 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
20f70 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
20f80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
20f90 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20  (pSql, 2);.     
20fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
20fb0 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rget = (const ch
20fc0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
20fd0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
20fe0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
20ff0 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74  ar *zCI = (const
21000 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
21010 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
21020 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   4);.      const
21030 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d   char *zParent =
21040 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
21050 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
21060 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20  t(pSql, 5);..   
21070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
21080 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
21090 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
210a0 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  in, 0);.      if
210b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
210c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
210d0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
210e0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
210f0 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lain) ){.       
21100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c   const char *zPl
21110 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  an = (const char
21120 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
21130 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
21140 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  3);.        res 
21150 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
21160 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72    0==sqlite3_str
21170 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61  glob(zGlob, zPla
21180 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
21190 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
211a0 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50  lob(zGlobIPK, zP
211b0 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  lan).        );.
211c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
211d0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
211e0 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
211f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21200 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
21210 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
21220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
21230 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21240 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20  Error: internal 
21250 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20  error");.       
21260 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
21270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
21280 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a   bGroupByParent.
21290 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72          && (bVer
212a0 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a  bose || res==0).
212b0 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65          && (zPre
212c0 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
212d0 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c  stricmp(zParent,
212e0 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20   zPrev)).       
212f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
21300 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
21310 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25  - Parent table %
21320 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  s\n", zParent);.
21330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21340 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20  3_free(zPrev);. 
21350 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d           zPrev =
21360 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
21370 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b  ("%s", zParent);
21380 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
21390 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
213a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
213b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
213c0 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e  s --> %s\n", zIn
213d0 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67  dent, zCI, zTarg
213e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
213f0 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20  se if( bVerbose 
21400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
21410 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
21420 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65  /* no extra inde
21430 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  xes required for
21440 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c   %s -> %s */\n",
21450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
21460 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a  Indent, zFrom, z
21470 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20  Target.         
21480 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
21490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
214a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
214b0 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ev);..    if( rc
214c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
214d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
214e0 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
214f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
21500 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  b));.    }..    
21510 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
21520 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20  nalize(pSql);.  
21530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21540 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49  _OK && rc2!=SQLI
21550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21560 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72  c = rc2;.      r
21570 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
21580 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
21590 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
215a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
215b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
215c0 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
215d0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
215e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
215f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
21600 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
21610 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61  .lint" dot comma
21620 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
21630 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64  t lintDotCommand
21640 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
21650 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
21660 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
21670 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
21680 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
21690 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
216a0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
216b0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
216c0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
216d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21700 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
21710 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Arg[] */.){.  in
21720 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67  t n;.  n = (nArg
21730 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61  >=2 ? strlen30(a
21740 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20  zArg[1]) : 0);. 
21750 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69   if( n<1 || sqli
21760 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41  te3_strnicmp(azA
21770 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64  rg[1], "fkey-ind
21780 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f  exes", n) ) goto
21790 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   usage;.  return
217a0 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73   lintFkeyIndexes
217b0 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20  (pState, azArg, 
217c0 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a  nArg);.. usage:.
217d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
217e0 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20 73  err, "Usage %s s
217f0 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74  ub-command ?swit
21800 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41  ches...?\n", azA
21810 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72  rg[0]);.  raw_pr
21820 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 68  intf(stderr, "Wh
21830 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73  ere sub-commands
21840 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77   are:\n");.  raw
21850 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21860 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65  "    fkey-indexe
21870 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  s\n");.  return 
21880 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
21890 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
218a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
218b0 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
218c0 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
218d0 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LIB)./**********
218e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
218f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21920 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22  *******.** The "
21930 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61  .archive" or ".a
21940 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  r" command..*/.s
21950 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
21960 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Prepare(.  sqlit
21970 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
21980 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pRc, .  const ch
21990 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c  ar *zSql, .  sql
219a0 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
219b0 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20  mt.){.  *ppStmt 
219c0 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
219d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
219e0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
219f0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
21a00 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
21a10 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
21a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21a30 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
21a40 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65  f(stderr, "sql e
21a50 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22  rror: %s (%d)\n"
21a60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
21a70 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
21a80 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
21a90 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  (db).      );.  
21aa0 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
21ab0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
21ac0 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  ic void shellPre
21ad0 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71  parePrintf(.  sq
21ae0 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
21af0 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
21b00 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
21b10 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
21b20 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a  zFmt, .  ....){.
21b30 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
21b40 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
21b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c  E_OK ){.    va_l
21b60 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72  ist ap;.    char
21b70 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72   *z;.    va_star
21b80 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
21b90 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
21ba0 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
21bb0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
21bc0 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
21bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65  }else{.      she
21bf0 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70 52  llPrepare(db, pR
21c00 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20  c, z, ppStmt);. 
21c10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21c20 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(z);.    }.  }.
21c30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
21c40 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20  hellFinalize(.  
21c50 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c  int *pRc, .  sql
21c60 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
21c70 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  .){.  if( pStmt 
21c80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
21c90 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
21ca0 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
21cb0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
21cc0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
21cd0 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52  mt);.    if( *pR
21ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21cf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21d00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21d10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
21d20 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72  derr, "SQL error
21d30 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
21d40 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
21d50 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63      }.      *pRc
21d60 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = rc;.    }.  }
21d70 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
21d80 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e  shellReset(.  in
21d90 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
21da0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
21db0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
21dc0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
21dd0 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  );.  if( *pRc==S
21de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21e00 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
21e10 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
21e20 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
21e30 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
21e40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
21e50 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73   error: %s\n", s
21e60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
21e70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ));.    }.    *p
21e80 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f  Rc = rc;.  }.}./
21e90 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72  *.** Structure r
21ea0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69  epresenting a si
21eb0 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61  ngle ".ar" comma
21ec0 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  nd..*/.typedef s
21ed0 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20  truct ArCommand 
21ee0 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63  ArCommand;.struc
21ef0 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20  t ArCommand {.  
21f00 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20  u8 eCmd;        
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76  /* An AR_CMD_* v
21f30 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65  alue */.  u8 bVe
21f40 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20  rbose;          
21f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21f60 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a  e if --verbose *
21f70 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20  /.  u8 bZip;    
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
21fa0 2d 7a 69 70 20 2a 2f 0a 20 20 75 38 20 62 44 72  -zip */.  u8 bDr
21fb0 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20  yRun;           
21fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21fd0 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a  e if --dry-run *
21fe0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22010 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
22020 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
22030 61 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20  ar *zSrcTable;  
22040 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61          /* "sqla
22050 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69  r", "zipfile($fi
22060 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f  le)" or "zip" */
22070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22080 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
22090 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67     /* --file arg
220a0 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a  ument, or NULL *
220b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
220c0 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20  zDir;           
220d0 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f      /* --directo
220e0 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20  ry argument, or 
220f0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
22100 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20  *azArg;         
22110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
22120 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  ay of command ar
22130 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65  guments */.  She
22140 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20  llState *p;     
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22160 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20  Shell state */. 
22170 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
221a0 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68  taining the arch
221b0 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ive */.};../*.**
221c0 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d   Print a usage m
221d0 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e  essage for the .
221e0 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74  ar command to st
221f0 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
22200 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
22210 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73  .static int arUs
22220 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  age(FILE *f){.  
22230 72 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a 22 5c  raw_printf(f,."\
22240 6e 22 0a 22 55 73 61 67 65 3a 20 2e 61 72 20 5b  n"."Usage: .ar [
22250 4f 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c 45  OPTION...] [FILE
22260 2e 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e 61 72  ...]\n"."The .ar
22270 20 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67 65 73   command manages
22280 20 73 71 6c 61 72 20 61 72 63 68 69 76 65 73 2e   sqlar archives.
22290 5c 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d 70 6c  \n"."\n"."Exampl
222a0 65 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 63  es:\n"."  .ar -c
222b0 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f  f archive.sar fo
222c0 6f 20 62 61 72 20 20 20 20 23 20 43 72 65 61 74  o bar    # Creat
222d0 65 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 72  e archive.sar fr
222e0 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64  om files foo and
222f0 20 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d   bar\n"."  .ar -
22300 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  tf archive.sar  
22310 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74            # List
22320 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68   members of arch
22330 69 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20 2e 61  ive.sar\n"."  .a
22340 72 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e 73  r -xvf archive.s
22350 61 72 20 20 20 20 20 20 20 20 20 20 20 23 20 56  ar           # V
22360 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74  erbosely extract
22370 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
22380 69 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e 22 0a  ive.sar\n"."\n".
22390 22 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69  "Each command li
223a0 6e 65 20 6d 75 73 74 20 66 65 61 74 75 72 65 20  ne must feature 
223b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d  exactly one comm
223c0 61 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22 0a 22  and option:\n"."
223d0 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65 20 20    -c, --create  
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65               Cre
223f0 61 74 65 20 61 20 6e 65 77 20 61 72 63 68 69 76  ate a new archiv
22400 65 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d 75 70  e\n"."  -u, --up
22410 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
22420 20 20 20 55 70 64 61 74 65 20 6f 72 20 61 64 64     Update or add
22430 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65 78 69   files to an exi
22440 73 74 69 6e 67 20 61 72 63 68 69 76 65 5c 6e 22  sting archive\n"
22450 0a 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20  ."  -t, --list  
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
22470 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ist contents of 
22480 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 78  archive\n"."  -x
22490 2c 20 2d 2d 65 78 74 72 61 63 74 20 20 20 20 20  , --extract     
224a0 20 20 20 20 20 20 20 20 20 45 78 74 72 61 63 74           Extract
224b0 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
224c0 69 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41 6e 64  ive\n"."\n"."And
224d0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 70   zero or more op
224e0 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 3a 5c  tional options:\
224f0 6e 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65 72 62  n"."  -v, --verb
22500 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
22510 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65   Print each file
22520 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72  name as it is pr
22530 6f 63 65 73 73 65 64 5c 6e 22 0a 22 20 20 2d 66  ocessed\n"."  -f
22540 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49   FILE, --file FI
22550 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61 74 65  LE       Operate
22560 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45   on archive FILE
22570 20 28 64 65 66 61 75 6c 74 20 69 73 20 63 75 72   (default is cur
22580 72 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20 20 2d  rent db)\n"."  -
22590 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f  C DIR, --directo
225a0 72 79 20 44 49 52 20 20 20 20 43 68 61 6e 67 65  ry DIR    Change
225b0 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 44 49   to directory DI
225c0 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72 61 63  R to read/extrac
225d0 74 20 66 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e  t files\n"."  -n
225e0 2c 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20  , --dryrun      
225f0 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
22600 65 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64  e SQL that would
22610 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 5c 6e   have occurred\n
22620 22 0a 22 20 20 2d 7a 2c 20 2d 2d 7a 69 70 20 20  "."  -z, --zip  
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 4f 70 65 72 61 74 65 20 6f 6e 20 61 20 5a 49 50  Operate on a ZIP
22650 20 61 72 63 68 69 76 65 20 69 6e 73 74 65 61 64   archive instead
22660 20 6f 66 20 61 6e 20 53 51 4c 41 52 5c 6e 22 0a   of an SQLAR\n".
22670 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a 20  "\n"."See also: 
22680 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
22690 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72  g/cli.html#sqlar
226a0 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74  _archive_support
226b0 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72 65  \n"."\n".);.  re
226c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
226d0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  R;.}../*.** Prin
226e0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
226f0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
22700 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
22710 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20   and return .** 
22720 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
22730 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72  .static int arEr
22740 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61  rorMsg(const cha
22750 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
22760 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
22770 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61  har *z;.  va_sta
22780 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
22790 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
227a0 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
227b0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
227c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
227d0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28 74  r, "Error: %s (t
227e0 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70 5c  ry \".ar --help\
227f0 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71 6c  ")\n", z);.  sql
22800 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
22810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
22820 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61  ROR;.}../*.** Va
22830 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61  lues for ArComma
22840 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66  nd.eCmd..*/.#def
22850 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ine AR_CMD_CREAT
22860 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  E       1.#defin
22870 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
22880 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
22890 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20  AR_CMD_LIST     
228a0 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52      3.#define AR
228b0 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20  _CMD_UPDATE     
228c0 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    4.#define AR_C
228d0 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20  MD_HELP         
228e0 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28  5../*.** Other (
228f0 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69  non-command) swi
22900 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tches..*/.#defin
22910 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  e AR_SWITCH_VERB
22920 4f 53 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e  OSE     6.#defin
22930 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
22940 20 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e          7.#defin
22950 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  e AR_SWITCH_DIRE
22960 43 54 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e  CTORY   8.#defin
22970 65 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50 20  e AR_SWITCH_ZIP 
22980 20 20 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e          9.#defin
22990 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52  e AR_SWITCH_DRYR
229a0 55 4e 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69  UN     10..stati
229b0 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53  c int arProcessS
229c0 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20  witch(ArCommand 
229d0 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63  *pAr, int eSwitc
229e0 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
229f0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
22a00 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63  eSwitch ){.    c
22a10 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ase AR_CMD_CREAT
22a20 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
22a30 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
22a40 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
22a50 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
22a60 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61  D_UPDATE:.    ca
22a70 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
22a80 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65        if( pAr->e
22a90 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cmd ){.        r
22aa0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
22ab0 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61  ("multiple comma
22ac0 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20  nd options");.  
22ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
22ae0 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b  >eCmd = eSwitch;
22af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
22b00 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
22b10 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20  H_DRYRUN:.      
22b20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31  pAr->bDryRun = 1
22b30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22b40 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
22b50 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20  H_VERBOSE:.     
22b60 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d   pAr->bVerbose =
22b70 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
22b80 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
22b90 54 43 48 5f 5a 49 50 3a 0a 20 20 20 20 20 20 70  TCH_ZIP:.      p
22ba0 41 72 2d 3e 62 5a 69 70 20 3d 20 31 3b 0a 20 20  Ar->bZip = 1;.  
22bb0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
22bc0 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46  case AR_SWITCH_F
22bd0 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ILE:.      pAr->
22be0 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  zFile = zArg;.  
22bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
22c00 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ase AR_SWITCH_DI
22c10 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70  RECTORY:.      p
22c20 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b  Ar->zDir = zArg;
22c30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22c40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
22c50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22c60 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
22c70 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e  d line for an ".
22c80 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65  ar" command. The
22c90 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
22ca0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72  tten into.** str
22cb0 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53  ucture (*pAr). S
22cc0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22cd0 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d  rned if the comm
22ce0 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73  and line is pars
22cf0 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  ed.** successful
22d00 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ly, otherwise an
22d10 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
22d20 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64  s written to std
22d30 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  err and .** SQLI
22d40 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65  TE_ERROR returne
22d50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
22d60 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28   arParseCommand(
22d70 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
22da0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
22db0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
22dc0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22df0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
22e00 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61  g[] */.  ArComma
22e10 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20  nd *pAr         
22e20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75           /* Popu
22e30 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
22e40 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
22e50 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63  ArSwitch {.    c
22e60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67  onst char *zLong
22e70 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f 72  ;.    char cShor
22e80 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74 63  t;.    u8 eSwitc
22e90 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a  h;.    u8 bArg;.
22ea0 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20    } aSwitch[] = 
22eb0 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65 22  {.    { "create"
22ec0 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44  ,    'c', AR_CMD
22ed0 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20 20 30  _CREATE,       0
22ee0 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61   },.    { "extra
22ef0 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43  ct",   'x', AR_C
22f00 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20  MD_EXTRACT,     
22f10 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73   0 },.    { "lis
22f20 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20 41 52  t",      't', AR
22f30 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20 20  _CMD_LIST,      
22f40 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75     0 },.    { "u
22f50 70 64 61 74 65 22 2c 20 20 20 20 27 75 27 2c 20  pdate",    'u', 
22f60 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 20  AR_CMD_UPDATE,  
22f70 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
22f80 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27 68 27  "help",      'h'
22f90 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20  , AR_CMD_HELP,  
22fa0 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
22fb0 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20 27  { "verbose",   '
22fc0 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 56 45  v', AR_SWITCH_VE
22fd0 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20  RBOSE,   0 },.  
22fe0 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20 20 20    { "file",     
22ff0 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'f', AR_SWITCH_
23000 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a  FILE,      1 },.
23010 20 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79      { "directory
23020 22 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43  ", 'C', AR_SWITC
23030 48 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d  H_DIRECTORY, 1 }
23040 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20 20  ,.    { "zip",  
23050 20 20 20 20 20 27 7a 27 2c 20 41 52 5f 53 57 49       'z', AR_SWI
23060 54 43 48 5f 5a 49 50 2c 20 20 20 20 20 20 20 30  TCH_ZIP,       0
23070 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79 72 75   },.    { "dryru
23080 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f 53  n",    'n', AR_S
23090 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20 20 20  WITCH_DRYRUN,   
230a0 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74   0 },.  };.  int
230b0 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f   nSwitch = sizeo
230c0 66 28 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a  f(aSwitch) / siz
230d0 65 6f 66 28 73 74 72 75 63 74 20 41 72 53 77 69  eof(struct ArSwi
230e0 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41  tch);.  struct A
230f0 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20  rSwitch *pEnd = 
23100 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68  &aSwitch[nSwitch
23110 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d  ];..  if( nArg<=
23120 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
23130 61 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b  arUsage(stderr);
23140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
23150 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d  ar *z = azArg[1]
23160 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 41 72  ;.    memset(pAr
23170 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 72 43 6f  , 0, sizeof(ArCo
23180 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20 20 69 66  mmand));..    if
23190 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[0]!='-' ){. 
231a0 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f       /* Traditio
231b0 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20  nal style [tar] 
231c0 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
231d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
231e0 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20   int iArg = 2;. 
231f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
23200 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
23210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
23220 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
23230 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
23240 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66  *pOpt;.        f
23250 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
23260 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
23270 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
23280 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
23290 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
232a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
232b0 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
232c0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
232d0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
232e0 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  sg("unrecognized
232f0 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b   option: %c", z[
23300 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
23310 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d         if( pOpt-
23320 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
23330 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72     if( iArg>=nAr
23340 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
23350 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
23360 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  sg("option requi
23370 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
23380 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20   %c",z[i]);.    
23390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233a0 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69    zArg = azArg[i
233b0 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  Arg++];.        
233c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72  }.        if( ar
233d0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
233e0 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
233f0 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
23400 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
23410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
23420 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
23430 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  rg;.      if( pA
23440 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  r->nArg>0 ){.   
23450 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
23460 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
23470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
23480 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  e{.      /* Non-
23490 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f  traditional invo
234a0 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
234b0 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20  int iArg;.      
234c0 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67  for(iArg=1; iArg
234d0 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a  <nArg; iArg++){.
234e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
234f0 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67         z = azArg
23500 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
23510 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
23520 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
23530 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
23540 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61  and line words a
23550 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
23560 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ents. */.       
23570 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
23580 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20  &azArg[iArg];.  
23590 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
235a0 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20  g = nArg-iArg;. 
235b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
235c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
235d0 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
235e0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
235f0 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]!='-' ){.   
23600 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
23610 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
23620 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74  r more short opt
23630 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ions */.        
23640 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
23650 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
23660 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
23670 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
23680 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
23690 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20  tch *pOpt;.     
236a0 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
236b0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
236c0 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
236d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
236e0 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
236f0 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
23700 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23710 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
23720 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  t==pEnd ){.     
23730 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23740 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65  arErrorMsg("unre
23750 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a  cognized option:
23760 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29 3b 0a 20   %c\n", z[i]);. 
23770 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23780 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
23790 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20  t->bArg ){.     
237a0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 28           if( i<(
237b0 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-1) ){.        
237c0 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 26          zArg = &
237d0 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  z[i+1];.        
237e0 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20          i = n;. 
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
23800 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23810 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
23820 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
23830 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
23840 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f  rn arErrorMsg("o
23850 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
23860 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 5c 6e  n argument: %c\n
23870 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ",z[i]);.       
23880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23890 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
238a0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
238b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
238c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
238d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
238e0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
238f0 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
23900 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
23910 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23920 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23930 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
23940 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  2]=='\0' ){.    
23950 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70        /* A -- op
23960 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67  tion, indicating
23970 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e   that all remain
23980 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
23990 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20   words.         
239a0 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20   ** are command 
239b0 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20  arguments.  */. 
239c0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a           pAr->az
239d0 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
239e0 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g+1];.          
239f0 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
23a00 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20  -iArg-1;.       
23a10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23a30 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74     /* A long opt
23a40 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
23a50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
23a60 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
23a70 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66     /* Argument f
23a80 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e  or option, if an
23a90 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  y */.          s
23aa0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
23ab0 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pMatch = 0;     
23ac0 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74   /* Matching opt
23ad0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
23ae0 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
23af0 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20   *pOpt;         
23b00 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a     /* Iterator *
23b10 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
23b20 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
23b30 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
23b40 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
23b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
23b60 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e  ong = pOpt->zLon
23b70 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  g;.            i
23b80 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e  f( (n-2)<=strlen
23b90 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d  30(zLong) && 0==
23ba0 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c  memcmp(&z[2], zL
23bb0 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20  ong, n-2) ){.   
23bc0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23bd0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
23be0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23bf0 61 72 45 72 72 6f 72 4d 73 67 28 22 61 6d 62 69  arErrorMsg("ambi
23c00 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73  guous option: %s
23c10 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",z);.          
23c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23c30 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
23c40 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20  h = pOpt;.      
23c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
23c80 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a  f( pMatch==0 ){.
23c90 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
23ca0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75  rn arErrorMsg("u
23cb0 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
23cc0 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  on: %s", z);.   
23cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23ce0 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62     if( pMatch->b
23cf0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
23d00 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
23d10 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
23d20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
23d30 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e  ErrorMsg("option
23d40 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
23d50 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a  ument: %s", z);.
23d60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23d70 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
23d80 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a   azArg[++iArg];.
23d90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23da0 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
23db0 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
23dc0 4d 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20  Match->eSwitch, 
23dd0 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53  zArg) ) return S
23de0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23e00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
23e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23e20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23e30 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
23e40 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20  t all arguments 
23e50 77 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d  within the ArCom
23e60 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20  mand.azArg[].** 
23e70 61 72 72 61 79 20 72 65 66 65 72 20 74 6f 20 61  array refer to a
23e80 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20  rchive members, 
23e90 61 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74  as for the --ext
23ea0 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63  ract or --list c
23eb0 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20  ommands. .** It 
23ec0 63 68 65 63 6b 73 20 74 68 61 74 20 65 61 63 68  checks that each
23ed0 20 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72 65   of them are pre
23ee0 73 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65  sent. If any spe
23ef0 63 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e  cified file is n
23f00 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  ot.** present in
23f10 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e   the archive, an
23f20 20 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65   error is printe
23f30 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20  d to stderr and 
23f40 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  an error.** code
23f50 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
23f60 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65  wise, if all spe
23f70 63 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73  cified arguments
23f80 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a   are present in.
23f90 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c 20  ** the archive, 
23fa0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23fb0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
23fc0 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70  s function strip
23fd0 73 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27  s any trailing '
23fe0 2f 27 20 63 68 61 72 61 63 74 65 72 73 20 66 72  /' characters fr
23ff0 6f 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  om each argument
24000 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e  ..** This is con
24010 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68 65  sistent with the
24020 20 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63   way the [tar] c
24030 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20  ommand seems to 
24040 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78  work on.** Linux
24050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24060 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 41  arCheckEntries(A
24070 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a  rCommand *pAr){.
24080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24090 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d  E_OK;.  if( pAr-
240a0 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74  >nArg ){.    int
240b0 20 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74   i, j;.    sqlit
240c0 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20 3d  e3_stmt *pTest =
240d0 20 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72   0;..    shellPr
240e0 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d  eparePrintf(pAr-
240f0 3e 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74  >db, &rc, &pTest
24100 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
24110 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20 57  T name FROM %s W
24120 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22  HERE name=$name"
24130 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  , .        pAr->
24140 7a 53 72 63 54 61 62 6c 65 0a 20 20 20 20 29 3b  zSrcTable.    );
24150 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24160 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 28  ITE_OK.     && (
24170 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
24180 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
24190 28 70 54 65 73 74 2c 20 22 24 61 72 63 68 69 76  (pTest, "$archiv
241a0 65 46 69 6c 65 22 29 29 3e 30 0a 20 20 20 20 29  eFile"))>0.    )
241b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
241c0 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
241d0 20 6a 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c 20   j, pAr->zFile, 
241e0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
241f0 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20  IENT);.    }.   
24200 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
24210 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
24220 78 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22  x(pTest, "$name"
24230 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
24240 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
24250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
24260 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
24270 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
24280 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ];.      int n =
24290 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
242a0 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b      int bOk = 0;
242b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e  .      while( n>
242c0 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27  0 && z[n-1]=='/'
242d0 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b   ) n--;.      z[
242e0 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
242f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
24300 78 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20  xt(pTest, j, z, 
24310 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
24320 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  C);.      if( SQ
24330 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
24340 33 5f 73 74 65 70 28 70 54 65 73 74 29 20 29 7b  3_step(pTest) ){
24350 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
24360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24370 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20  shellReset(&rc, 
24380 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pTest);.      if
24390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
243a0 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  && bOk==0 ){.   
243b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
243c0 28 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f  (stderr, "not fo
243d0 75 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20  und in archive: 
243e0 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
243f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
24400 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
24410 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
24420 61 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74  alize(&rc, pTest
24430 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
24450 6d 61 74 20 61 20 57 48 45 52 45 20 63 6c 61 75  mat a WHERE clau
24460 73 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  se that can be u
24470 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  sed against the 
24480 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f  "sqlar" table to
24490 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c  .** identify all
244a0 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
244b0 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
244c0 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
244d0 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70  s held.** in (*p
244e0 41 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20  Ar). Leave this 
244f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
24500 28 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72  (*pzWhere) befor
24510 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
24520 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
24530 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76  sponsible for ev
24540 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67  entually calling
24550 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
24560 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55  on.** any non-NU
24570 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61  LL (*pzWhere) va
24580 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
24590 6f 69 64 20 61 72 57 68 65 72 65 43 6c 61 75 73  oid arWhereClaus
245a0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
245b0 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
245c0 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68  , .  char **pzWh
245d0 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
245e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
245f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
24600 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  .){.  char *zWhe
24610 72 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  re = 0;.  if( *p
24620 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
24630 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41  .    if( pAr->nA
24640 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  rg==0 ){.      z
24650 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  Where = sqlite3_
24660 6d 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20  mprintf("1");.  
24670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
24680 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt i;.      cons
24690 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22  t char *zSep = "
246a0 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ";.      for(i=0
246b0 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69  ; i<pAr->nArg; i
246c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
246d0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72  st char *z = pAr
246e0 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
246f0 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c      zWhere = sql
24700 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
24710 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61          "%z%s na
24720 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62  me = '%q' OR sub
24730 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d  str(name,1,%d) =
24740 20 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20   '%q/'", .      
24750 20 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70      zWhere, zSep
24760 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29  , z, strlen30(z)
24770 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b  +1, z.        );
24780 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 68  .        if( zWh
24790 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ere==0 ){.      
247a0 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
247b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
247c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
247d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70    }.        zSep
247e0 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20   = " OR ";.     
247f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
24800 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
24810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
24820 65 6e 74 20 7a 4d 6f 64 65 20 6d 75 73 74 20 70  ent zMode must p
24830 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
24840 20 61 74 20 6c 65 61 73 74 20 31 31 20 62 79 74   at least 11 byt
24850 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
24860 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
24870 75 6c 61 74 65 73 20 74 68 69 73 20 62 75 66 66  ulates this buff
24880 65 72 20 77 69 74 68 20 74 68 65 20 73 74 72 69  er with the stri
24890 6e 67 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  ng interpretatio
248a0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 75 6e 69 78  n of.** the unix
248b0 20 66 69 6c 65 20 6d 6f 64 65 20 70 61 73 73 65   file mode passe
248c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
248d0 61 72 67 75 6d 65 6e 74 20 28 65 2e 67 2e 20 22  argument (e.g. "
248e0 64 72 77 78 72 2d 78 72 2d 78 22 29 2e 0a 2a 2f  drwxr-xr-x")..*/
248f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
24900 6c 6c 4d 6f 64 65 54 6f 53 74 72 69 6e 67 28 63  llModeToString(c
24910 68 61 72 20 2a 7a 4d 6f 64 65 2c 20 69 6e 74 20  har *zMode, int 
24920 6d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  mode){.  int i;.
24930 0a 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62  .  /* Magic numb
24940 65 72 73 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  ers copied from 
24950 5b 6d 61 6e 20 32 20 73 74 61 74 5d 20 2a 2f 0a  [man 2 stat] */.
24960 20 20 69 66 28 20 6d 6f 64 65 20 26 20 30 30 34    if( mode & 004
24970 30 30 30 30 20 29 7b 0a 20 20 20 20 7a 4d 6f 64  0000 ){.    zMod
24980 65 5b 30 5d 20 3d 20 27 64 27 3b 0a 20 20 7d 65  e[0] = 'd';.  }e
24990 6c 73 65 20 69 66 28 20 28 6d 6f 64 65 20 26 20  lse if( (mode & 
249a0 30 31 32 30 30 30 30 29 3d 3d 30 31 32 30 30 30  0120000)==012000
249b0 30 20 29 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b 30  0 ){.    zMode[0
249c0 5d 20 3d 20 27 6c 27 3b 0a 20 20 7d 65 6c 73 65  ] = 'l';.  }else
249d0 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d  {.    zMode[0] =
249e0 20 27 2d 27 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72   '-';.  }..  for
249f0 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b  (i=0; i<3; i++){
24a00 0a 20 20 20 20 69 6e 74 20 6d 20 3d 20 28 6d 6f  .    int m = (mo
24a10 64 65 20 3e 3e 20 28 28 32 2d 69 29 2a 33 29 29  de >> ((2-i)*3))
24a20 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20  ;.    char *a = 
24a30 26 7a 4d 6f 64 65 5b 31 20 2b 20 69 2a 33 5d 3b  &zMode[1 + i*3];
24a40 0a 20 20 20 20 61 5b 30 5d 20 3d 20 28 6d 20 26  .    a[0] = (m &
24a50 20 30 78 34 29 20 3f 20 27 72 27 20 3a 20 27 2d   0x4) ? 'r' : '-
24a60 27 3b 0a 20 20 20 20 61 5b 31 5d 20 3d 20 28 6d  ';.    a[1] = (m
24a70 20 26 20 30 78 32 29 20 3f 20 27 77 27 20 3a 20   & 0x2) ? 'w' : 
24a80 27 2d 27 3b 0a 20 20 20 20 61 5b 32 5d 20 3d 20  '-';.    a[2] = 
24a90 28 6d 20 26 20 30 78 31 29 20 3f 20 27 78 27 20  (m & 0x1) ? 'x' 
24aa0 3a 20 27 2d 27 3b 0a 20 20 7d 0a 20 20 7a 4d 6f  : '-';.  }.  zMo
24ab0 64 65 5b 31 30 5d 20 3d 20 27 5c 30 27 3b 0a 7d  de[10] = '\0';.}
24ac0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
24ad0 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c  tation of .ar "l
24ae0 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  isT" command. .*
24af0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c  /.static int arL
24b00 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d  istCommand(ArCom
24b10 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
24b20 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
24b30 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   "SELECT %s FROM
24b40 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a   %s WHERE %s"; .
24b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
24b60 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  Cols[] = {.    "
24b70 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6d 6f 64 65  name",.    "mode
24b80 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d  , sz, datetime(m
24b90 74 69 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63 68  time, 'unixepoch
24ba0 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a  '), name".  };..
24bb0 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
24bc0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
24bd0 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20  mt *pSql = 0;.  
24be0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6a 3b  int rc;.  int j;
24bf0 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
24c00 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
24c10 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
24c20 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
24c30 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
24c40 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
24c50 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
24c60 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
24c70 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24c90 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
24ca0 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 72 63  Where);.  if( rc
24cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
24cc0 26 26 20 28 6a 20 3d 20 73 71 6c 69 74 65 33 5f  && (j = sqlite3_
24cd0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
24ce0 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 61 72 63  ndex(pSql, "$arc
24cf0 68 69 76 65 46 69 6c 65 22 29 29 3e 30 0a 20 20  hiveFile"))>0.  
24d00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
24d10 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a  ind_text(pSql, j
24d20 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c 20 2d 31  , pAr->zFile, -1
24d30 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
24d40 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  NT);.  }.  if( p
24d50 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20  Ar->bDryRun ){. 
24d60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
24d70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
24d80 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  n", sqlite3_sql(
24d90 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pSql));.  }else{
24da0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
24db0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
24dc0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
24dd0 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
24de0 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56       if( pAr->bV
24df0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
24e00 20 20 63 68 61 72 20 7a 4d 6f 64 65 5b 31 31 5d    char zMode[11]
24e10 3b 0a 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d  ;.        shellM
24e20 6f 64 65 54 6f 53 74 72 69 6e 67 28 7a 4d 6f 64  odeToString(zMod
24e30 65 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e, sqlite3_colum
24e40 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 29 3b  n_int(pSql, 0));
24e50 0a 20 20 0a 20 20 20 20 20 20 20 20 75 74 66 38  .  .        utf8
24e60 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
24e70 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20  out, "%s % 10d  
24e80 25 73 20 20 25 73 5c 6e 22 2c 20 7a 4d 6f 64 65  %s  %s\n", zMode
24e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
24ea0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
24eb0 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20  (pSql, 1), .    
24ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24ed0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
24ee0 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 2),.          
24ef0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
24f00 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 0a 20  _text(pSql, 3). 
24f10 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
24f30 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
24f40 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
24f50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24f60 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20  ext(pSql, 0));. 
24f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24f80 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
24f90 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 72  (&rc, pSql);.  r
24fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
24fb0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
24fc0 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
24fd0 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
24fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
24ff0 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43  tractCommand(ArC
25000 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
25010 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
25020 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54  1 = .    "SELECT
25030 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c   ".    " ($dir |
25040 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20  | name),".    " 
25050 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20  writefile(($dir 
25060 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f  || name), %s, mo
25070 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20  de, mtime) ".   
25080 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20   "FROM %s WHERE 
25090 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
250a0 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e  S NULL OR $dirOn
250b0 6c 79 20 3d 20 30 29 22 3b 0a 0a 20 20 63 6f 6e  ly = 0)";..  con
250c0 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61  st char *azExtra
250d0 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22  Arg[] = { .    "
250e0 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73  sqlar_uncompress
250f0 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20  (data, sz)",.   
25100 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20   "data".  };..  
25110 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
25120 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
25130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25140 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
25150 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
25160 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
25170 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
25180 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
25190 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
251a0 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  y actually exist
251b0 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
251c0 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20   archive before 
251d0 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20  proceeding. And 
251e0 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52  formulate a WHER
251f0 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a  E clause to.  **
25200 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f   match them.  */
25210 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
25220 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
25230 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
25240 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
25250 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
25260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
25270 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20   pAr->zDir ){.  
25280 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
25290 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
252a0 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
252b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
252c0 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
252d0 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
252e0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
252f0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
25300 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65  OMEM;.  }..  she
25310 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
25320 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
25330 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20  Sql, zSql1, .   
25340 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41     azExtraArg[pA
25350 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a  r->bZip], pAr->z
25360 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
25370 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
25380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25390 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
253a0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
253b0 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29  ex(pSql, "$dir")
253c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
253d0 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c  nd_text(pSql, j,
253e0 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54   zDir, -1, SQLIT
253f0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6a  E_STATIC);.    j
25400 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
25410 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
25420 70 53 71 6c 2c 20 22 24 61 72 63 68 69 76 65 46  pSql, "$archiveF
25430 69 6c 65 22 29 3b 0a 20 20 20 20 69 66 28 20 6a  ile");.    if( j
25440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25450 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
25460 2c 20 6a 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c  , j, pAr->zFile,
25470 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
25480 49 43 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IC);.    }..    
25490 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43  /* Run the SELEC
254a0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63  T statement twic
254b0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  e. The first tim
254c0 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69  e, writefile() i
254d0 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
254e0 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20  for all archive 
254f0 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f  members that sho
25500 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64  uld be extracted
25510 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d  . The second tim
25520 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66  e,.    ** only f
25530 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  or the directori
25540 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  es. This is beca
25550 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  use the timestam
25560 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78  ps for.    ** ex
25570 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72  tracted director
25580 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65  ies must be rese
25590 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65  t after they are
255a0 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20   populated (as. 
255b0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67     ** populating
255c0 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68   them changes th
255d0 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a  e timestamp).  *
255e0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
255f0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
25600 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
25610 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
25620 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79  (pSql, "$dirOnly
25630 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
25640 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
25650 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   j, i);.      if
25660 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
25670 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
25680 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
25690 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
256a0 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20  e3_sql(pSql));. 
256b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
256c0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
256d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
256e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
256f0 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
25700 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
25710 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73   && pAr->bVerbos
25720 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
25730 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
25740 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
25750 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
25760 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
25770 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25790 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
257a0 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20  &rc, pSql);.    
257b0 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
257c0 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
257d0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
257e0 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c  ree(zDir);.  sql
257f0 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
25800 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
25820 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
25830 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64  n zSql.  Or if d
25840 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c  oing a --dryrun,
25850 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74   merely print it
25860 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   out..*/.static 
25870 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72  int arExecSql(Ar
25880 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
25890 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
258a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
258b0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
258c0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
258d0 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
258e0 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
258f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
25910 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
25920 70 41 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pAr->db, zSql, 0
25930 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
25940 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
25950 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
25960 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74  on of .ar "creat
25970 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22 20  e" and "update" 
25980 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20  commands..**.** 
25990 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
259a0 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
259b0 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
259c0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
259d0 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
259e0 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
259f0 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
25a00 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
25a10 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
25a20 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
25a30 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
25a40 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
25a50 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
25a60 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
25a70 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
25a80 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
25a90 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ved..**.** The c
25aa0 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73  reate command is
25ab0 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64   the same as upd
25ac0 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ate, except that
25ad0 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79   it drops.** any
25ae0 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72   existing "sqlar
25af0 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  " table before b
25b00 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eginning..*/.sta
25b10 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
25b20 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
25b30 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
25b40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
25b50 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72     /* Command ar
25b60 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69  guments and opti
25b70 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70  ons */.  int bUp
25b80 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
25b90 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65           /* true
25ba0 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e   for a --create.
25bb0 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70    false for --up
25bc0 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  date */.){.  con
25bd0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
25be0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d 6f  "SELECT name, mo
25bf0 64 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74 61 20  de, mtime, data 
25c00 46 52 4f 4d 20 66 73 64 69 72 28 3f 2c 20 3f 29  FROM fsdir(?, ?)
25c10 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
25c20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20  *zCreate = .    
25c30 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
25c40 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71  IF NOT EXISTS sq
25c50 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20  lar(\n".      " 
25c60 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41   name TEXT PRIMA
25c70 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65  RY KEY,  -- name
25c80 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a   of the file\n".
25c90 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e        "  mode IN
25ca0 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
25cb0 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69   -- access permi
25cc0 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20  ssions\n".      
25cd0 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20  "  mtime INT,   
25ce0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61             -- la
25cf0 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  st modification 
25d00 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  time\n".      " 
25d10 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20   sz INT,        
25d20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67           -- orig
25d30 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e  inal file size\n
25d40 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61 20  ".      "  data 
25d50 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20  BLOB            
25d60 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64     -- compressed
25d70 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20   content\n".    
25d80 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63    ")";.  const c
25d90 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52  har *zDrop = "DR
25da0 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
25db0 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e  TS sqlar";.  con
25dc0 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  st char *zInsert
25dd0 20 3d 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f   = "REPLACE INTO
25de0 20 73 71 6c 61 72 20 56 41 4c 55 45 53 28 3f 2c   sqlar VALUES(?,
25df0 3f 2c 3f 2c 3f 2c 73 71 6c 61 72 5f 63 6f 6d 70  ?,?,?,sqlar_comp
25e00 72 65 73 73 28 3f 29 29 22 3b 0a 0a 20 20 73 71  ress(?))";..  sq
25e10 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
25e20 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
25e30 20 44 69 72 65 63 74 6f 72 79 20 74 72 61 76 65   Directory trave
25e40 72 73 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rser */.  sqlite
25e50 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20  3_stmt *pInsert 
25e60 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d  = 0;      /* Com
25e70 70 69 6c 61 74 69 6f 6e 20 6f 66 20 7a 49 6e 73  pilation of zIns
25e80 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ert */.  int i; 
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
25eb0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
25ec0 68 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20  h azFile[] */.  
25ed0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ef0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25f00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 41 72  /..  assert( pAr
25f10 2d 3e 62 5a 69 70 3d 3d 30 20 29 3b 0a 0a 20 20  ->bZip==0 );..  
25f20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
25f30 41 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 61  Ar, "SAVEPOINT a
25f40 72 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  r;");.  if( rc!=
25f50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25f60 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 62 55  rn rc;..  if( bU
25f70 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pdate==0 ){.    
25f80 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
25f90 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20  Ar, zDrop);.    
25fa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25fb0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
25fc0 20 7d 0a 0a 20 20 72 63 20 3d 20 61 72 45 78 65   }..  rc = arExe
25fd0 63 53 71 6c 28 70 41 72 2c 20 7a 43 72 65 61 74  cSql(pAr, zCreat
25fe0 65 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  e);.  shellPrepa
25ff0 72 65 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  re(pAr->db, &rc,
26000 20 7a 49 6e 73 65 72 74 2c 20 26 70 49 6e 73 65   zInsert, &pInse
26010 72 74 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70  rt);.  shellPrep
26020 61 72 65 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  are(pAr->db, &rc
26030 2c 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74 29 3b  , zSql, &pStmt);
26040 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
26050 74 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 70  text(pStmt, 2, p
26060 41 72 2d 3e 7a 44 69 72 2c 20 2d 31 2c 20 53 51  Ar->zDir, -1, SQ
26070 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20  LITE_STATIC);.. 
26080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
26090 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
260a0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
260b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
260c0 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 70 41  ext(pStmt, 1, pA
260d0 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 2d 31 2c  r->azArg[i], -1,
260e0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
260f0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
26100 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
26110 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
26120 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
26130 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
26140 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26150 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
26160 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
26170 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
26180 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 6f  0);.      int mo
26190 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  de = sqlite3_col
261a0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
261b0 29 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  );.      unsigne
261c0 64 20 69 6e 74 20 6d 74 69 6d 65 20 3d 20 73 71  d int mtime = sq
261d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
261e0 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20  (pStmt, 2);..   
261f0 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72     if( pAr->bVer
26200 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
26210 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
26220 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
26230 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
26240 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
26250 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72  bind_text(pInser
26260 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  t, 1, zName, -1,
26270 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
26280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
26290 69 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72 74 2c  ind_int(pInsert,
262a0 20 32 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 20   2, mode);.     
262b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
262c0 74 36 34 28 70 49 6e 73 65 72 74 2c 20 33 2c 20  t64(pInsert, 3, 
262d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6d  (sqlite3_int64)m
262e0 74 69 6d 65 29 3b 0a 0a 20 20 20 20 20 20 69 66  time);..      if
262f0 28 20 53 5f 49 53 44 49 52 28 6d 6f 64 65 29 20  ( S_ISDIR(mode) 
26300 29 7b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  ){.        sz = 
26310 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
26320 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e  e3_bind_null(pIn
26330 73 65 72 74 2c 20 35 29 3b 0a 20 20 20 20 20 20  sert, 5);.      
26340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
26350 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
26360 65 28 70 49 6e 73 65 72 74 2c 20 35 2c 20 73 71  e(pInsert, 5, sq
26370 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
26380 75 65 28 70 53 74 6d 74 2c 20 33 29 29 3b 0a 20  ue(pStmt, 3));. 
26390 20 20 20 20 20 20 20 69 66 28 20 53 5f 49 53 4c         if( S_ISL
263a0 4e 4b 28 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  NK(mode) ){.    
263b0 20 20 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20        sz = -1;. 
263c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
263d0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 73 71 6c          sz = sql
263e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
263f0 73 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  s(pStmt, 3);.   
26400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
26410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
26420 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72 74 2c 20  nd_int(pInsert, 
26430 34 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  4, sz);.      if
26440 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
26450 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
26460 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
26470 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
26480 65 33 5f 73 71 6c 28 70 49 6e 73 65 72 74 29 29  e3_sql(pInsert))
26490 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
264a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
264b0 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
264c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
264d0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
264e0 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20  Insert);.    }. 
264f0 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72     shellReset(&r
26500 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  c, pStmt);.  }..
26510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26520 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72 45 78 65  _OK ){.    arExe
26530 63 53 71 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42  cSql(pAr, "ROLLB
26540 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41  ACK TO ar; RELEA
26550 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73  SE ar;");.  }els
26560 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78  e{.    rc = arEx
26570 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45  ecSql(pAr, "RELE
26580 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 0a 20  ASE ar;");.  }. 
26590 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
265a0 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 73 68  rc, pStmt);.  sh
265b0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
265c0 20 70 49 6e 73 65 72 74 29 3b 0a 20 20 72 65 74   pInsert);.  ret
265d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
265e0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
265f0 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d  of ".ar" dot com
26600 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
26610 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64  int arDotCommand
26620 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
26630 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
26640 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
26650 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
26660 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
26670 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
26680 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
26690 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
266a0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
266b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
266e0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
266f0 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72  Arg[] */.){.  Ar
26700 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69  Command cmd;.  i
26710 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 72  nt rc;.  rc = ar
26720 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41  ParseCommand(azA
26730 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b  rg, nArg, &cmd);
26740 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6d 64 2e  E_OK ){.    cmd.
26760 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20  p = pState;.    
26770 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d  cmd.db = pState-
26780 3e 64 62 3b 0a 20 20 20 20 63 6d 64 2e 7a 53 72  >db;.    cmd.zSr
26790 63 54 61 62 6c 65 20 3d 20 22 73 71 6c 61 72 22  cTable = "sqlar"
267a0 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 62 5a  ;.    if( cmd.bZ
267b0 69 70 20 7c 7c 20 70 53 74 61 74 65 2d 3e 6f 70  ip || pState->op
267c0 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50  enMode==SHELL_OP
267d0 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20  EN_ZIPFILE ){.  
267e0 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
267f0 65 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  e==0.       && s
26800 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
26810 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64  umn_metadata(cmd
26820 2e 64 62 2c 30 2c 22 7a 69 70 22 2c 22 6e 61 6d  .db,0,"zip","nam
26830 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 3d 3d 53  e",0,0,0,0,0)==S
26840 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
26850 7b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53  {.        cmd.zS
26860 72 63 54 61 62 6c 65 20 3d 20 22 7a 69 70 22 3b  rcTable = "zip";
26870 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26880 20 63 6d 64 2e 7a 46 69 6c 65 21 3d 30 20 29 7b   cmd.zFile!=0 ){
26890 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72  .        cmd.zSr
268a0 63 54 61 62 6c 65 20 3d 20 22 7a 69 70 66 69 6c  cTable = "zipfil
268b0 65 28 24 61 72 63 68 69 76 65 46 69 6c 65 29 22  e($archiveFile)"
268c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
268d0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
268e0 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 7a  tf(stderr, "no z
268f0 69 70 20 61 72 63 68 69 76 65 20 66 69 6c 65 20  ip archive file 
26900 73 70 65 63 69 66 69 65 64 5c 6e 22 29 3b 0a 20  specified\n");. 
26910 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
26920 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26930 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6d    }.      if( cm
26940 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43  d.eCmd==AR_CMD_C
26950 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d  REATE || cmd.eCm
26960 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  d==AR_CMD_UPDATE
26970 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
26980 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26990 22 7a 69 70 20 61 72 63 68 69 76 65 73 20 61 72  "zip archives ar
269a0 65 20 72 65 61 64 2d 6f 6e 6c 79 5c 6e 22 29 3b  e read-only\n");
269b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
269c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
269d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
269e0 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b  if( cmd.zFile ){
269f0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
26a00 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
26a10 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45  eCmd==AR_CMD_CRE
26a20 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ATE || cmd.eCmd=
26a30 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
26a40 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
26a50 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
26a60 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
26a70 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
26a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26a90 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
26aa0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
26ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
26ac0 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  .db = 0;.      r
26ad0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
26ae0 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 26  _v2(cmd.zFile, &
26af0 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20 30  cmd.db, flags, 0
26b00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
26b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26b20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
26b30 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
26b40 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20  t open file: %s 
26b50 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20  (%s)\n", .      
26b60 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c        cmd.zFile,
26b70 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26b80 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20  cmd.db).        
26b90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26ba0 65 33 5f 63 6c 6f 73 65 28 63 6d 64 2e 64 62 29  e3_close(cmd.db)
26bb0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26bc0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26bd0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
26be0 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  o_init(cmd.db, 0
26bf0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
26c00 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20  ITE_HAVE_ZLIB.  
26c10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
26c20 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  r_init(cmd.db, 0
26c30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
26c40 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
26c50 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20  cmd.eCmd ){.    
26c60 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
26c70 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63  EATE:.        rc
26c80 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
26c90 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
26ca0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
26cb0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
26cc0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
26cd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45          rc = arE
26ce0 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63  xtractCommand(&c
26cf0 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
26d00 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
26d10 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20  AR_CMD_LIST:.   
26d20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74       rc = arList
26d30 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20  Command(&cmd);. 
26d40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
26d50 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
26d60 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61  _HELP:.        a
26d70 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f  rUsage(pState->o
26d80 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ut);.        bre
26d90 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
26da0 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
26db0 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  rt( cmd.eCmd==AR
26dc0 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20  _CMD_UPDATE );. 
26dd0 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
26de0 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
26df0 61 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20  and(&cmd, 1);.  
26e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26e10 20 7d 0a 0a 20 20 20 20 69 66 28 20 63 6d 64 2e   }..    if( cmd.
26e20 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29  db!=pState->db )
26e30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26e40 63 6c 6f 73 65 28 63 6d 64 2e 64 62 29 3b 0a 20  close(cmd.db);. 
26e50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
26e60 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20  rn rc;.}./* End 
26e70 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65  of the ".archive
26e80 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61  " or ".ar" comma
26e90 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a  nd logic.*******
26ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
26ef0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
26f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26f10 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
26f20 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
26f30 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _ZLIB) */.../*.*
26f40 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69  * If an input li
26f50 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ne begins with "
26f60 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  ." then invoke t
26f70 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a  his routine to.*
26f80 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c  * process that l
26f90 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ine..**.** Retur
26fa0 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
26fb0 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
26fc0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
26fd0 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f  tic int do_meta_
26fe0 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c  command(char *zL
26ff0 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20  ine, ShellState 
27000 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31  *p){.  int h = 1
27010 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
27020 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20  ;.  int n, c;.  
27030 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68  int rc = 0;.  ch
27040 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a  ar *azArg[50];..
27050 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27060 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
27070 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74  .  if( p->expert
27080 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
27090 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20  expertFinish(p, 
270a0 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
270b0 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  f..  /* Parse th
270c0 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74  e input line int
270d0 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  o tokens..  */. 
270e0 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
270f0 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69   && nArg<ArraySi
27100 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20  ze(azArg) ){.   
27110 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
27120 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
27130 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ; }.    if( zLin
27140 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  e[h]==0 ) break;
27150 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
27160 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65  ]=='\'' || zLine
27170 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [h]=='"' ){.    
27180 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c    int delim = zL
27190 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20  ine[h++];.      
271a0 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
271b0 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20  &zLine[h];.     
271c0 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
271d0 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65   && zLine[h]!=de
271e0 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  lim ){.        i
271f0 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c  f( zLine[h]=='\\
27200 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20  ' && delim=='"' 
27210 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30  && zLine[h+1]!=0
27220 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) h++;.        
27230 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  h++;.      }.   
27240 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
27250 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
27260 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30    zLine[h++] = 0
27270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27280 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
27290 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
272a0 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
272b0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
272c0 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
272d0 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
272e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
272f0 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61  ine[h] && !IsSpa
27300 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
27310 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  h++; }.      if(
27320 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e   zLine[h] ) zLin
27330 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[h++] = 0;.    
27340 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c    resolve_backsl
27350 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
27360 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  -1]);.    }.  }.
27370 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
27380 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20  e input line..  
27390 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  */.  if( nArg==0
273a0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
273b0 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72  no tokens, no er
273c0 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72  ror */.  n = str
273d0 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b  len30(azArg[0]);
273e0 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b  .  c = azArg[0][
273f0 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  0];..#ifndef SQL
27400 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
27410 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d  ZATION.  if( c==
27420 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'a' && strncmp(a
27430 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c  zArg[0], "auth",
27440 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
27450 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
27460 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
27470 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 61  derr, "Usage: .a
27480 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a  uth ON|OFF\n");.
27490 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
274a0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
274b0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
274c0 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
274d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f   0);.    if( boo
274e0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
274f0 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  1]) ){.      sql
27500 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
27510 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c  zer(p->db, shell
27520 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65  Auth, p);.    }e
27530 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
27540 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
27550 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  r(p->db, 0, 0);.
27560 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
27570 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
27580 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
27590 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
275a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
275b0 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20  AVE_ZLIB).  if( 
275c0 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  c=='a' && strncm
275d0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63  p(azArg[0], "arc
275e0 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hive", n)==0 ){.
275f0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
27600 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 44 6f  );.    rc = arDo
27610 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72  tCommand(p, azAr
27620 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73  g, nArg);.  }els
27630 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
27640 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20  (c=='b' && n>=3 
27650 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
27660 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e  [0], "backup", n
27670 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d  )==0).   || (c==
27680 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  's' && n>=3 && s
27690 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
276a0 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a   "save", n)==0).
276b0 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
276c0 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d  har *zDestFile =
276d0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
276e0 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20  ar *zDb = 0;.   
276f0 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
27700 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
27710 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
27720 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72    int j;.    for
27730 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b  (j=1; j<nArg; j+
27740 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
27750 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
27760 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  j];.      if( z[
27770 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
27780 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d     while( z[0]==
27790 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
277a0 20 20 20 2f 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73     /* No options
277b0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 74 20 74   to process at t
277c0 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 20 20  his time */.    
277d0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
277e0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
277f0 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
27800 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  ion: %s\n", azAr
27810 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[j]);.         
27820 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
27830 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
27840 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
27850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  0 ){.        zDe
27860 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a  stFile = azArg[j
27870 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ];.      }else i
27880 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( zDb==0 ){.   
27890 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73 74       zDb = zDest
278a0 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a 44  File;.        zD
278b0 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  estFile = azArg[
278c0 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j];.      }else{
278d0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
278e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 74 6f 6f  ntf(stderr, "too
278f0 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20   many arguments 
27900 74 6f 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a  to .backup\n");.
27910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
27920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27930 20 20 20 20 69 66 28 20 7a 44 65 73 74 46 69 6c      if( zDestFil
27940 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  e==0 ){.      ra
27950 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
27960 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e 41   "missing FILENA
27970 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e  ME argument on .
27980 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20  backup\n");.    
27990 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
279a0 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  }.    if( zDb==0
279b0 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b   ) zDb = "main";
279c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
279d0 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c 65  3_open(zDestFile
279e0 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20 69  , &pDest);.    i
279f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27a00 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
27a10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
27a20 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
27a30 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65  n \"%s\"\n", zDe
27a40 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  stFile);.      s
27a50 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
27a60 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
27a70 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  n 1;.    }.    o
27a80 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
27a90 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
27aa0 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
27ab0 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
27ac0 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ->db, zDb);.    
27ad0 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
27ae0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
27af0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
27b00 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
27b10 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
27b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27b30 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
27b40 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
27b50 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
27b60 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62   (rc = sqlite3_b
27b70 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b  ackup_step(pBack
27b80 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45  up,100))==SQLITE
27b90 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69  _OK ){}.    sqli
27ba0 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
27bb0 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  h(pBackup);.    
27bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
27bd0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ONE ){.      rc 
27be0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
27bf0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27c00 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
27c10 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
27c20 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b  _errmsg(pDest));
27c30 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
27c40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27c50 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
27c60 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
27c70 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
27c80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
27c90 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20  , "bail", n)==0 
27ca0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
27cb0 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c  =2 ){.      bail
27cc0 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c  _on_error = bool
27cd0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
27ce0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
27cf0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27d00 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
27d10 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .bail on|off\n")
27d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
27d30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
27d40 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
27d50 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
27d60 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79  zArg[0], "binary
27d70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27d80 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
27d90 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e       if( boolean
27da0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
27db0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42 69  ){.        setBi
27dc0 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  naryMode(p->out,
27dd0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
27de0 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54 65 78  {.        setTex
27df0 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
27e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
27e10 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
27e20 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
27e30 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e  sage: .binary on
27e40 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
27e50 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
27e60 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
27e70 27 63 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a  'c' && strcmp(az
27e80 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20  Arg[0],"cd")==0 
27e90 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
27ea0 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =2 ){.#if define
27eb0 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
27ec0 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20  ined(WIN32).    
27ed0 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
27ee0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
27ef0 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41  8_to_unicode(azA
27f00 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[1]);.      rc
27f10 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44 69   = !SetCurrentDi
27f20 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20  rectoryW(z);.   
27f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27f40 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
27f50 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67  rc = chdir(azArg
27f60 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  [1]);.#endif.   
27f70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27f80 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
27f90 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
27fa0 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   change to direc
27fb0 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  tory \"%s\"\n", 
27fc0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
27fd0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
27fe0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
27ff0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
28000 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
28010 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29  cd DIRECTORY\n")
28020 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
28030 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
28040 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65   /* The undocume
28050 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e  nted ".breakpoin
28060 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  t" command cause
28070 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  s a call to the 
28080 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69  no-op.  ** routi
28090 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72  ne named test_br
280a0 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f  eakpoint()..  */
280b0 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
280c0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
280d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61  (azArg[0], "brea
280e0 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29  kpoint", n)==0 )
280f0 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b  {.    test_break
28100 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65  point();.  }else
28110 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
28120 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
28130 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61  p(azArg[0], "cha
28140 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  nges", n)==0 ){.
28150 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
28160 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
28170 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
28180 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61  _CountChanges, a
28190 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
281a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
281b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
281c0 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f  sage: .changes o
281d0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
281e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
281f0 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e   }else..  /* Can
28200 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72  cel output redir
28210 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ection, if it is
28220 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28   currently set (
28230 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20  by .testcase).  
28240 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68 65  ** Then read the
28250 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
28260 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
28270 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72   file and compar
28280 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61  e against.  ** a
28290 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65  zArg[1].  If the
282a0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
282b0 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72  es, report an er
282c0 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20  ror and exit..  
282d0 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  */.  if( c=='c' 
282e0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
282f0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68  mp(azArg[0], "ch
28300 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eck", n)==0 ){. 
28310 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20     char *zRes = 
28320 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65  0;.    output_re
28330 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20  set(p);.    if( 
28340 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
28350 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
28360 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65  rr, "Usage: .che
28370 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c  ck GLOB-PATTERN\
28380 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
28390 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
283a0 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c   (zRes = readFil
283b0 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e("testcase-out.
283c0 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  txt", 0))==0 ){.
283d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
283e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
283f0 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65   cannot read 'te
28400 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
28410 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
28420 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
28430 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61   testcase_glob(a
28440 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30  zArg[1],zRes)==0
28450 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
28460 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28480 74 65 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c  testcase-%s FAIL
28490 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b  ED\n Expected: [
284a0 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20  %s]\n      Got: 
284b0 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
284c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65            p->zTe
284d0 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d  stcase, azArg[1]
284e0 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72  , zRes);.      r
284f0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
28500 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
28510 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73  ntf(stdout, "tes
28520 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20  tcase-%s ok\n", 
28530 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20  p->zTestcase);. 
28540 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b       p->nCheck++
28550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
28560 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a  te3_free(zRes);.
28570 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
28580 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
28590 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e  (azArg[0], "clon
285a0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
285b0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
285c0 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65        tryToClone
285d0 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  (p, azArg[1]);. 
285e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
285f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
28600 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e  r, "Usage: .clon
28610 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  e FILENAME\n");.
28620 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
28630 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
28640 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31  f( c=='d' && n>1
28650 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
28660 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73  g[0], "databases
28670 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
28680 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
28690 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
286a0 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e  sg = 0;.    open
286b0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d  _db(p, 0);.    m
286c0 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
286d0 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
286e0 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
286f0 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
28700 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
28710 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
28720 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28730 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61  intf(sizeof(data
28740 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64  .colSeparator),d
28750 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
28760 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61  ,": ");.    data
28770 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  .cnt = 0;.    sq
28780 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
28790 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  , "SELECT name, 
287a0 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61  file FROM pragma
287b0 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c  _database_list",
287c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
287d0 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
287e0 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
287f0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
28800 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
28810 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
28820 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
28830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28840 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
28850 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
28860 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
28870 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
28880 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
28890 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29  dbinfo", n)==0 )
288a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  {.    rc = shell
288b0 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28  _dbinfo_command(
288c0 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b  p, nArg, azArg);
288d0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
288e0 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
288f0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d  p(azArg[0], "dum
28900 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
28910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
28920 6b 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ke = 0;.    int 
28930 69 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64  i;.    int saved
28940 53 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e  ShowHeader = p->
28950 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
28960 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
28970 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  , SHFLG_Preserve
28980 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c  Rowid|SHFLG_Newl
28990 69 6e 65 73 29 3b 0a 20 20 20 20 66 6f 72 28 69  ines);.    for(i
289a0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
289b0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
289c0 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  g[i][0]=='-' ){.
289d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
289e0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
289f0 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
28a00 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[0]=='-' ) z++;
28a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
28a20 63 6d 70 28 7a 2c 22 70 72 65 73 65 72 76 65 2d  cmp(z,"preserve-
28a30 72 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23  rowids")==0 ){.#
28a40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
28a50 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
28a60 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
28a70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54 68 65  ntf(stderr, "The
28a80 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69   --preserve-rowi
28a90 64 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74  ds option is not
28aa0 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20 20   compatible".   
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68            " with
28ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
28ae0 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20  TUALTABLE\n");. 
28af0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
28b00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
28b10 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
28b20 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  t;.#else.       
28b30 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28     ShellSetFlag(
28b40 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76  p, SHFLG_Preserv
28b50 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a  eRowid);.#endif.
28b60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
28b70 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
28b80 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d  (z,"newlines")==
28b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  0 ){.          S
28ba0 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53  hellSetFlag(p, S
28bb0 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a  HFLG_Newlines);.
28bc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
28bd0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
28be0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
28bf0 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
28c00 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
28c10 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41  ".dump\"\n", azA
28c20 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
28c30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
28c40 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
28c50 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
28c60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
28c70 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20  e if( zLike ){. 
28c80 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
28c90 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
28ca0 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65  : .dump ?--prese
28cb0 72 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20  rve-rowids? ".  
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77           "?--new
28ce0 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54  lines? ?LIKE-PAT
28cf0 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  TERN?\n");.     
28d00 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
28d10 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
28d20 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
28d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28d40 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d  zLike = azArg[i]
28d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28d60 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
28d70 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  );.    /* When p
28d80 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64  laying back a "d
28d90 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ump", the conten
28da0 74 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  t might appear i
28db0 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  n an order.    *
28dc0 2a 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69  * which causes i
28dd0 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
28de0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
28df0 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e   to be violated.
28e00 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62  .    ** So disab
28e10 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63  le foreign-key c
28e20 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63  onstraint enforc
28e30 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74  ement to prevent
28e40 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20   problems. */.  
28e50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
28e60 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  out, "PRAGMA for
28e70 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e  eign_keys=OFF;\n
28e80 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
28e90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49  tf(p->out, "BEGI
28ea0 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e  N TRANSACTION;\n
28eb0 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61  ");.    p->writa
28ec0 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
28ed0 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
28ee0 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74   = 0;.    /* Set
28ef0 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
28f00 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  =ON since doing 
28f10 73 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65  so forces SQLite
28f20 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
28f30 20 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66     ** as much of
28f40 20 74 68 65 20 73 63 68 65 6d 61 20 61 73 20 69   the schema as i
28f50 74 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68  t can even if th
28f60 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
28f70 74 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20  table is.    ** 
28f80 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
28f90 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
28fa0 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64  db, "SAVEPOINT d
28fb0 75 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74  ump; PRAGMA writ
28fc0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c  able_schema=ON",
28fd0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
28fe0 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  ->nErr = 0;.    
28ff0 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a  if( zLike==0 ){.
29000 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
29010 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
29020 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
29030 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
29040 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
29050 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
29060 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20  RE sql NOT NULL 
29070 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
29080 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c  ' AND name!='sql
29090 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
290a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
290b0 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
290c0 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
290d0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
290e0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
290f0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
29100 20 20 20 20 22 57 48 45 52 45 20 6e 61 6d 65 3d      "WHERE name=
29110 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  ='sqlite_sequenc
29120 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  e'".      );.   
29130 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
29140 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
29150 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
29160 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
29170 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
29180 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20  RE sql NOT NULL 
29190 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e  AND type IN ('in
291a0 64 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27  dex','trigger','
291b0 76 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20 20  view')", 0.     
291c0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
291d0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b       char *zSql;
291e0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
291f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
29200 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
29210 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
29220 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
29230 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
29240 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  RE tbl_name LIKE
29250 20 25 51 20 41 4e 44 20 74 79 70 65 3d 3d 27 74   %Q AND type=='t
29260 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 22  able'".        "
29270 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55    AND sql NOT NU
29280 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20  LL", zLike);.   
29290 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
292a0 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c 29  mp_query(p,zSql)
292b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
292c0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
292d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
292e0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
292f0 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
29300 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
29310 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
29320 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a  E sql NOT NULL".
29330 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74          "  AND t
29340 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
29350 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
29360 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  )".        "  AN
29370 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
29380 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20  %Q", zLike);.   
29390 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
293a0 70 5f 71 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c  p_query(p, zSql,
293b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
293c0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
293d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
293e0 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29  writableSchema )
293f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
29400 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
29410 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
29420 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ma=OFF;\n");.   
29430 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
29440 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  hema = 0;.    }.
29450 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
29460 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
29470 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
29480 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  OFF;", 0, 0, 0);
29490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
294a0 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53  c(p->db, "RELEAS
294b0 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20  E dump;", 0, 0, 
294c0 30 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  0);.    raw_prin
294d0 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45  tf(p->out, p->nE
294e0 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20  rr ? "ROLLBACK; 
294f0 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73  -- due to errors
29500 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e  \n" : "COMMIT;\n
29510 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48  ");.    p->showH
29520 65 61 64 65 72 20 3d 20 73 61 76 65 64 53 68 6f  eader = savedSho
29530 77 48 65 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65  wHeader;.  }else
29540 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
29550 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
29560 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d  0], "echo", n)==
29570 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
29580 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65  g==2 ){.      se
29590 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  tOrClearFlag(p, 
295a0 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72  SHFLG_Echo, azAr
295b0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
295c0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
295d0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
295e0 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c  e: .echo on|off\
295f0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29600 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
29610 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
29620 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
29630 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30  0], "eqp", n)==0
29640 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
29650 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
29660 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
29670 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"full")==0 ){. 
29680 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
29690 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c  P = AUTOEQP_full
296a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
296b0 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
296c0 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d 30 20  ],"trigger")==0 
296d0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  ){.        p->au
296e0 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f  toEQP = AUTOEQP_
296f0 74 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d  trigger;.      }
29700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
29710 3e 61 75 74 6f 45 51 50 20 3d 20 62 6f 6f 6c 65  >autoEQP = boole
29720 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
29730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29740 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
29750 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29760 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c  Usage: .eqp off|
29770 6f 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c  on|trigger|full\
29780 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29790 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
297a0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
297b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
297c0 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d  0], "exit", n)==
297d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
297e0 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e  g>1 && (rc = (in
297f0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
29800 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65  zArg[1]))!=0 ) e
29810 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20  xit(rc);.    rc 
29820 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  = 2;.  }else..  
29830 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e  /* The ".explain
29840 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74  " command is aut
29850 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20  omatic now.  It 
29860 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74  is largely point
29870 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72  less.  It.  ** r
29880 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66  etained purely f
29890 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
298a0 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20  patibility */.  
298b0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
298c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
298d0 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30  "explain", n)==0
298e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20   ){.    int val 
298f0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 1;.    if( nAr
29900 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g>=2 ){.      if
29910 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
29920 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a  ],"auto")==0 ){.
29930 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39          val = 99
29940 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29950 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f         val =  bo
29960 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
29970 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [1]);.      }.  
29980 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d    }.    if( val=
29990 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d  =1 && p->mode!=M
299a0 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
299b0 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f       p->normalMo
299c0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
299d0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
299e0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
299f0 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
29a00 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
29a10 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20  if( val==0 ){.  
29a20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
29a30 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20  =MODE_Explain ) 
29a40 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72  p->mode = p->nor
29a50 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70  malMode;.      p
29a60 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
29a70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
29a80 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20   val==99 ){.    
29a90 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
29aa0 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d  ODE_Explain ) p-
29ab0 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61  >mode = p->norma
29ac0 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  lMode;.      p->
29ad0 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b  autoExplain = 1;
29ae0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
29af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29b00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
29b10 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
29b20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
29b30 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d  ], "expert", n)=
29b40 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
29b50 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70  b(p, 0);.    exp
29b60 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c  ertDotCommand(p,
29b70 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
29b80 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
29b90 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73   if( c=='f' && s
29ba0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
29bb0 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e   "fullschema", n
29bc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
29bd0 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
29be0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
29bf0 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74   0;.    int doSt
29c00 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  ats = 0;.    mem
29c10 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
29c20 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
29c30 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
29c40 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63   = 0;.    data.c
29c50 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
29c60 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20   = MODE_Semi;.  
29c70 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26    if( nArg==2 &&
29c80 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41   optionMatch(azA
29c90 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29  rg[1], "indent")
29ca0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63   ){.      data.c
29cb0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
29cc0 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
29cd0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a        nArg = 1;.
29ce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
29cf0 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg!=1 ){.      r
29d00 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29d10 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73  , "Usage: .fulls
29d20 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
29d30 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
29d40 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
29d50 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
29d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
29d70 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
29d80 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
29d90 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22  (p->db,.       "
29da0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22  SELECT sql FROM"
29db0 0a 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45  .       "  (SELE
29dc0 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65  CT sql sql, type
29dd0 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20   type, tbl_name 
29de0 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e  tbl_name, name n
29df0 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20  ame, rowid x".  
29e00 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20       "     FROM 
29e10 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
29e20 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
29e30 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
29e40 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
29e50 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
29e60 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
29e70 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57  ter) ".       "W
29e80 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61  HERE type!='meta
29e90 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c  ' AND sql NOTNUL
29ea0 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c  L AND name NOT L
29eb0 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22  IKE 'sqlite_%' "
29ec0 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  .       "ORDER B
29ed0 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20  Y rowid",.      
29ee0 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
29ef0 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29  , &zErrMsg.    )
29f00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
29f10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29f20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
29f30 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  Stmt;.      rc =
29f40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
29f50 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
29f60 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
29f70 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  T rowid FROM sql
29f80 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
29f90 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
29fa0 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71  RE name GLOB 'sq
29fb0 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22  lite_stat[134]'"
29fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29fd0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
29fe0 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d  .      doStats =
29ff0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2a000 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
2a010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2a020 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2a030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
2a040 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20  oStats==0 ){.   
2a050 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2a060 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41  >out, "/* No STA
2a070 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  T tables availab
2a080 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d  le */\n");.    }
2a090 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2a0a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2a0b0 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
2a0c0 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
2a0d0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2a0e0 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41  ->db, "SELECT 'A
2a0f0 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2a100 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  ster'",.        
2a110 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
2a120 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2a130 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
2a140 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
2a150 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
2a160 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  t;.      data.zD
2a170 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2a180 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20  te_stat1";.     
2a190 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
2a1a0 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
2a1b0 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  M sqlite_stat1",
2a1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a1d0 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
2a1e0 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67  , &data,&zErrMsg
2a1f0 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
2a200 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2a210 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20  te_stat3";.     
2a220 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
2a230 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
2a240 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c  M sqlite_stat3",
2a250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a260 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
2a270 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67  , &data,&zErrMsg
2a280 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
2a290 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2a2a0 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20  te_stat4";.     
2a2b0 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
2a2c0 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
2a2d0 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c  M sqlite_stat4",
2a2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a2f0 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
2a300 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2a310 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  g);.      raw_pr
2a320 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
2a330 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
2a340 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  ter;\n");.    }.
2a350 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2a360 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
2a370 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64  (azArg[0], "head
2a380 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ers", n)==0 ){. 
2a390 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2a3a0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48  {.      p->showH
2a3b0 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  eader = booleanV
2a3c0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2a3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a3e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a3f0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61  rr, "Usage: .hea
2a400 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  ders on|off\n");
2a410 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2a420 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2a430 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
2a440 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2a450 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  "help", n)==0 ){
2a460 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2a470 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
2a480 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Help);.  }else..
2a490 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
2a4a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2a4b0 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
2a4c0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
2a4d0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
2a4e0 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
2a4f0 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61  ata into this ta
2a500 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
2a510 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
2a520 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2a530 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20  f file to extra 
2a540 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  content from */.
2a550 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2a560 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
2a570 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
2a580 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2a5b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
2a5c0 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
2a5d0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
2a5e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a5f0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
2a600 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
2a610 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a630 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2a640 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f  /.    int needCo
2a650 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
2a660 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d    /* True to COM
2a670 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
2a680 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  at end */.    in
2a690 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
2a6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a6b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2a6c0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
2a6d0 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
2a6e0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
2a6f0 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
2a700 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
2a710 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20  ImportCtx sCtx; 
2a720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2a730 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  eader context */
2a740 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49  .    char *(SQLI
2a750 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29  TE_CDECL *xRead)
2a760 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a  (ImportCtx*); /*
2a770 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e   Func to read on
2a780 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69  e value */.    i
2a790 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  nt (SQLITE_CDECL
2a7a0 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a   *xCloser)(FILE*
2a7b0 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20  );      /* Func 
2a7c0 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f  to close file */
2a7d0 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ..    if( nArg!=
2a7e0 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
2a7f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2a800 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49  sage: .import FI
2a810 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20  LE TABLE\n");.  
2a820 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2a830 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2a840 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
2a850 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62  Arg[1];.    zTab
2a860 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  le = azArg[2];. 
2a870 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
2a880 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
2a890 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
2a8a0 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70  f(sCtx));.    op
2a8b0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2a8c0 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
2a8d0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2a8e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
2a8f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
2a900 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
2a930 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
2a940 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
2a950 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2a960 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2a970 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
2a980 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2a990 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2a9a0 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
2a9b0 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ter column separ
2a9c0 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
2a9d0 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2a9e0 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
2a9f0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2aa00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2aa10 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
2aa20 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
2aa30 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
2aa40 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
2aa50 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2aa60 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  r, "Error: non-n
2aa70 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ull row separato
2aa80 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
2aa90 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2aaa0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2aab0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32  .    if( nSep==2
2aac0 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44   && p->mode==MOD
2aad0 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28  E_Csv && strcmp(
2aae0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2aaf0 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b   SEP_CrLf)==0 ){
2ab00 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69  .      /* When i
2ab10 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e  mporting CSV (on
2ab20 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20  ly), if the row 
2ab30 73 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74  separator is set
2ab40 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2ab50 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20   default output 
2ab60 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63  row separator, c
2ab70 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20  hange it to the 
2ab80 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20  default input.  
2ab90 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72      ** row separ
2aba0 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69  ator.  This avoi
2abb0 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69  ds having to mai
2abc0 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ntain different 
2abd0 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  input.      ** a
2abe0 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  nd output row se
2abf0 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20  parators. */.   
2ac00 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2ac10 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
2ac20 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
2ac30 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2ac40 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53  P_Row);.      nS
2ac50 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2ac60 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
2ac70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2ac80 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
2ac90 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2aca0 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
2acb0 68 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70  haracter row sep
2acc0 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
2acd0 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
2ace0 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
2acf0 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
2ad00 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2ad10 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c   }.    sCtx.zFil
2ad20 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73  e = zFile;.    s
2ad30 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20  Ctx.nLine = 1;. 
2ad40 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c     if( sCtx.zFil
2ad50 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
2ad60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ad70 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
2ad80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ad90 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
2ada0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
2adb0 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
2adc0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23       return 1;.#
2add0 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e  else.      sCtx.
2ade0 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e  in = popen(sCtx.
2adf0 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20  zFile+1, "r");. 
2ae00 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20       sCtx.zFile 
2ae10 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20  = "<pipe>";.    
2ae20 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f    xCloser = pclo
2ae30 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  se;.#endif.    }
2ae40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78  else{.      sCtx
2ae50 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78  .in = fopen(sCtx
2ae60 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  .zFile, "rb");. 
2ae70 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66       xCloser = f
2ae80 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  close;.    }.   
2ae90 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2aea0 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20  DE_Ascii ){.    
2aeb0 20 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f    xRead = ascii_
2aec0 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a  read_one_field;.
2aed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2aee0 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61   xRead = csv_rea
2aef0 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
2af00 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e   }.    if( sCtx.
2af10 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  in==0 ){.      u
2af20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2af30 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2af40 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2af50 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
2af60 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2af70 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70      sCtx.cColSep
2af80 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   = p->colSeparat
2af90 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e  or[0];.    sCtx.
2afa0 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77  cRowSep = p->row
2afb0 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
2afc0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2afd0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
2afe0 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61   * FROM %s", zTa
2aff0 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
2b000 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
2b010 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b020 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
2b030 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
2b040 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2b050 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
2b060 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
2b070 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Byte = strlen30(
2b080 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
2b090 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2b0a0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
2b0b0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2b0c0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
2b0d0 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29  d_char(&sCtx, 0)
2b0e0 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72  ;    /* To ensur
2b0f0 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f  e sCtx.z is allo
2b100 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
2b110 20 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73   rc && sqlite3_s
2b120 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20  trglob("no such 
2b130 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74  table: *", sqlit
2b140 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2b150 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
2b160 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
2b170 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
2b180 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c  REATE TABLE %s",
2b190 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
2b1a0 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
2b1b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52  .      while( xR
2b1c0 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20  ead(&sCtx) ){.  
2b1d0 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20        zCreate = 
2b1e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2b1f0 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20  "%z%c\n  \"%w\" 
2b200 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20  TEXT", zCreate, 
2b210 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20  cSep, sCtx.z);. 
2b220 20 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c         cSep = ',
2b230 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ';.        if( s
2b240 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
2b250 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b  cColSep ) break;
2b260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b270 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a  f( cSep=='(' ){.
2b280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b290 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
2b2a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2b2b0 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
2b2c0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2b2d0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75  x.in);.        u
2b2e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2b2f0 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c  r,"%s: empty fil
2b300 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  e\n", sCtx.zFile
2b310 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2b320 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2b330 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c     zCreate = sql
2b340 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
2b350 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a  \n)", zCreate);.
2b360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b370 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
2b380 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
2b390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2b3a0 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
2b3b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2b3c0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b3d0 74 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41  tf(stderr, "CREA
2b3e0 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29  TE TABLE %s(...)
2b3f0 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
2b400 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20  zTable,.        
2b410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b420 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2b430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b440 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
2b450 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2b460 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  tx.in);.        
2b470 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2b480 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2b490 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2b4a0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2b4b0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2b4c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2b4d0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
2b4e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
2b4f0 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
2b500 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2b510 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2b520 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2b530 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2b540 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2b550 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
2b560 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2b570 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2b580 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  .    nCol = sqli
2b590 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
2b5a0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
2b5b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2b5c0 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
2b5d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  = 0;.    if( nCo
2b5e0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
2b5f0 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20   /* no columns, 
2b600 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  no error */.    
2b610 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2b620 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32  alloc64( nByte*2
2b630 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
2b640 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
2b650 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
2b660 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2b670 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
2b680 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78  ory\n");.      x
2b690 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2b6a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2b6b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2b6c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
2b6d0 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+20, zSql, "INS
2b6e0 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20  ERT INTO \"%w\" 
2b6f0 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c  VALUES(?", zTabl
2b700 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
2b710 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
2b720 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
2b730 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
2b740 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
2b750 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2b760 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
2b770 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
2b780 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
2b790 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b7a0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2b7b0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2b7c0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2b7d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2b7e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2b7f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2b800 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2b810 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2b820 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2b830 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
2b840 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
2b850 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
2b860 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2b870 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2b880 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65  1;.    }.    nee
2b890 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65  dCommit = sqlite
2b8a0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
2b8b0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  (p->db);.    if(
2b8c0 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
2b8d0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2b8e0 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
2b8f0 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20   0);.    do{.   
2b900 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
2b910 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20   = sCtx.nLine;. 
2b920 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2b930 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2b940 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52      char *z = xR
2b950 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20  ead(&sCtx);.    
2b960 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
2b970 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
2b980 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72  nd-of-file befor
2b990 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f  e finding any co
2b9a0 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a  lumns?.        *
2b9b0 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e  * If so, stop in
2b9c0 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
2b9d0 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e  lling the remain
2b9e0 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
2b9f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ba00 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30  if( z==0 && i==0
2ba10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2ba20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
2ba30 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
2ba40 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d  -of-file OR end-
2ba50 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66  of-line before f
2ba60 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20  inding any.     
2ba70 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
2ba80 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66   ASCII mode?  If
2ba90 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61   so, stop instea
2baa0 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e  d of NULL fillin
2bab0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
2bac0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
2bad0 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
2bae0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f         if( p->mo
2baf0 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26  de==MODE_Ascii &
2bb00 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  & (z==0 || z[0]=
2bb10 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72  =0) && i==0 ) br
2bb20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
2bb30 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
2bb40 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31  Stmt, i+1, z, -1
2bb50 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
2bb60 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NT);.        if(
2bb70 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74   i<nCol-1 && sCt
2bb80 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
2bb90 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
2bba0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2bbb0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
2bbc0 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2bbd0 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
2bbe0 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
2bc00 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20  illing the rest 
2bc10 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20  with NULL\n",.  
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc30 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
2bc40 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
2bc50 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
2bc60 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
2bc70 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c         while( i<
2bc80 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33  =nCol ){ sqlite3
2bc90 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
2bca0 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20  , i); i++; }.   
2bcb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2bcc0 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
2bcd0 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm==sCtx.cColSe
2bce0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  p ){.        do{
2bcf0 0a 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64  .          xRead
2bd00 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
2bd10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
2bd20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
2bd30 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
2bd40 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38   );.        utf8
2bd50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bd60 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
2bd70 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
2bd80 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bda0 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e       "extras ign
2bdb0 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ored\n",.       
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
2bde0 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29  rtLine, nCol, i)
2bdf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2be00 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20  if( i>=nCol ){. 
2be10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2be20 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
2be30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2be40 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
2be50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2be60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2be80 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
2be90 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a  : INSERT failed:
2bea0 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69   %s\n", sCtx.zFi
2beb0 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
2bec0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c            startL
2bed0 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ine, sqlite3_err
2bee0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2bef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2bf00 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e     }while( sCtx.
2bf10 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20  cTerm!=EOF );.. 
2bf20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2bf30 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
2bf40 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
2bf50 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2bf60 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2bf70 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29  if( needCommit )
2bf80 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2bf90 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  >db, "COMMIT", 0
2bfa0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
2bfb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2bfc0 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66  _UNTESTABLE.  if
2bfd0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
2bfe0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
2bff0 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20  mposter", n)==0 
2c000 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
2c010 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  l;.    char *zCo
2c020 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73  llist = 0;.    s
2c030 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2c040 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d  mt;.    int tnum
2c050 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
2c060 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
2c070 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2c080 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2c090 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20  sage: .imposter 
2c0a0 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e  INDEX IMPOSTER\n
2c0b0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2c0c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2c0d0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2c0e0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2c0f0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71  b(p, 0);.    zSq
2c100 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2c110 6e 74 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74  ntf("SELECT root
2c120 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
2c130 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
2c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c150 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
2c160 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
2c170 69 6e 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31  index'", azArg[1
2c180 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
2c190 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2c1a0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2c1b0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
2c1c0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2c1d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2c1e0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2c1f0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
2c200 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f   tnum = sqlite3_
2c210 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2c220 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2c230 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2c240 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
2c250 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   tnum==0 ){.    
2c260 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c270 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69  derr, "no such i
2c280 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  ndex: \"%s\"\n",
2c290 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2c2a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2c2b0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2c2c0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2c2d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2c2e0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
2c2f0 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71   index_xinfo='%q
2c300 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  '", azArg[1]);. 
2c310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2c320 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2c330 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2c340 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
2c350 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2c360 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77      i = 0;.    w
2c370 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
2c380 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2c390 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63  E_ROW ){.      c
2c3a0 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a  har zLabel[20];.
2c3b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2c3c0 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20   *zCol = (const 
2c3d0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2c3e0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2c3f0 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  2);.      i++;. 
2c400 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30       if( zCol==0
2c410 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2c420 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c430 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20  nt(pStmt,1)==-1 
2c440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
2c450 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20  l = "_ROWID_";. 
2c460 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c480 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2c490 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22  zLabel),zLabel,"
2c4a0 65 78 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20  expr%d",i);.    
2c4b0 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61        zCol = zLa
2c4c0 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  bel;.        }. 
2c4d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c4e0 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a   zCollist==0 ){.
2c4f0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
2c500 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2c510 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f  tf("\"%w\"", zCo
2c520 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
2c530 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73  .        zCollis
2c540 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
2c550 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c  ntf("%z,\"%w\"",
2c560 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29   zCollist, zCol)
2c570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c580 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2c590 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2c5a0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2c5b0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2c5c0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
2c5d0 20 5c 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41   \"%w\"(%s,PRIMA
2c5e0 52 59 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f  RY KEY(%s))WITHO
2c5f0 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20  UT ROWID",.     
2c600 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a       azArg[2], z
2c610 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73  Collist, zCollis
2c620 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2c630 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
2c640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c650 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2c660 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2c670 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
2c680 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
2c690 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c6a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c6b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2c6c0 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  c(p->db, zSql, 0
2c6d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2c6e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2c6f0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2c700 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
2c710 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  >db, "main", 0, 
2c720 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2c730 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2c740 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2c750 22 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20  "Error in [%s]: 
2c760 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c  %s\n", zSql, sql
2c770 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2c780 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  b));.      }else
2c790 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2c7a0 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
2c7b0 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  s;\n", zSql);.  
2c7c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c7d0 28 73 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20  (stdout,.       
2c7e0 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72      "WARNING: wr
2c7f0 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f  iting to an impo
2c800 73 74 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20  ster table will 
2c810 63 6f 72 72 75 70 74 20 74 68 65 20 69 6e 64 65  corrupt the inde
2c820 78 21 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b  x!\n".        );
2c830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2c840 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2c850 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
2c860 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2c870 50 4f 53 54 45 52 20 72 65 74 75 72 6e 73 20 25  POSTER returns %
2c880 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
2c890 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2c8a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c8b0 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  zSql);.  }else.#
2c8c0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
2c8d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  d(SQLITE_OMIT_TE
2c8e0 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a  ST_CONTROL) */..
2c8f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2c900 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69  ABLE_IOTRACE.  i
2c910 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
2c920 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c930 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20  iotrace", n)==0 
2c940 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50  ){.    SQLITE_AP
2c950 49 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53  I extern void (S
2c960 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c  QLITE_CDECL *sql
2c970 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
2c980 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a  st char*, ...);.
2c990 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20      if( iotrace 
2c9a0 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f  && iotrace!=stdo
2c9b0 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72  ut ) fclose(iotr
2c9c0 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63  ace);.    iotrac
2c9d0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  e = 0;.    if( n
2c9e0 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73  Arg<2 ){.      s
2c9f0 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
2ca00 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2ca10 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2ca20 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20  , "-")==0 ){.   
2ca30 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
2ca40 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74  e = iotracePrint
2ca50 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  f;.      iotrace
2ca60 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d   = stdout;.    }
2ca70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72  else{.      iotr
2ca80 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  ace = fopen(azAr
2ca90 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20  g[1], "w");.    
2caa0 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30    if( iotrace==0
2cab0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2cac0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2cad0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
2cae0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
2caf0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2cb00 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
2cb10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2cb20 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
2cb30 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2cb40 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
2cb50 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
2cb60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2cb70 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2cb80 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26  =='l' && n>=5 &&
2cb90 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2cba0 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d  ], "limits", n)=
2cbb0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
2cbc0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
2cbd0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2cbe0 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20  r *zLimitName;  
2cbf0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69   /* Name of a li
2cc00 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e  mit */.       in
2cc10 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20  t limitCode;    
2cc20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
2cc30 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74  er code for that
2cc40 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20   limit */.    } 
2cc50 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20  aLimit[] = {.   
2cc60 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20     { "length",  
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2cc80 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
2cc90 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
2cca0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2ccb0 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20  "sql_length",   
2ccc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2ccd0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccf0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75  },.      { "colu
2cd00 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  mn",            
2cd10 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2cd20 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
2cd30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2cd40 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74      { "expr_dept
2cd50 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  h",            S
2cd60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2cd70 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
2cd80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2cd90 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63   "compound_selec
2cda0 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  t",       SQLITE
2cdb0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
2cdc0 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
2cdd0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62   },.      { "vdb
2cde0 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20  e_op",          
2cdf0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2ce00 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ce20 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e       { "function
2ce30 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20 20 20  _arg",          
2ce40 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
2ce50 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
2ce60 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2ce70 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20 20 20  { "attached",   
2ce80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2ce90 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ceb0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69    },.      { "li
2cec0 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74  ke_pattern_lengt
2ced0 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  h",   SQLITE_LIM
2cee0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
2cef0 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a  LENGTH       },.
2cf00 20 20 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c        { "variabl
2cf10 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20  e_number",      
2cf20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
2cf30 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
2cf40 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2cf50 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70 74   { "trigger_dept
2cf60 68 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  h",         SQLI
2cf70 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
2cf80 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
2cf90 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77     },.      { "w
2cfa0 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20  orker_threads", 
2cfb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2cfc0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
2cfd0 44 53 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  DS            },
2cfe0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
2cff0 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f  i, n2;.    open_
2d000 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
2d010 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
2d020 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
2d030 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
2d040 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
2d050 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e  rintf("%20s %d\n
2d060 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69  ", aLimit[i].zLi
2d070 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  mitName,.       
2d080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2d090 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69  limit(p->db, aLi
2d0a0 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65  mit[i].limitCode
2d0b0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a  , -1));.      }.
2d0c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
2d0d0 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61  rg>3 ){.      ra
2d0e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d0f0 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20   "Usage: .limit 
2d100 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f  NAME ?NEW-VALUE?
2d110 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2d120 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2d130 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2d140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d150 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20     int iLimit = 
2d160 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73  -1;.      n2 = s
2d170 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d  trlen30(azArg[1]
2d180 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
2d190 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c  ; i<ArraySize(aL
2d1a0 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  imit); i++){.   
2d1b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2d1c0 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74  _strnicmp(aLimit
2d1d0 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20  [i].zLimitName, 
2d1e0 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30  azArg[1], n2)==0
2d1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2d200 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ( iLimit<0 ){.  
2d210 20 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74            iLimit
2d220 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2d230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d240 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2d250 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75  tderr, "ambiguou
2d260 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c  s limit: \"%s\"\
2d270 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
2d280 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2d290 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  1;.            g
2d2a0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2d2b0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2d2c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d2d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2d2e0 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
2d2f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2d300 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
2d310 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22  limit: \"%s\"\n"
2d320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d330 20 20 20 20 20 20 20 20 20 22 65 6e 74 65 72 20           "enter 
2d340 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68  \".limits\" with
2d350 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
2d360 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20  r a list.\n",.  
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d380 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
2d390 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2d3a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
2d3b0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2d3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d3d0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
2d3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
2d3f0 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
2d400 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74  it[iLimit].limit
2d410 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Code,.          
2d420 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
2d430 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
2d440 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[2]));.      
2d450 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
2d460 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d  %20s %d\n", aLim
2d470 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69  it[iLimit].zLimi
2d480 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  tName,.         
2d490 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
2d4a0 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b  t(p->db, aLimit[
2d4b0 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64  iLimit].limitCod
2d4c0 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  e, -1));.    }. 
2d4d0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2d4e0 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73  ='l' && n>2 && s
2d4f0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2d500 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29   "lint", n)==0 )
2d510 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
2d520 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74   0);.    lintDot
2d530 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67  Command(p, azArg
2d540 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
2d550 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2d560 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2d570 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c  SION.  if( c=='l
2d580 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2d590 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e  rg[0], "load", n
2d5a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2d5b0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a  t char *zFile, *
2d5c0 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20  zProc;.    char 
2d5d0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2d5e0 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
2d5f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2d600 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2d610 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54   .load FILE ?ENT
2d620 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20  RYPOINT?\n");.  
2d630 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d640 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2d650 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2d660 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
2d670 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20  g[1];.    zProc 
2d680 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  = nArg>=3 ? azAr
2d690 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70  g[2] : 0;.    op
2d6a0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2d6b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
2d6c0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
2d6d0 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
2d6e0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2d6f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
2d710 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d720 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
2d730 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
2d740 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2d750 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
2d760 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2d770 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
2d780 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d  c=='l' && strncm
2d790 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67  p(azArg[0], "log
2d7a0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2d7b0 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20  if( nArg!=2 ){. 
2d7c0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2d7d0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2d7e0 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  .log FILENAME\n"
2d7f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2d800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2d820 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
2d830 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c        output_fil
2d840 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29  e_close(p->pLog)
2d850 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20  ;.      p->pLog 
2d860 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
2d870 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  en(zFile);.    }
2d880 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2d890 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d  c=='m' && strncm
2d8a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64  p(azArg[0], "mod
2d8b0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2d8c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
2d8d0 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  de = nArg>=2 ? a
2d8e0 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20  zArg[1] : "";.  
2d8f0 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65    int n2 = strle
2d900 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20  n30(zMode);.    
2d910 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30  int c2 = zMode[0
2d920 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27  ];.    if( c2=='
2d930 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
2d940 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2d950 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  lines",n2)==0 ){
2d960 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2d970 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20   MODE_Line;.    
2d980 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d990 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2d9a0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2d9b0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2d9c0 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
2d9d0 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20   if( c2=='c' && 
2d9e0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2d9f0 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d  ,"columns",n2)==
2da00 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2da10 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  de = MODE_Column
2da20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2da30 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2da40 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2da50 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
2da60 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
2da70 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2da80 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
2da90 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2daa0 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  list",n2)==0 ){.
2dab0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
2dac0 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
2dad0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2dae0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
2daf0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
2db00 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
2db10 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
2db20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2db30 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2db40 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2db50 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
2db60 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
2db70 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72  ( c2=='h' && str
2db80 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68  ncmp(azArg[1],"h
2db90 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  tml",n2)==0 ){. 
2dba0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2dbb0 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65  ODE_Html;.    }e
2dbc0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20  lse if( c2=='t' 
2dbd0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2dbe0 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30  [1],"tcl",n2)==0
2dbf0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2dc00 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20  e = MODE_Tcl;.  
2dc10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2dc20 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
2dc30 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
2dc40 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
2dc50 45 50 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20  EP_Space);.     
2dc60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2dc70 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
2dc80 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
2dc90 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2dca0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
2dcb0 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73  if( c2=='c' && s
2dcc0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
2dcd0 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  "csv",n2)==0 ){.
2dce0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
2dcf0 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20  MODE_Csv;.      
2dd00 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2dd10 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
2dd20 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
2dd30 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
2dd40 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  omma);.      sql
2dd50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2dd60 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2dd70 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2dd80 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66  arator, SEP_CrLf
2dd90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2dda0 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e   c2=='t' && strn
2ddb0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61  cmp(azArg[1],"ta
2ddc0 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  bs",n2)==0 ){.  
2ddd0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2dde0 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
2ddf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2de00 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
2de10 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
2de20 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61  eparator, SEP_Ta
2de30 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
2de40 28 20 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72  ( c2=='i' && str
2de50 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69  ncmp(azArg[1],"i
2de60 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b  nsert",n2)==0 ){
2de70 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2de80 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
2de90 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61      set_table_na
2dea0 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20  me(p, nArg>=3 ? 
2deb0 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c  azArg[2] : "tabl
2dec0 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  e");.    }else i
2ded0 66 28 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74  f( c2=='q' && st
2dee0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2def0 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b  quote",n2)==0 ){
2df00 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2df10 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20   MODE_Quote;.   
2df20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2df30 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
2df40 41 72 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e  Arg[1],"ascii",n
2df50 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2df60 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73  ->mode = MODE_As
2df70 63 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  cii;.      sqlit
2df80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2df90 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
2dfa0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
2dfb0 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b  ator, SEP_Unit);
2dfc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2dfd0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2dfe0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2dff0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2e000 2c 20 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20  , SEP_Record);. 
2e010 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72     }else if( nAr
2e020 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g==1 ){.      ra
2e030 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2e040 20 22 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74   "current output
2e050 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f   mode: %s\n", mo
2e060 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
2e070 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e080 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2e090 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
2e0a0 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ode should be on
2e0b0 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20  e of: ".        
2e0c0 20 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63   "ascii column c
2e0d0 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c  sv html insert l
2e0e0 69 6e 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74  ine list quote t
2e0f0 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20  abs tcl\n");.   
2e100 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2e110 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
2e120 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  p->mode;.  }else
2e130 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26  ..  if( c=='n' &
2e140 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e150 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  0], "nullvalue",
2e160 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2e170 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2e180 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2e190 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75  ntf(sizeof(p->nu
2e1a0 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c  llValue), p->nul
2e1b0 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  lValue,.        
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e1d0 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
2e1e0 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c  ySize(p->nullVal
2e1f0 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29  ue)-1, azArg[1])
2e200 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e210 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2e220 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e  derr, "Usage: .n
2e230 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c  ullvalue STRING\
2e240 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2e250 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2e260 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26  ..  if( c=='o' &
2e270 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e280 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d  0], "open", n)==
2e290 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20  0 && n>=2 ){.   
2e2a0 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e   char *zNewFilen
2e2b0 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
2e2c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e2d0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2e2e0 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b    int iName = 1;
2e2f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e300 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68  in azArg[] of th
2e310 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20  e filename */.  
2e320 20 20 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20    int newFlag = 
2e330 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  0;     /* True t
2e340 6f 20 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65  o delete file be
2e350 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a  fore opening */.
2e360 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65      /* Close the
2e370 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
2e380 73 65 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  se */.    sessio
2e390 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a  n_close_all(p);.
2e3a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2e3b0 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  e(p->db);.    p-
2e3c0 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  >db = 0;.    p->
2e3d0 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  zDbFilename = 0;
2e3e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e3f0 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73  e(p->zFreeOnClos
2e400 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46 72 65 65  e);.    p->zFree
2e410 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 20  OnClose = 0;.   
2e420 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
2e430 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
2e440 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ;.    /* Check f
2e450 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  or command-line 
2e460 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
2e470 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e   for(iName=1; iN
2e480 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a 41 72  ame<nArg && azAr
2e490 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27  g[iName][0]=='-'
2e4a0 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20  ; iName++){.    
2e4b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2e4c0 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a  = azArg[iName];.
2e4d0 20 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e        if( option
2e4e0 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29 20 29  Match(z,"new") )
2e4f0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46 6c 61  {.        newFla
2e500 67 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  g = 1;.#ifdef SQ
2e510 4c 49 54 45 5f 48 41 56 45 5f 5a 49 50 0a 20 20  LITE_HAVE_ZIP.  
2e520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
2e530 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 7a 69  tionMatch(z, "zi
2e540 70 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  p") ){.        p
2e550 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
2e560 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
2e570 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2e580 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
2e590 74 63 68 28 7a 2c 20 22 61 70 70 65 6e 64 22 29  tch(z, "append")
2e5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
2e5b0 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
2e5c0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a  OPEN_APPENDVFS;.
2e5d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e5e0 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]=='-' ){.   
2e5f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e600 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
2e610 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
2e620 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   z);.        rc 
2e630 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2e640 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2e650 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2e660 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66   }.    /* If a f
2e670 69 6c 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69  ilename is speci
2e680 66 69 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65  fied, try to ope
2e690 6e 20 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20  n it first */.  
2e6a0 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d    zNewFilename =
2e6b0 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71   nArg>iName ? sq
2e6c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2e6d0 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d  s", azArg[iName]
2e6e0 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  ) : 0;.    if( z
2e6f0 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20  NewFilename ){. 
2e700 20 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67       if( newFlag
2e710 20 29 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69   ) shellDeleteFi
2e720 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  le(zNewFilename)
2e730 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69  ;.      p->zDbFi
2e740 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c  lename = zNewFil
2e750 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65  ename;.      ope
2e760 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20 20 20  n_db(p, 1);.    
2e770 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
2e780 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2e790 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2e7a0 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
2e7b0 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46  n '%s'\n", zNewF
2e7c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2e7d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e7e0 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
2e7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e800 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f     p->zFreeOnClo
2e810 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  se = zNewFilenam
2e820 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2e830 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
2e840 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73  0 ){.      /* As
2e850 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65   a fall-back ope
2e860 6e 20 61 20 54 45 4d 50 20 64 61 74 61 62 61 73  n a TEMP databas
2e870 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44  e */.      p->zD
2e880 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  bFilename = 0;. 
2e890 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20       open_db(p, 
2e8a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
2e8b0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 0a  e..  if( c=='o'.
2e8c0 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61     && (strncmp(a
2e8d0 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74  zArg[0], "output
2e8e0 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e  ", n)==0 || strn
2e8f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
2e900 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  nce", n)==0).  )
2e910 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e920 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d   *zFile = nArg>=
2e930 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
2e940 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69 66 28  stdout";.    if(
2e950 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20   nArg>2 ){.     
2e960 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e970 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73  err, "Usage: .%s
2e980 20 46 49 4c 45 5c 6e 22 2c 20 61 7a 41 72 67 5b   FILE\n", azArg[
2e990 30 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0]);.      rc = 
2e9a0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2e9b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2e9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2e9d0 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
2e9e0 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20  Arg[0], "once", 
2e9f0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
2ea00 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
2ea10 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ea20 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2ea30 2e 6f 6e 63 65 20 46 49 4c 45 5c 6e 22 29 3b 0a  .once FILE\n");.
2ea40 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2ea50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2ea60 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2ea70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
2ea80 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20  >outCount = 2;. 
2ea90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eaa0 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b  p->outCount = 0;
2eab0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75  .    }.    outpu
2eac0 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20  t_reset(p);.    
2ead0 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c  if( zFile[0]=='|
2eae0 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ' ){.#ifdef SQLI
2eaf0 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
2eb00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2eb10 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70  tderr, "Error: p
2eb20 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70  ipes are not sup
2eb30 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f  ported in this O
2eb40 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  S\n");.      rc 
2eb50 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  = 1;.      p->ou
2eb60 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73  t = stdout;.#els
2eb70 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d  e.      p->out =
2eb80 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31   popen(zFile + 1
2eb90 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66  , "w");.      if
2eba0 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20  ( p->out==0 ){. 
2ebb0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2ebc0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2ebd0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69  : cannot open pi
2ebe0 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  pe \"%s\"\n", zF
2ebf0 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ile + 1);.      
2ec00 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
2ec10 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
2ec20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2ec30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ec40 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2ec50 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
2ec60 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
2ec70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  File);.      }.#
2ec80 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2ec90 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
2eca0 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
2ecb0 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (zFile);.      i
2ecc0 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
2ecd0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2ece0 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21  mp(zFile,"off")!
2ecf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ed00 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2ed10 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2ed20 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c  t write to \"%s\
2ed30 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
2ed40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ed50 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
2ed60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2ed70 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
2ed80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ed90 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2eda0 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
2edb0 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
2edc0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
2edd0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ede0 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e  if( c=='p' && n>
2edf0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2ee00 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c  Arg[0], "print",
2ee10 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   n)==0 ){.    in
2ee20 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
2ee30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
2ee40 20 20 20 20 20 20 69 66 28 20 69 3e 31 20 29 20        if( i>1 ) 
2ee50 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2ee60 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 75  t, " ");.      u
2ee70 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2ee80 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  t, "%s", azArg[i
2ee90 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ]);.    }.    ra
2eea0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2eeb0 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a   "\n");.  }else.
2eec0 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
2eed0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2eee0 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d  ], "prompt", n)=
2eef0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2ef00 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20  rg >= 2) {.     
2ef10 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f   strncpy(mainPro
2ef20 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e  mpt,azArg[1],(in
2ef30 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61 69 6e  t)ArraySize(main
2ef40 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
2ef50 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  }.    if( nArg >
2ef60 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 3) {.      str
2ef70 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f  ncpy(continuePro
2ef80 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e  mpt,azArg[2],(in
2ef90 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f 6e 74  t)ArraySize(cont
2efa0 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a  inuePrompt)-1);.
2efb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2efc0 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26 20 73   if( c=='q' && s
2efd0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2efe0 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "quit", n)==0 )
2eff0 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20  {.    rc = 2;.  
2f000 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2f010 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
2f020 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f030 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "read", n)==0 )
2f040 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b  {.    FILE *alt;
2f050 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2f060 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2f070 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2f080 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c  age: .read FILE\
2f090 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2f0a0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2f0b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2f0c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d  .    }.    alt =
2f0d0 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
2f0e0 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
2f0f0 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  alt==0 ){.      
2f100 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2f110 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2f120 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2f130 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2f140 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f150 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2f160 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70   process_input(p
2f170 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63  , alt);.      fc
2f180 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d  lose(alt);.    }
2f190 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2f1a0 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
2f1b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2f1c0 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e  0], "restore", n
2f1d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2f1e0 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
2f1f0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2f200 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69 74   *zDb;.    sqlit
2f210 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
2f220 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
2f230 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
2f240 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
2f250 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2f260 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
2f270 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
2f280 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a    zDb = "main";.
2f290 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
2f2a0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  rg==3 ){.      z
2f2b0 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  SrcFile = azArg[
2f2c0 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20  2];.      zDb = 
2f2d0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65  azArg[1];.    }e
2f2e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2f2f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2f300 73 61 67 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f  sage: .restore ?
2f310 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  DB? FILE\n");.  
2f320 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f330 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2f340 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2f350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f360 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20  _open(zSrcFile, 
2f370 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20  &pSrc);.    if( 
2f380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f390 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2f3a0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2f3b0 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2f3c0 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69  "%s\"\n", zSrcFi
2f3d0 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
2f3e0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
2f3f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2f400 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2f410 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
2f420 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
2f430 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62  ackup_init(p->db
2f440 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  , zDb, pSrc, "ma
2f450 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
2f460 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
2f470 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2f480 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2f490 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2f4a0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2f4b0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
2f4c0 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
2f4d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2f4e0 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
2f4f0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
2f500 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
2f510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
2f520 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
2f530 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20  ITE_BUSY  ){.   
2f540 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f550 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
2f560 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
2f570 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
2f580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2f590 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
2f5a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2f5b0 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
2f5c0 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
2f5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f5e0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
2f5f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
2f600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
2f610 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
2f620 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
2f630 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f640 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75  err, "Error: sou
2f650 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20  rce database is 
2f660 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  busy\n");.      
2f670 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
2f680 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
2f690 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2f6a0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2f6b0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2f6c0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
2f6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2f6e0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
2f6f0 0a 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 69 66 28  .  }else...  if(
2f700 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
2f710 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
2f720 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20  anstats", n)==0 
2f730 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2f740 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
2f750 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f  canstatsOn = boo
2f760 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2f770 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
2f780 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
2f790 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
2f7a0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f7b0 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
2f7c0 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
2f7d0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
2f7e0 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
2f7f0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2f800 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f810 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
2f820 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
2f830 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2f840 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2f850 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
2f860 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2f870 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
2f880 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2f890 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
2f8a0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
2f8b0 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
2f8c0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
2f8d0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
2f8e0 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
2f8f0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
2f900 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
2f910 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
2f920 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
2f930 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
2f940 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
2f950 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
2f960 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
2f970 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
2f980 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
2f990 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
2f9a0 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
2f9b0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
2f9c0 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
2f9d0 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
2f9e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
2f9f0 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
2fa00 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
2fa10 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
2fa20 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2fa30 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
2fa40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fa50 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
2fa60 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
2fa70 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
2fa80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
2fa90 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
2faa0 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
2fab0 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
2fac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fad0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2fae0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
2faf0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
2fb00 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
2fb10 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2fb20 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2fb30 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2fb40 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2fb50 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
2fb60 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
2fb70 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
2fb80 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
2fb90 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
2fba0 22 2c 20 30 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ", 0)==0;.      
2fbb0 69 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20  if( isMaster || 
2fbc0 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
2fbd0 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65  zName,"sqlite_te
2fbe0 6d 70 5f 6d 61 73 74 65 72 22 2c 30 29 3d 3d 30  mp_master",0)==0
2fbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2fc00 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
2fc10 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
2fc20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
2fc30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2fc40 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
2fc50 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
2fc60 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
2fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc80 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
2fc90 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2fcb0 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcd0 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
2fce0 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2fd00 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
2fd10 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
2fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2fd30 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
2fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd50 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
2fd60 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
2fd70 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
2fd80 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
2fd90 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
2fda0 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
2fdb0 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
2fdc0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
2fdd0 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
2fde0 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
2fdf0 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
2fe00 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
2fe10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
2fe20 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
2fe30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2fe40 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
2fe50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2fe60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
2fe70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2fe80 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
2fe90 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
2fea0 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
2feb0 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
2fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fed0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
2fee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2fef0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2ff00 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2ff10 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2ff20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2ff30 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
2ff40 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2ff50 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2ff60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2ff70 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2ff80 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2ff90 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
2ffa0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
2ffb0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
2ffc0 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
2ffd0 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
2ffe0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
2fff0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
30000 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
30010 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
30020 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
30030 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
30040 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
30050 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
30060 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
30070 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30080 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
30090 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
300a0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
300b0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
300c0 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
300d0 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
300e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
300f0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
30100 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
30110 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
30120 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
30130 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
30140 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
30150 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
30160 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
30170 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
30180 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
30190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
301a0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
301b0 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
301c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
301d0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
301e0 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
301f0 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
30200 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
30210 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
30220 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
30230 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
30240 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
30250 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
30260 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
30270 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
30280 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
30290 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
302a0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
302b0 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
302c0 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
302d0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
302e0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
302f0 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
30300 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
30310 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
30320 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
30330 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30340 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
30350 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
30360 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
30370 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
30380 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
30390 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
303a0 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
303b0 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
303c0 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
303d0 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
303e0 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
303f0 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
30400 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
30410 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
30420 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
30430 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
30440 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
30450 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
30460 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
30470 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
30480 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
30490 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
304a0 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
304b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
304c0 28 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20  ( strchr(zName, 
304d0 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
304e0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
304f0 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72  elect, "lower(pr
30500 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61  intf('%s.%s',sna
30510 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20  me,tbl_name))", 
30520 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
30530 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
30540 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
30550 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d  , "lower(tbl_nam
30560 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  e)", 0);.       
30570 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
30580 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
30590 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a  strchr(zName, '*
305a0 27 29 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20  ') ? " GLOB " : 
305b0 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20  " LIKE ", 0);.  
305c0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
305d0 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67  (&sSelect, zQarg
305e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
305f0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
30600 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a  t, " AND ", 0);.
30610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
30620 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20  free(zQarg);.   
30630 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
30640 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
30650 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e  "type!='meta' AN
30660 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
30670 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L".             
30680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
30690 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72  ORDER BY snum, r
306a0 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  owid", 0);.     
306b0 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20   if( bDebug ){. 
306c0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
306d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a  tf(p->out, "SQL:
306e0 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74   %s;\n", sSelect
306f0 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .z);.      }else
30700 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
30710 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
30720 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61  b, sSelect.z, ca
30730 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
30740 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
30750 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74  }.      freeText
30760 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
30770 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
30780 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
30790 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
307a0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
307b0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
307c0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
307d0 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
307e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
307f0 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc != SQLITE_OK 
30800 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
30810 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
30820 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65  r: querying sche
30830 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  ma information\n
30840 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
30850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30860 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
30870 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65  .  }else..#if de
30880 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
30890 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
308a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
308b0 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20  ECTTRACE).  if( 
308c0 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20  c=='s' && n==11 
308d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
308e0 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63  [0], "selecttrac
308f0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
30900 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
30910 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ace = (int)integ
30920 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
30930 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
30940 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
30950 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
30960 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27  SION).  if( c=='
30970 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
30980 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22  Arg[0],"session"
30990 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29  ,n)==0 && n>=3 )
309a0 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f  {.    OpenSessio
309b0 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70  n *pSession = &p
309c0 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20  ->aSession[0];. 
309d0 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20     char **azCmd 
309e0 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20  = &azArg[1];.   
309f0 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20   int iSes = 0;. 
30a00 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41     int nCmd = nA
30a10 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20  rg - 1;.    int 
30a20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  i;.    if( nArg<
30a30 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
30a40 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
30a50 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
30a60 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  );.    if( nArg>
30a70 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =3 ){.      for(
30a80 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e  iSes=0; iSes<p->
30a90 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b  nSession; iSes++
30aa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
30ab0 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f  trcmp(p->aSessio
30ac0 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61  n[iSes].zName, a
30ad0 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72  zArg[1])==0 ) br
30ae0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
30af0 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e     if( iSes<p->n
30b00 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
30b10 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70     pSession = &p
30b20 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
30b30 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b  ;.        azCmd+
30b40 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d  +;.        nCmd-
30b50 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
30b60 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
30b70 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
30b80 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73  0];.        iSes
30b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
30ba0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73    }..    /* .ses
30bb0 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c  sion attach TABL
30bc0 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  E.    ** Invoke 
30bd0 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
30be0 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65  on_attach() inte
30bf0 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20  rface to attach 
30c00 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20  a particular.   
30c10 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61   ** table so tha
30c20 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69  t it is never fi
30c30 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ltered..    */. 
30c40 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
30c50 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29  Cmd[0],"attach")
30c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
30c70 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20   nCmd!=2 ) goto 
30c80 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
30c90 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
30ca0 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29  pSession->p==0 )
30cb0 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
30cc0 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20  n_not_open:.    
30cd0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30ce0 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
30cf0 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f  o sessions are o
30d00 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  pen\n");.      }
30d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
30d20 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
30d30 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
30d40 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b  n->p, azCmd[1]);
30d50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
30d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
30d70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30d80 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73  "ERROR: sqlite3s
30d90 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
30da0 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
30db0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  c);.          rc
30dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
30dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
30de0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
30df0 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c  on changeset FIL
30e00 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f  E.    ** .sessio
30e10 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a  n patchset FILE.
30e20 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63      ** Write a c
30e30 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63  hangeset or patc
30e40 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65  hset into a file
30e50 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f  .  The file is o
30e60 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  verwritten..    
30e70 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
30e80 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e  p(azCmd[0],"chan
30e90 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74  geset")==0 || st
30ea0 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70  rcmp(azCmd[0],"p
30eb0 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a  atchset")==0 ){.
30ec0 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
30ed0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
30ee0 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
30ef0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
30f00 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
30f10 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67  ession->p==0 ) g
30f20 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f  oto session_not_
30f30 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20  open;.      out 
30f40 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d  = fopen(azCmd[1]
30f50 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
30f60 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
30f70 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30f80 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
30f90 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
30fa0 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c  s\" for writing\
30fb0 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  n", azCmd[1]);. 
30fc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30fd0 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a      int szChng;.
30fe0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
30ff0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  hng;.        if(
31000 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63   azCmd[0][0]=='c
31010 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ' ){.          r
31020 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
31030 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65  on_changeset(pSe
31040 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e  ssion->p, &szChn
31050 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20  g, &pChng);.    
31060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31070 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31080 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
31090 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
310a0 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
310b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
310c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
310d0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45         printf("E
310e0 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65  rror: error code
310f0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
31100 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
31110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31120 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20   if( pChng.     
31130 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70       && fwrite(p
31140 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c  Chng, szChng, 1,
31150 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20   out)!=1 ){.    
31160 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31170 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
31180 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65   Failed to write
31190 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20   entire %d-byte 
311a0 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20  output\n",.     
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43               szC
311c0 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
311d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
311e0 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20  free(pChng);.   
311f0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
31200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
31210 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
31220 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a  sion close.    *
31230 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e  * Close the iden
31240 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20  tified session. 
31250 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
31260 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
31270 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  close")==0 ){.  
31280 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
31290 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
312a0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
312b0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
312c0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  on ){.        se
312d0 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73  ssion_close(pSes
312e0 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  sion);.        p
312f0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
31300 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d   = p->aSession[-
31310 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  -p->nSession];. 
31320 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
31330 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
31340 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41  n enable ?BOOLEA
31350 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
31360 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c  or set the enabl
31370 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  e flag.    */.  
31380 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
31390 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29  md[0], "enable")
313a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
313b0 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
313c0 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
313d0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
313e0 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
313f0 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
31400 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
31410 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
31420 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
31430 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
31440 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65  e3session_enable
31450 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69  (pSession->p, ii
31460 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
31470 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
31480 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c  session %s enabl
31490 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  e flag = %d\n",.
314a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314b0 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
314c0 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
314d0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
314e0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c   /* .session fil
314f0 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20  ter GLOB .....  
31500 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20    ** Set a list 
31510 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73  of GLOB patterns
31520 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20   of table names 
31530 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  to be excluded..
31540 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
31550 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
31560 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a  "filter")==0 ){.
31570 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42        int ii, nB
31580 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  yte;.      if( n
31590 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd<2 ) goto ses
315a0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
315b0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
315c0 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
315d0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
315e0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
315f0 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  er; ii++){.     
31600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31610 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
31620 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20  lter[ii]);.     
31630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
31640 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
31650 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
31660 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
31670 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e  izeof(pSession->
31680 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43  azFilter[0])*(nC
31690 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70  md-1);.        p
316a0 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
316b0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
316c0 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
316d0 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
316e0 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29  n->azFilter==0 )
316f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
31700 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31710 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65  Error: out or me
31720 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
31730 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
31740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
31750 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64  or(ii=1; ii<nCmd
31760 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
31770 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
31780 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71  ilter[ii-1] = sq
31790 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
317a0 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a  s", azCmd[ii]);.
317b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
317c0 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
317d0 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20  ter = ii-1;.    
317e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
317f0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69     /* .session i
31800 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
31810 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
31820 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65  r set the indire
31830 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  ct flag.    */. 
31840 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
31850 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63  Cmd[0], "indirec
31860 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
31870 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
31880 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20  ( nCmd>2 ) goto 
31890 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
318a0 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d  rror;.      ii =
318b0 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20   nCmd==1 ? -1 : 
318c0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43  booleanValue(azC
318d0 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  md[1]);.      if
318e0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
318f0 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
31900 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64  lite3session_ind
31910 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e  irect(pSession->
31920 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
31930 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
31940 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
31950 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20  indirect flag = 
31960 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
31970 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73             pSess
31980 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b  ion->zName, ii);
31990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
319a0 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
319b0 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20  ion isempty.    
319c0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
319d0 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
319e0 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mpty.    */.    
319f0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
31a00 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d  [0], "isempty")=
31a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
31a20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
31a30 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73  md!=1 ) goto ses
31a40 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
31a50 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
31a60 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
31a70 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
31a80 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28  session_isempty(
31a90 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
31aa0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31ab0 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69  f(p->out, "sessi
31ac0 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c  on %s isempty fl
31ad0 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
31b00 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
31b10 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
31b20 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20  .session list.  
31b30 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75    ** List all cu
31b40 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73  rrently open ses
31b50 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20  sions.    */.   
31b60 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
31b70 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20  d[0],"list")==0 
31b80 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
31b90 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
31ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
31bb0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
31bc0 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c  t, "%d %s\n", i,
31bd0 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e   p->aSession[i].
31be0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
31bf0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
31c00 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20  * .session open 
31c10 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f  DB NAME.    ** O
31c20 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
31c30 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e  n called NAME on
31c40 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61   the attached da
31c50 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a  tabase DB..    *
31c60 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  * DB is normally
31c70 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a   "main"..    */.
31c80 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
31c90 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d  zCmd[0],"open")=
31ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
31cb0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69   *zName;.      i
31cc0 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74  f( nCmd!=3 ) got
31cd0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
31ce0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e  _error;.      zN
31cf0 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a  ame = azCmd[2];.
31d00 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
31d10 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  0]==0 ) goto ses
31d20 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
31d30 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
31d40 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
31d50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
31d60 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
31d70 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a  ssion[i].zName,z
31d80 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
31d90 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31da0 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69  f(stderr, "Sessi
31db0 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  on \"%s\" alread
31dc0 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61  y exists\n", zNa
31dd0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
31de0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
31df0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
31e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31e10 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d  f( p->nSession>=
31e20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
31e30 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  ssion) ){.      
31e40 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31e50 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66  err, "Maximum of
31e60 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c   %d sessions\n",
31e70 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53   ArraySize(p->aS
31e80 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  ession));.      
31e90 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31ea0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
31eb0 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e  }.      pSession
31ec0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
31ed0 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
31ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31ef0 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70  session_create(p
31f00 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20  ->db, azCmd[1], 
31f10 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  &pSession->p);. 
31f20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
31f30 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
31f40 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f  f(stderr, "Canno
31f50 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20  t open session: 
31f60 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22  error code=%d\n"
31f70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72  , rc);.        r
31f80 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  c = 0;.        g
31f90 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
31fa0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
31fb0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e       pSession->n
31fc0 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Filter = 0;.    
31fd0 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
31fe0 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53  _table_filter(pS
31ff0 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69  ession->p, sessi
32000 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73  on_filter, pSess
32010 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ion);.      p->n
32020 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20  Session++;.     
32030 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
32040 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
32050 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
32060 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f  .    }else.    /
32070 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20  * If no command 
32080 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68  name matches, sh
32090 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  ow a syntax erro
320a0 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  r */.    session
320b0 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20  _syntax_error:. 
320c0 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28     session_help(
320d0 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
320e0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
320f0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64  E_DEBUG.  /* Und
32100 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e  ocumented comman
32110 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ds for internal 
32120 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63  testing.  Subjec
32130 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a  t to change.  **
32140 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e   without notice.
32150 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27   */.  if( c=='s'
32160 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72   && n>=10 && str
32170 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
32180 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d  selftest-", 9)==
32190 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  0 ){.    if( str
321a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
321b0 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29   "boolean", n-9)
321c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
321d0 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72   i, v;.      for
321e0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
321f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  +){.        v = 
32200 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
32210 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
32220 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
32230 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78  ut, "%s: %d 0x%x
32240 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76  \n", azArg[i], v
32250 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
32260 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
32270 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
32280 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d  "integer", n-9)=
32290 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
322a0 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  i; sqlite3_int64
322b0 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
322c0 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
322d0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42  .        char zB
322e0 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20  uf[200];.       
322f0 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75   v = integerValu
32300 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
32310 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
32320 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
32330 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c  f),zBuf,"%s: %ll
32340 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41  d 0x%llx\n", azA
32350 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20  rg[i],v,v);.    
32360 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32370 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  p->out, "%s", zB
32380 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uf);.      }.   
32390 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
323a0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  f..  if( c=='s' 
323b0 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63  && n>=4 && strnc
323c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c  mp(azArg[0],"sel
323d0 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  ftest",n)==0 ){.
323e0 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20      int bIsInit 
323f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
32400 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  True to initiali
32410 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  ze the SELFTEST 
32420 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
32430 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
32440 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65        /* Verbose
32450 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
32460 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69 73  nt bSelftestExis
32470 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ts;     /* True 
32480 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65  if SELFTEST alre
32490 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
324a0 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20    int i, k;     
324b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
324c0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
324d0 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30     int nTest = 0
324e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
324f0 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
32500 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uns */.    int n
32510 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Err = 0;        
32520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
32530 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
32540 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74      ShellText st
32550 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
32560 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75 65  Answer for a que
32570 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ry */.    sqlite
32580 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
32590 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69  0; /* Query agai
325a0 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53 54  nst the SELFTEST
325b0 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f   table */..    o
325c0 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20  pen_db(p,0);.   
325d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
325e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
325f0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
32600 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
32610 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
32620 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
32630 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
32640 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
32650 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e 69  {.        bIsIni
32660 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
32670 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
32680 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29  cmp(z,"-v")==0 )
32690 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62 6f  {.        bVerbo
326a0 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  se++;.      }els
326b0 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  e.      {.      
326c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
326d0 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
326e0 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
326f0 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
32700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32710 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30  zArg[i], azArg[0
32720 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ]);.        raw_
32730 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32740 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  Should be one of
32750 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b  : --init -v\n");
32760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
32770 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
32780 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
32790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
327a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
327b0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
327c0 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e  data(p->db,"main
327d0 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30  ","selftest",0,0
327e0 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20  ,0,0,0,0).      
327f0 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f       != SQLITE_O
32800 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66  K ){.      bSelf
32810 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a  testExists = 0;.
32820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32830 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
32840 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
32850 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20  if( bIsInit ){. 
32860 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66 74       createSelft
32870 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20  estTable(p);.   
32880 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
32890 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
328a0 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72 29    initText(&str)
328b0 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
328c0 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a  (&str, "x", 0);.
328d0 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74      for(k=bSelft
328e0 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b  estExists; k>=0;
328f0 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   k--){.      if(
32900 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k==1 ){.       
32910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
32920 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
32930 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
32940 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  ECT tno,op,cmd,a
32950 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  ns FROM selftest
32960 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a   ORDER BY tno",.
32970 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
32980 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
32990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
329a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
329b0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
329c0 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45            "VALUE
329d0 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73  S(0,'memo','Miss
329e0 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61 62  ing SELFTEST tab
329f0 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65  le - default che
32a00 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a  cks only',''),".
32a10 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
32a20 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d   (1,'run','PRAGM
32a30 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
32a40 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20  k','ok')",.     
32a50 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
32a60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
32a70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
32a80 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32a90 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71  stderr, "Error q
32aa0 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66  uerying the self
32ab0 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a  test table\n");.
32ac0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32ae0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
32af0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
32b00 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
32b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
32b20 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f  or(i=1; sqlite3_
32b30 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
32b40 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20  ITE_ROW; i++){. 
32b50 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d         int tno =
32b60 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
32b70 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
32b80 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
32b90 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
32ba0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
32bb0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
32bc0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   1);.        con
32bd0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
32be0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
32bf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
32c00 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
32c10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
32c20 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  zAns = (const ch
32c30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
32c40 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33  mn_text(pStmt, 3
32c50 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  );..        k = 
32c60 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  0;.        if( b
32c70 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20  Verbose>0 ){.   
32c80 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75         char *zQu
32c90 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ote = sqlite3_mp
32ca0 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c  rintf("%q", zSql
32cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  );.          pri
32cc0 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e  ntf("%d: %s %s\n
32cd0 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71  ", tno, zOp, zSq
32ce0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
32cf0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
32d00 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
32d10 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
32d20 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20  (zOp,"memo")==0 
32d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
32d40 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
32d50 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
32d60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
32d70 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
32d80 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29  (zOp,"run")==0 )
32d90 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
32da0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
32db0 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d           str.n =
32dc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
32dd0 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  r.z[0] = 0;.    
32de0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32df0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
32e00 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70  Sql, captureOutp
32e10 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72  utCallback, &str
32e20 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
32e30 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a         nTest++;.
32e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 56            if( bV
32e50 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
32e60 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32e70 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c  f(p->out, "Resul
32e80 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29  t: %s\n", str.z)
32e90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32ea0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 7c          if( rc |
32eb0 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
32ec0 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
32ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32ee0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
32ef0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
32f00 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d  out, "%d: error-
32f10 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20  code-%d: %s\n", 
32f20 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  tno, rc, zErrMsg
32f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
32f40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
32f50 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
32f60 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
32f70 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20  (zAns,str.z)!=0 
32f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
32f90 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
32fa0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
32fb0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32fc0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20  tf(p->out, "%d: 
32fd0 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
32fe0 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20  ", tno, zAns);. 
32ff0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
33000 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33010 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  %d:      Got: [%
33020 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e  s]\n", tno, str.
33030 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  z);.          }.
33040 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
33050 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
33060 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
33070 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
33080 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61    "Unknown opera
33090 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73  tion \"%s\" on s
330a0 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c  elftest line %d\
330b0 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20  n", zOp, tno);. 
330c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
330d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
330e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
330f0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
33100 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e  over rows of con
33110 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45  tent from SELFTE
33120 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ST */.      sqli
33130 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
33140 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  mt);.    } /* En
33150 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f  d loop over k */
33160 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
33170 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  tr);.    utf8_pr
33180 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
33190 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
331a0 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72  d tests\n", nErr
331b0 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , nTest);.  }els
331c0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
331d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
331e0 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
331f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
33200 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72  f( nArg<2 || nAr
33210 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
33220 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33230 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74  "Usage: .separat
33240 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29  or COL ?ROW?\n")
33250 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33260 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
33270 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
33280 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33290 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
332a0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
332b0 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
332c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332d0 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
332e0 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65  raySize(p->colSe
332f0 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
33300 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[1]);.    }.   
33310 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
33320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
33330 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
33340 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
33350 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
33360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33370 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
33380 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
33390 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d  ->rowSeparator)-
333a0 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  1, azArg[2]);.  
333b0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
333c0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
333d0 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
333e0 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c  rg[0],"sha3sum",
333f0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
33400 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
33410 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74   0;   /* Which t
33420 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d  able to checksum
33430 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74  . 0 means everyt
33440 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hing */.    int 
33450 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
33460 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33470 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
33480 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  bSchema = 0;    
33490 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73       /* Also has
334a0 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  h the schema */.
334b0 20 20 20 20 69 6e 74 20 62 53 65 70 61 72 61 74      int bSeparat
334c0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
334d0 48 61 73 68 20 65 61 63 68 20 74 61 62 6c 65 20  Hash each table 
334e0 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20  separately */.  
334f0 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32    int iSize = 22
33500 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  4;         /* Ha
33510 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  sh algorithm to 
33520 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  use */.    int b
33530 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20  Debug = 0;      
33540 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77      /* Only show
33550 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74 20   the query that 
33560 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a  would have run *
33570 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
33580 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
33590 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74  * For querying t
335a0 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20  ables names */. 
335b0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
335c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
335d0 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  QL to be run */.
335e0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20      char *zSep; 
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33600 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20  Separator */.   
33610 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b   ShellText sSql;
33620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
33630 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68  plete SQL for th
33640 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74  e query to run t
33650 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53  he hash */.    S
33660 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b  hellText sQuery;
33670 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
33680 66 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  f queries used t
33690 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65  o read all conte
336a0 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64  nt */.    open_d
336b0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
336c0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
336d0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
336e0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
336f0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  i];.      if( z[
33700 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
33710 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
33720 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  if( z[0]=='-' ) 
33730 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
33740 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d   strcmp(z,"schem
33750 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  a")==0 ){.      
33760 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b      bSchema = 1;
33770 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
33780 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
33790 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d  p(z,"sha3-224")=
337a0 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
337b0 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20  sha3-256")==0.  
337c0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
337d0 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d  (z,"sha3-384")==
337e0 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73  0 || strcmp(z,"s
337f0 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20  ha3-512")==0.   
33800 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
33810 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26    iSize = atoi(&
33820 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[5]);.        }
33830 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
33840 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67   strcmp(z,"debug
33850 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
33860 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
33870 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
33880 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
33890 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
338a0 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
338b0 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
338c0 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
338d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338e0 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
338f0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0]);.          r
33900 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
33910 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65  , "Should be one
33920 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20   of: --schema". 
33930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33940 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d              " --
33950 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d  sha3-224 --sha3-
33960 32 35 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d  255 --sha3-384 -
33970 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20  -sha3-512\n");. 
33980 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
33990 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
339a0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
339b0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
339c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
339d0 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
339e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
339f0 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75   "Usage: .sha3su
33a00 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b  m ?OPTIONS? ?LIK
33a10 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
33a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
33a30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
33a40 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
33a50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33a60 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a       zLike = z;.
33a70 20 20 20 20 20 20 20 20 62 53 65 70 61 72 61 74          bSeparat
33a80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
33a90 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
33aa0 6b 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 7a  ke("sqlite_%", z
33ab0 4c 69 6b 65 2c 20 30 29 3d 3d 30 20 29 20 62 53  Like, 0)==0 ) bS
33ac0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
33ad0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
33ae0 20 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   bSchema ){.    
33af0 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
33b00 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
33b10 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
33b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
33b30 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
33b40 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
33b50 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
33b60 20 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e              " UN
33b70 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
33b80 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 0a  sqlite_master'".
33b90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
33ba0 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
33bb0 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
33bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
33bd0 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
33be0 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
33bf0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
33c00 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
33c10 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
33c20 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
33c30 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
33c40 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65        " AND name
33c50 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
33c60 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20  e_%'".          
33c70 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
33c80 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
33c90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33ca0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
33cb0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
33cc0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
33cd0 6e 69 74 54 65 78 74 28 26 73 51 75 65 72 79 29  nitText(&sQuery)
33ce0 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  ;.    initText(&
33cf0 73 53 71 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e  sSql);.    appen
33d00 64 54 65 78 74 28 26 73 53 71 6c 2c 20 22 57 49  dText(&sSql, "WI
33d10 54 48 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72  TH [sha3sum$quer
33d20 79 5d 28 61 2c 62 29 20 41 53 28 22 2c 30 29 3b  y](a,b) AS(",0);
33d30 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 56 41 4c  .    zSep = "VAL
33d40 55 45 53 28 22 3b 0a 20 20 20 20 77 68 69 6c 65  UES(";.    while
33d50 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
33d60 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
33d70 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
33d80 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63   char *zTab = (c
33d90 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
33da0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
33db0 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 69  Stmt,0);.      i
33dc0 66 28 20 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69  f( zLike && sqli
33dd0 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b  te3_strlike(zLik
33de0 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d 30 20 29  e, zTab, 0)!=0 )
33df0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
33e00 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
33e10 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c 37 29 21  b, "sqlite_",7)!
33e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
33e30 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
33e40 2c 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ,"SELECT * FROM 
33e50 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
33e60 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
33e70 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a 20 20 20  y,zTab,'"');.   
33e80 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33e90 26 73 51 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e  &sQuery," NOT IN
33ea0 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20  DEXED;", 0);.   
33eb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
33ec0 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
33ed0 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  e_master")==0 ){
33ee0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33ef0 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
33f00 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
33f10 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20  l_name,sql FROM 
33f20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
33f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f40 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
33f50 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
33f60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33f70 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
33f80 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
33f90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
33fa0 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
33fb0 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73  y,"SELECT name,s
33fc0 65 71 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  eq FROM sqlite_s
33fd0 65 71 75 65 6e 63 65 22 0a 20 20 20 20 20 20 20  equence".       
33fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ff0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
34000 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
34010 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
34020 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
34030 73 74 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20  stat1")==0 ){.  
34040 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
34050 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
34060 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52   tbl,idx,stat FR
34070 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22  OM sqlite_stat1"
34080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34090 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
340a0 44 45 52 20 42 59 20 74 62 6c 2c 69 64 78 3b 22  DER BY tbl,idx;"
340b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
340c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
340d0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33  b, "sqlite_stat3
340e0 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ")==0.          
340f0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61     || strcmp(zTa
34100 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
34110 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
34120 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
34130 65 72 79 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ery, "SELECT * F
34140 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
34150 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34160 51 75 65 72 79 2c 20 7a 54 61 62 2c 20 30 29 3b  Query, zTab, 0);
34170 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34180 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 20 4f  ext(&sQuery, " O
34190 52 44 45 52 20 42 59 20 74 62 6c 2c 20 69 64 78  RDER BY tbl, idx
341a0 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20 30 29 3b  , rowid;\n", 0);
341b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
341c0 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
341d0 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20 20 20 20   zSep, 0);.     
341e0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
341f0 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20 27 5c 27  l, sQuery.z, '\'
34200 27 29 3b 0a 20 20 20 20 20 20 73 51 75 65 72 79  ');.      sQuery
34210 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 70  .n = 0;.      ap
34220 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
34230 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ",", 0);.      a
34240 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
34250 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b 0a 20 20   zTab, '\'');.  
34260 20 20 20 20 7a 53 65 70 20 3d 20 22 29 2c 28 22      zSep = "),("
34270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34280 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
34290 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 62 53 65  mt);.    if( bSe
342a0 70 61 72 61 74 65 20 29 7b 0a 20 20 20 20 20 20  parate ){.      
342b0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
342c0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
342d0 20 20 22 25 73 29 29 22 0a 20 20 20 20 20 20 20    "%s))".       
342e0 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65     " SELECT lowe
342f0 72 28 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  r(hex(sha3_query
34300 28 61 2c 25 64 29 29 29 20 41 53 20 68 61 73 68  (a,%d))) AS hash
34310 2c 20 62 20 41 53 20 6c 61 62 65 6c 22 0a 20 20  , b AS label".  
34320 20 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d          "   FROM
34330 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
34340 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71  ",.          sSq
34350 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  l.z, iSize);.   
34360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
34370 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
34380 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
34390 22 25 73 29 29 22 0a 20 20 20 20 20 20 20 20 20  "%s))".         
343a0 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28   " SELECT lower(
343b0 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 67  hex(sha3_query(g
343c0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61 2c 27 27  roup_concat(a,''
343d0 29 2c 25 64 29 29 29 20 41 53 20 68 61 73 68 22  ),%d))) AS hash"
343e0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 46  .          "   F
343f0 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75 65  ROM [sha3sum$que
34400 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ry]",.          
34410 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a  sSql.z, iSize);.
34420 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 54 65      }.    freeTe
34430 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20  xt(&sQuery);.   
34440 20 66 72 65 65 54 65 78 74 28 26 73 53 71 6c 29   freeText(&sSql)
34450 3b 0a 20 20 20 20 69 66 28 20 62 44 65 62 75 67  ;.    if( bDebug
34460 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
34470 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
34480 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
34490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
344a0 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
344b0 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
344c0 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
344d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
344e0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
344f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
34500 0a 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28  .   && (strncmp(
34510 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 65 6c 6c  azArg[0], "shell
34520 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e  ", n)==0 || strn
34530 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 79  cmp(azArg[0],"sy
34540 73 74 65 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20 29  stem",n)==0).  )
34550 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64  {.    char *zCmd
34560 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a  ;.    int i, x;.
34570 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
34580 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
34590 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
345a0 65 3a 20 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41  e: .system COMMA
345b0 4e 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ND\n");.      rc
345c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
345d0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
345e0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  it;.    }.    zC
345f0 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
34600 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a 41 72  intf(strchr(azAr
34610 67 5b 31 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73  g[1],' ')==0?"%s
34620 22 3a 22 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72  ":"\"%s\"", azAr
34630 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  g[1]);.    for(i
34640 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =2; i<nArg; i++)
34650 7b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73  {.      zCmd = s
34660 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73  qlite3_mprintf(s
34670 74 72 63 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27  trchr(azArg[i],'
34680 20 27 29 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22   ')==0?"%z %s":"
34690 25 7a 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  %z \"%s\"",.    
346a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346b0 20 20 20 20 20 20 20 20 20 7a 43 6d 64 2c 20 61           zCmd, a
346c0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
346d0 20 20 20 20 78 20 3d 20 73 79 73 74 65 6d 28 7a      x = system(z
346e0 43 6d 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cmd);.    sqlite
346f0 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
34700 20 20 69 66 28 20 78 20 29 20 72 61 77 5f 70 72    if( x ) raw_pr
34710 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 79  intf(stderr, "Sy
34720 73 74 65 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74  stem command ret
34730 75 72 6e 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a  urns %d\n", x);.
34740 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
34750 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
34760 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77  (azArg[0], "show
34770 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
34780 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
34790 72 20 2a 61 7a 42 6f 6f 6c 5b 5d 20 3d 20 7b 20  r *azBool[] = { 
347a0 22 6f 66 66 22 2c 20 22 6f 6e 22 2c 20 22 74 72  "off", "on", "tr
347b0 69 67 67 65 72 22 2c 20 22 66 75 6c 6c 22 7d 3b  igger", "full"};
347c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
347d0 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20  if( nArg!=1 ){. 
347e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
347f0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
34800 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20 20 20 20 20  .show\n");.     
34810 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
34820 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
34830 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
34840 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
34850 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
34860 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 0a 20 20 20  s\n","echo",.   
34870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
34890 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48 61 73 46 6c  zBool[ShellHasFl
348a0 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
348b0 29 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  )]);.    utf8_pr
348c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
348d0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 71  2.12s: %s\n","eq
348e0 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 61 75  p", azBool[p->au
348f0 74 6f 45 51 50 26 33 5d 29 3b 0a 20 20 20 20 75  toEQP&3]);.    u
34900 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
34910 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  t, "%12.12s: %s\
34920 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20  n","explain",.  
34930 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 3d 3d         p->mode==
34940 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 3f 20 22  MODE_Explain ? "
34950 6f 6e 22 20 3a 20 70 2d 3e 61 75 74 6f 45 78 70  on" : p->autoExp
34960 6c 61 69 6e 20 3f 20 22 61 75 74 6f 22 20 3a 20  lain ? "auto" : 
34970 22 6f 66 66 22 29 3b 0a 20 20 20 20 75 74 66 38  "off");.    utf8
34980 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
34990 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
349a0 68 65 61 64 65 72 73 22 2c 20 61 7a 42 6f 6f 6c  headers", azBool
349b0 5b 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 21 3d  [p->showHeader!=
349c0 30 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  0]);.    utf8_pr
349d0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
349e0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f  2.12s: %s\n","mo
349f0 64 65 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70  de", modeDescr[p
34a00 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 75 74  ->mode]);.    ut
34a10 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34a20 2c 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  , "%12.12s: ", "
34a30 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20  nullvalue");.   
34a40 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
34a50 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75  ng(p->out, p->nu
34a60 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
34a70 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
34a80 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
34a90 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34aa0 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22  ,"%12.12s: %s\n"
34ab0 2c 22 6f 75 74 70 75 74 22 2c 0a 20 20 20 20 20  ,"output",.     
34ac0 20 20 20 20 20 20 20 73 74 72 6c 65 6e 33 30 28         strlen30(
34ad0 70 2d 3e 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d  p->outfile) ? p-
34ae0 3e 6f 75 74 66 69 6c 65 20 3a 20 22 73 74 64 6f  >outfile : "stdo
34af0 75 74 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  ut");.    utf8_p
34b00 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31  rintf(p->out,"%1
34b10 32 2e 31 32 73 3a 20 22 2c 20 22 63 6f 6c 73 65  2.12s: ", "colse
34b20 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20  parator");.     
34b30 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
34b40 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 63 6f 6c 53  (p->out, p->colS
34b50 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
34b60 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
34b70 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75  ut, "\n");.    u
34b80 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
34b90 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  t,"%12.12s: ", "
34ba0 72 6f 77 73 65 70 61 72 61 74 6f 72 22 29 3b 0a  rowseparator");.
34bb0 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
34bc0 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
34bd0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
34be0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34bf0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
34c00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34c10 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
34c20 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74 73 22 2c  : %s\n","stats",
34c30 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 74 61 74 73   azBool[p->stats
34c40 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66  On!=0]);.    utf
34c50 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
34c60 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22 77   "%12.12s: ", "w
34c70 69 64 74 68 22 29 3b 0a 20 20 20 20 66 6f 72 20  idth");.    for 
34c80 28 69 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72 61  (i=0;i<(int)Arra
34c90 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
34ca0 68 29 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64 74  h) && p->colWidt
34cb0 68 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20 7b  h[i] != 0;i++) {
34cc0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
34cd0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 22 2c  f(p->out, "%d ",
34ce0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29   p->colWidth[i])
34cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
34d00 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
34d10 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  \n");.    utf8_p
34d20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
34d30 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 20 22  12.12s: %s\n", "
34d40 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20 20 20 20  filename",.     
34d50 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44             p->zD
34d60 62 46 69 6c 65 6e 61 6d 65 20 3f 20 70 2d 3e 7a  bFilename ? p->z
34d70 44 62 46 69 6c 65 6e 61 6d 65 20 3a 20 22 22 29  DbFilename : "")
34d80 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
34d90 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
34da0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 74  mp(azArg[0], "st
34db0 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
34dc0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
34dd0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 74 61 74 73  {.      p->stats
34de0 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  On = booleanValu
34df0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
34e00 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
34e10 3d 31 20 29 7b 0a 20 20 20 20 20 20 64 69 73 70  =1 ){.      disp
34e20 6c 61 79 5f 73 74 61 74 73 28 70 2d 3e 64 62 2c  lay_stats(p->db,
34e30 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   p, 0);.    }els
34e40 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
34e50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
34e60 67 65 3a 20 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f  ge: .stats ?on|o
34e70 66 66 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ff?\n");.      r
34e80 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
34e90 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d  else..  if( (c==
34ea0 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  't' && n>1 && st
34eb0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34ec0 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 29  "tables", n)==0)
34ed0 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 69 27 20 26  .   || (c=='i' &
34ee0 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
34ef0 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73 22 2c 20  [0], "indices", 
34f00 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
34f10 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6e 63 6d         || strncm
34f20 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
34f30 65 78 65 73 22 2c 20 6e 29 3d 3d 30 29 20 29 0a  exes", n)==0) ).
34f40 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
34f50 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
34f60 20 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c    char **azResul
34f70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c  t;.    int nRow,
34f80 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 69 6e 74   nAlloc;.    int
34f90 20 69 69 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65   ii;.    ShellTe
34fa0 78 74 20 73 3b 0a 20 20 20 20 69 6e 69 74 54 65  xt s;.    initTe
34fb0 78 74 28 26 73 29 3b 0a 20 20 20 20 6f 70 65 6e  xt(&s);.    open
34fc0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
34fd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
34fe0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50  are_v2(p->db, "P
34ff0 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
35000 69 73 74 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  ist", -1, &pStmt
35010 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
35020 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44   ) return shellD
35030 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
35040 64 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41  db);..    if( nA
35050 72 67 3e 32 20 26 26 20 63 3d 3d 27 69 27 20 29  rg>2 && c=='i' )
35060 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
35070 20 61 6e 20 68 69 73 74 6f 72 69 63 61 6c 20 61   an historical a
35080 63 63 69 64 65 6e 74 20 74 68 61 74 20 74 68 65  ccident that the
35090 20 2e 69 6e 64 65 78 65 73 20 63 6f 6d 6d 61 6e   .indexes comman
350a0 64 20 73 68 6f 77 73 20 61 6e 20 65 72 72 6f 72  d shows an error
350b0 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  .      ** when c
350c0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 77  alled with the w
350d0 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
350e0 72 67 75 6d 65 6e 74 73 20 77 68 65 72 65 61 73  rguments whereas
350f0 20 74 68 65 20 2e 74 61 62 6c 65 73 0a 20 20 20   the .tables.   
35100 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 64 6f     ** command do
35110 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  es not. */.     
35120 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
35130 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6e 64  rr, "Usage: .ind
35140 65 78 65 73 20 3f 4c 49 4b 45 2d 50 41 54 54 45  exes ?LIKE-PATTE
35150 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  RN?\n");.      r
35160 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
35170 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
35180 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  xit;.    }.    f
35190 6f 72 28 69 69 3d 30 3b 20 73 71 6c 69 74 65 33  or(ii=0; sqlite3
351a0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
351b0 4c 49 54 45 5f 52 4f 57 3b 20 69 69 2b 2b 29 7b  LITE_ROW; ii++){
351c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
351d0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28 63 6f  r *zDbName = (co
351e0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
351f0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
35200 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tmt, 1);.      i
35210 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 20  f( zDbName==0 ) 
35220 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
35230 69 66 28 20 73 2e 7a 20 26 26 20 73 2e 7a 5b 30  if( s.z && s.z[0
35240 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 26  ] ) appendText(&
35250 73 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22  s, " UNION ALL "
35260 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
35270 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
35280 7a 44 62 4e 61 6d 65 2c 20 22 6d 61 69 6e 22 29  zDbName, "main")
35290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
352a0 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 53  ppendText(&s, "S
352b0 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
352c0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
352d0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  se{.        appe
352e0 6e 64 54 65 78 74 28 26 73 2c 20 22 53 45 4c 45  ndText(&s, "SELE
352f0 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  CT ", 0);.      
35300 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
35310 20 7a 44 62 4e 61 6d 65 2c 20 27 5c 27 27 29 3b   zDbName, '\'');
35320 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
35330 65 78 74 28 26 73 2c 20 22 7c 7c 27 2e 27 7c 7c  ext(&s, "||'.'||
35340 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
35350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35360 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44  ppendText(&s, zD
35370 62 4e 61 6d 65 2c 20 27 22 27 29 3b 0a 20 20 20  bName, '"');.   
35380 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35390 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  , ".sqlite_maste
353a0 72 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  r ", 0);.      i
353b0 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
353c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
353d0 26 73 2c 22 20 57 48 45 52 45 20 74 79 70 65 20  &s," WHERE type 
353e0 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
353f0 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  w')".           
35400 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
35410 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
35420 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20   'sqlite_%'".   
35430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35440 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20     "   AND name 
35450 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20  LIKE ?1", 0);.  
35460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35470 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35480 2c 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69  ," WHERE type='i
35490 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20 20  ndex'".         
354a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
354b0 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
354c0 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20  KE ?1", 0);.    
354d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
354e0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
354f0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
35500 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
35510 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 30 29   ORDER BY 1", 0)
35520 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
35530 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
35540 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31 2c 20 26 70  >db, s.z, -1, &p
35550 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
35560 65 65 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20  eeText(&s);.    
35570 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
35580 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72  shellDatabaseErr
35590 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20  or(p->db);..    
355a0 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  /* Run the SQL s
355b0 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72 65  tatement prepare
355c0 64 20 62 79 20 74 68 65 20 61 62 6f 76 65 20 62  d by the above b
355d0 6c 6f 63 6b 2e 20 53 74 6f 72 65 20 74 68 65 20  lock. Store the 
355e0 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61  results.    ** a
355f0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 75  s an array of nu
35600 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
35610 69 6e 67 73 20 69 6e 20 61 7a 52 65 73 75 6c 74  ings in azResult
35620 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  [].  */.    nRow
35630 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20   = nAlloc = 0;. 
35640 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b     azResult = 0;
35650 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
35660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35670 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
35680 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d  , 1, azArg[1], -
35690 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
356a0 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ENT);.    }else{
356b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
356c0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
356d0 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49  1, "%", -1, SQLI
356e0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
356f0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  }.    while( sql
35700 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
35710 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
35720 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d        if( nRow>=
35730 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
35740 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
35750 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20 3d          int n2 =
35760 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a   nAlloc*2 + 10;.
35770 20 20 20 20 20 20 20 20 61 7a 4e 65 77 20 3d 20          azNew = 
35780 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
35790 34 28 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65  4(azResult, size
357a0 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a  of(azResult[0])*
357b0 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  n2);.        if(
357c0 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   azNew==0 ){.   
357d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c         rc = shel
357e0 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20  lNomemError();. 
357f0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
35800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35810 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a 20    nAlloc = n2;. 
35820 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 20         azResult 
35830 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d  = azNew;.      }
35840 0a 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 5b  .      azResult[
35850 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f  nRow] = sqlite3_
35860 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
35870 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
35880 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
35890 20 20 20 20 69 66 28 20 30 3d 3d 61 7a 52 65 73      if( 0==azRes
358a0 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20 20  ult[nRow] ){.   
358b0 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e       rc = shellN
358c0 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20  omemError();.   
358d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
358e0 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b    }.      nRow++
358f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35900 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
35910 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f  (pStmt)!=SQLITE_
35920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
35930 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
35940 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ror(p->db);.    
35950 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 74 79  }..    /* Pretty
35960 2d 70 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65  -print the conte
35970 6e 74 73 20 6f 66 20 61 72 72 61 79 20 61 7a 52  nts of array azR
35980 65 73 75 6c 74 5b 5d 20 74 6f 20 74 68 65 20 6f  esult[] to the o
35990 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  utput */.    if(
359a0 20 72 63 3d 3d 30 20 26 26 20 6e 52 6f 77 3e 30   rc==0 && nRow>0
359b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
359c0 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20  n, maxlen = 0;. 
359d0 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
359e0 20 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74 43       int nPrintC
359f0 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20  ol, nPrintRow;. 
35a00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
35a10 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
35a20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
35a30 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b  30(azResult[i]);
35a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
35a50 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e  >maxlen ) maxlen
35a60 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a   = len;.      }.
35a70 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20        nPrintCol 
35a80 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b  = 80/(maxlen+2);
35a90 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69 6e  .      if( nPrin
35aa0 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43  tCol<1 ) nPrintC
35ab0 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50  ol = 1;.      nP
35ac0 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20  rintRow = (nRow 
35ad0 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29  + nPrintCol - 1)
35ae0 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20  /nPrintCol;.    
35af0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72    for(i=0; i<nPr
35b00 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  intRow; i++){.  
35b10 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a        for(j=i; j
35b20 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74  <nRow; j+=nPrint
35b30 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Row){.          
35b40 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 6e 50  char *zSp = j<nP
35b50 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20 22  rintRow ? "" : "
35b60 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 75    ";.          u
35b70 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
35b80 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70  t, "%s%-*s", zSp
35b90 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20 20 20 20 20  , maxlen,.      
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bb0 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a  azResult[j] ? az
35bc0 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a 20  Result[j]:"");. 
35bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35be0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
35bf0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
35c00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
35c10 72 28 69 69 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b  r(ii=0; ii<nRow;
35c20 20 69 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66   ii++) sqlite3_f
35c30 72 65 65 28 61 7a 52 65 73 75 6c 74 5b 69 69 5d  ree(azResult[ii]
35c40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
35c50 72 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20  ree(azResult);. 
35c60 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 42 65 67   }else..  /* Beg
35c70 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f  in redirecting o
35c80 75 74 70 75 74 20 74 6f 20 74 68 65 20 66 69 6c  utput to the fil
35c90 65 20 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e "testcase-out.
35ca0 74 78 74 22 20 2a 2f 0a 20 20 69 66 28 20 63 3d  txt" */.  if( c=
35cb0 3d 27 74 27 20 26 26 20 73 74 72 63 6d 70 28 61  ='t' && strcmp(a
35cc0 7a 41 72 67 5b 30 5d 2c 22 74 65 73 74 63 61 73  zArg[0],"testcas
35cd0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75  e")==0 ){.    ou
35ce0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
35cf0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
35d00 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 22 74 65  ut_file_open("te
35d10 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 29  stcase-out.txt")
35d20 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74  ;.    if( p->out
35d30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
35d40 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35d50 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
35d60 70 65 6e 20 27 74 65 73 74 63 61 73 65 2d 6f 75  pen 'testcase-ou
35d70 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20  t.txt'\n");.    
35d80 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
35d90 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
35da0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35db0 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  of(p->zTestcase)
35dc0 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20  , p->zTestcase, 
35dd0 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "%s", azArg[1]);
35de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35df0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35e00 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65  tf(sizeof(p->zTe
35e10 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73  stcase), p->zTes
35e20 74 63 61 73 65 2c 20 22 3f 22 29 3b 0a 20 20 20  tcase, "?");.   
35e30 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
35e40 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53  def SQLITE_UNTES
35e50 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
35e60 74 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73 74  t' && n>=8 && st
35e70 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35e80 22 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d 3d  "testctrl", n)==
35e90 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
35ea0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
35eb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
35ec0 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20 2f   *zCtrlName;   /
35ed0 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 73 74  * Name of a test
35ee0 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e 20  -control option 
35ef0 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 63 74  */.       int ct
35f00 72 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rlCode;         
35f10 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f     /* Integer co
35f20 64 65 20 66 6f 72 20 74 68 61 74 20 6f 70 74 69  de for that opti
35f30 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 63 6f 6e  on */.       con
35f40 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 3b  st char *zUsage;
35f50 20 20 20 20 20 20 2f 2a 20 55 73 61 67 65 20 6e        /* Usage n
35f60 6f 74 65 73 20 2a 2f 0a 20 20 20 20 7d 20 61 43  otes */.    } aC
35f70 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trl[] = {.      
35f80 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20 20 20  { "always",     
35f90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
35fa0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
35fb0 20 20 20 20 20 20 20 22 42 4f 4f 4c 45 41 4e 22         "BOOLEAN"
35fc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
35fd0 20 20 20 20 20 7b 20 22 61 73 73 65 72 74 22 2c       { "assert",
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
35ff0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
36000 45 52 54 2c 20 20 20 20 20 20 20 20 22 42 4f 4f  ERT,        "BOO
36010 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20  LEAN"           
36020 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 62 65 6e   },.    /*{ "ben
36030 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73  ign_malloc_hooks
36040 22 2c 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  ",SQLITE_TESTCTR
36050 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
36060 48 4f 4f 4b 53 2c 20 22 22 20 20 20 20 20 20 20  HOOKS, ""       
36070 20 20 20 7d 2c 2a 2f 0a 20 20 20 20 2f 2a 7b 20     },*/.    /*{ 
36080 22 62 69 74 76 65 63 5f 74 65 73 74 22 2c 20 20  "bitvec_test",  
36090 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
360a0 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
360b0 54 2c 20 20 20 22 22 20 20 20 20 20 20 20 20 20  T,   ""         
360c0 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20 20         },*/.    
360d0 20 20 7b 20 22 62 79 74 65 6f 72 64 65 72 22 2c    { "byteorder",
360e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
360f0 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
36100 44 45 52 2c 20 20 20 20 20 22 22 20 20 20 20 20  DER,     ""     
36110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
36120 0a 20 20 20 20 2f 2a 7b 20 22 66 61 75 6c 74 5f  .    /*{ "fault_
36130 69 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20 53  install",      S
36140 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
36150 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 22 22  AULT_INSTALL, ""
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36170 7d 2c 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 69  }, */.      { "i
36180 6d 70 6f 73 74 65 72 22 2c 20 20 20 20 20 20 20  mposter",       
36190 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
361a0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 20 20  TRL_IMPOSTER,   
361b0 22 53 43 48 45 4d 41 20 4f 4e 2f 4f 46 46 20 52  "SCHEMA ON/OFF R
361c0 4f 4f 54 50 41 47 45 22 7d 2c 0a 23 69 66 64 65  OOTPAGE"},.#ifde
361d0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
361e0 52 44 0a 20 20 20 20 20 20 7b 20 22 69 73 6b 65  RD.      { "iske
361f0 79 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20 20  yword",         
36200 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
36210 5f 49 53 4b 45 59 57 4f 52 44 2c 20 20 20 20 20  _ISKEYWORD,     
36220 22 49 44 45 4e 54 49 46 49 45 52 22 20 20 20 20  "IDENTIFIER"    
36230 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20       },.#endif. 
36240 20 20 20 20 20 7b 20 22 6c 6f 63 61 6c 74 69 6d       { "localtim
36250 65 5f 66 61 75 6c 74 22 2c 20 20 20 20 53 51 4c  e_fault",    SQL
36260 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
36270 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 22 42 4f  ALTIME_FAULT,"BO
36280 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20  OLEAN"          
36290 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6e 65 76   },.      { "nev
362a0 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20  er_corrupt",    
362b0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
362c0 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
362d0 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20   "BOOLEAN"      
362e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
362f0 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 22   "optimizations"
36300 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45  ,      SQLITE_TE
36310 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
36320 49 4f 4e 53 2c 20 22 44 49 53 41 42 4c 45 2d 4d  IONS, "DISABLE-M
36330 41 53 4b 22 20 20 20 20 20 20 20 7d 2c 0a 23 69  ASK"       },.#i
36340 66 64 65 66 20 59 59 43 4f 56 45 52 41 47 45 0a  fdef YYCOVERAGE.
36350 20 20 20 20 20 20 7b 20 22 70 61 72 73 65 72 5f        { "parser_
36360 63 6f 76 65 72 61 67 65 22 2c 20 20 20 20 53 51  coverage",    SQ
36370 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
36380 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c 20 22  RSER_COVERAGE, "
36390 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
363a0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
363b0 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f 62 79 74    { "pending_byt
363c0 65 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  e",       SQLITE
363d0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
363e0 47 5f 42 59 54 45 2c 20 20 22 4f 46 46 53 45 54  G_BYTE,  "OFFSET
363f0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c    "           },
36400 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72  .      { "prng_r
36410 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 53  eset",         S
36420 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
36430 52 4e 47 5f 52 45 53 45 54 2c 20 20 20 20 22 22  RNG_RESET,    ""
36440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36450 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
36460 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c 20 20 20  rng_restore",   
36470 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
36480 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
36490 2c 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20  ,  ""           
364a0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
364b0 20 7b 20 22 70 72 6e 67 5f 73 61 76 65 22 2c 20   { "prng_save", 
364c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
364d0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
364e0 56 45 2c 20 20 20 20 20 22 22 20 20 20 20 20 20  VE,     ""      
364f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
36500 20 20 20 20 20 20 7b 20 22 72 65 73 65 72 76 65        { "reserve
36510 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
36520 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
36530 53 45 52 56 45 2c 20 20 20 20 20 20 20 22 42 59  SERVE,       "BY
36540 54 45 53 2d 4f 46 2d 52 45 53 45 52 56 45 22 20  TES-OF-RESERVE" 
36550 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
36560 69 6e 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d  int testctrl = -
36570 31 3b 0a 20 20 20 20 69 6e 74 20 69 43 74 72 6c  1;.    int iCtrl
36580 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 72   = -1;.    int r
36590 63 32 20 3d 20 30 3b 20 20 20 20 2f 2a 20 30 3a  c2 = 0;    /* 0:
365a0 20 75 73 61 67 65 2e 20 20 31 3a 20 25 64 20 20   usage.  1: %d  
365b0 32 3a 20 25 78 20 20 33 3a 20 6e 6f 2d 6f 75 74  2: %x  3: no-out
365c0 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
365d0 73 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sOk = 0;.    int
365e0 20 69 2c 20 6e 32 3b 0a 20 20 20 20 63 6f 6e 73   i, n2;.    cons
365f0 74 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30  t char *zCmd = 0
36600 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ;..    open_db(p
36610 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6d 64 20 3d  , 0);.    zCmd =
36620 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
36630 5b 31 5d 20 3a 20 22 68 65 6c 70 22 3b 0a 0a 20  [1] : "help";.. 
36640 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
36650 6e 74 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c  nt can optionall
36660 79 20 62 65 67 69 6e 20 77 69 74 68 20 22 2d 22  y begin with "-"
36670 20 6f 72 20 22 2d 2d 22 20 2a 2f 0a 20 20 20 20   or "--" */.    
36680 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d 27 2d 27  if( zCmd[0]=='-'
36690 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29 7b 0a 20   && zCmd[1] ){. 
366a0 20 20 20 20 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20       zCmd++;.   
366b0 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d     if( zCmd[0]==
366c0 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29  '-' && zCmd[1] )
366d0 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 7d 0a 0a   zCmd++;.    }..
366e0 20 20 20 20 2f 2a 20 2d 2d 68 65 6c 70 20 6c 69      /* --help li
366f0 73 74 73 20 61 6c 6c 20 74 65 73 74 2d 63 6f 6e  sts all test-con
36700 74 72 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 66 28  trols */.    if(
36710 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 68 65   strcmp(zCmd,"he
36720 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
36730 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
36740 6f 75 74 2c 20 22 41 76 61 69 6c 61 62 6c 65 20  out, "Available 
36750 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 3a 5c 6e  test-controls:\n
36760 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
36770 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
36780 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Ctrl); i++){.   
36790 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
367a0 28 70 2d 3e 6f 75 74 2c 20 22 20 20 2e 74 65 73  (p->out, "  .tes
367b0 74 63 74 72 6c 20 25 73 20 25 73 5c 6e 22 2c 0a  tctrl %s %s\n",.
367c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367d0 20 20 20 20 61 43 74 72 6c 5b 69 5d 2e 7a 43 74      aCtrl[i].zCt
367e0 72 6c 4e 61 6d 65 2c 20 61 43 74 72 6c 5b 69 5d  rlName, aCtrl[i]
367f0 2e 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 20 20  .zUsage);.      
36800 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  }.      rc = 1;.
36810 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
36820 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
36830 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76    }..    /* conv
36840 65 72 74 20 74 65 73 74 63 74 72 6c 20 74 65 78  ert testctrl tex
36850 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75  t option to valu
36860 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69  e. allow any uni
36870 71 75 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a  que prefix.    *
36880 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  * of the option 
36890 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72  name, or a numer
368a0 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  ical value. */. 
368b0 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30     n2 = strlen30
368c0 28 7a 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28  (zCmd);.    for(
368d0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
368e0 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20  (aCtrl); i++){. 
368f0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
36900 28 7a 43 6d 64 2c 20 61 43 74 72 6c 5b 69 5d 2e  (zCmd, aCtrl[i].
36910 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e 32 29 3d 3d  zCtrlName, n2)==
36920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
36930 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b 0a 20   testctrl<0 ){. 
36940 20 20 20 20 20 20 20 20 20 74 65 73 74 63 74 72           testctr
36950 6c 20 3d 20 61 43 74 72 6c 5b 69 5d 2e 63 74 72  l = aCtrl[i].ctr
36960 6c 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  lCode;.         
36970 20 69 43 74 72 6c 20 3d 20 69 3b 0a 20 20 20 20   iCtrl = i;.    
36980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36990 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
369a0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
369b0 20 61 6d 62 69 67 75 6f 75 73 20 74 65 73 74 2d   ambiguous test-
369c0 63 6f 6e 74 72 6f 6c 3a 20 5c 22 25 73 5c 22 5c  control: \"%s\"\
369d0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369f0 20 22 55 73 65 20 5c 22 2e 74 65 73 74 63 74 72   "Use \".testctr
36a00 6c 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68  l --help\" for h
36a10 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  elp\n", zCmd);. 
36a20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
36a30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
36a40 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
36a50 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
36a60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
36a70 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b  f( testctrl<0 ){
36a80 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
36a90 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
36aa0 3a 20 75 6e 6b 6e 6f 77 6e 20 74 65 73 74 2d 63  : unknown test-c
36ab0 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e 22 0a 20 20  ontrol: %s\n".  
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ad0 20 20 20 20 20 20 20 22 55 73 65 20 5c 22 2e 74         "Use \".t
36ae0 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22  estctrl --help\"
36af0 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43   for help\n", zC
36b00 6d 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  md);.    }else{.
36b10 20 20 20 20 20 20 73 77 69 74 63 68 28 74 65 73        switch(tes
36b20 74 63 74 72 6c 29 7b 0a 0a 20 20 20 20 20 20 20  tctrl){..       
36b30 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
36b40 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 64 62  _control(int, db
36b50 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
36b60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36b70 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
36b80 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20 20 63 61  IONS:.        ca
36b90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
36ba0 52 4c 5f 52 45 53 45 52 56 45 3a 0a 20 20 20 20  RL_RESERVE:.    
36bb0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
36bc0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
36bd0 20 69 6e 74 20 6f 70 74 20 3d 20 28 69 6e 74 29   int opt = (int)
36be0 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b 32 5d 2c  strtol(azArg[2],
36bf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
36c00 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
36c10 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
36c20 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20  estctrl, p->db, 
36c30 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
36c40 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20    isOk = 3;.    
36c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36c60 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
36c70 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
36c80 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29 20 2a  t_control(int) *
36c90 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
36ca0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
36cb0 52 4e 47 5f 53 41 56 45 3a 0a 20 20 20 20 20 20  RNG_SAVE:.      
36cc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36cd0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
36ce0 4f 52 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73  ORE:.        cas
36cf0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
36d00 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20  L_PRNG_RESET:.  
36d10 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
36d20 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
36d30 52 44 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  RDER:.          
36d40 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
36d50 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
36d60 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
36d70 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b  ntrol(testctrl);
36d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
36d90 6b 20 3d 20 74 65 73 74 63 74 72 6c 3d 3d 53 51  k = testctrl==SQ
36da0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
36db0 54 45 4f 52 44 45 52 20 3f 20 31 20 3a 20 33 3b  TEORDER ? 1 : 3;
36dc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36dd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
36de0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
36df0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
36e00 6e 74 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20  nt, uint) */.   
36e10 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
36e20 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
36e30 47 5f 42 59 54 45 3a 0a 20 20 20 20 20 20 20 20  G_BYTE:.        
36e40 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
36e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
36e60 69 67 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d 20  igned int opt = 
36e70 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 6e  (unsigned int)in
36e80 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
36e90 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [2]);.          
36ea0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
36eb0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
36ec0 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20  tctrl, opt);.   
36ed0 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20           isOk = 
36ee0 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
36ef0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
36f00 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
36f10 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
36f20 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  (int, int) */.  
36f30 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
36f40 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
36f50 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  T:.        case 
36f60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
36f70 41 4c 57 41 59 53 3a 0a 20 20 20 20 20 20 20 20  ALWAYS:.        
36f80 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
36f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
36fa0 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61   opt = booleanVa
36fb0 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  lue(azArg[2]);. 
36fc0 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
36fd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
36fe0 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
36ff0 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
37000 20 20 69 73 4f 6b 20 3d 20 31 3b 0a 20 20 20 20    isOk = 1;.    
37010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37020 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
37030 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
37040 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69  t_control(int, i
37050 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
37060 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
37070 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
37080 55 4c 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73  ULT:.        cas
37090 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
370a0 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a  L_NEVER_CORRUPT:
370b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
370c0 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
370d0 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
370e0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
370f0 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[2]);.        
37100 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
37110 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
37120 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20  estctrl, opt);. 
37130 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
37140 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
37150 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
37160 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
37170 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
37180 6f 6c 28 69 6e 74 2c 20 63 68 61 72 20 2a 29 20  ol(int, char *) 
37190 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
371a0 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 20  _N_KEYWORD.     
371b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
371c0 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
371d0 44 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  D:.          if(
371e0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
371f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
37200 61 72 20 2a 6f 70 74 20 3d 20 61 7a 41 72 67 5b  ar *opt = azArg[
37210 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2];.            
37220 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  rc2 = sqlite3_te
37230 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
37240 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20  trl, opt);.     
37250 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 31 3b         isOk = 1;
37260 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37270 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 23 65         break;.#e
37280 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 63 61  ndif..        ca
37290 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
372a0 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 0a 20 20 20  RL_IMPOSTER:.   
372b0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
372c0 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =5 ){.          
372d0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
372e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
372f0 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 0a 20 20  tctrl, p->db,.  
37300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37310 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d          azArg[2]
37320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37330 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
37340 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 33  gerValue(azArg[3
37350 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
37370 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
37380 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20  [4]));.         
37390 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20     isOk = 3;.   
373a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
373b0 20 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65     break;..#ifde
373c0 66 20 59 59 43 4f 56 45 52 41 47 45 0a 20 20 20  f YYCOVERAGE.   
373d0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
373e0 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52  _TESTCTRL_PARSER
373f0 5f 43 4f 56 45 52 41 47 45 3a 0a 20 20 20 20 20  _COVERAGE:.     
37400 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32       if( nArg==2
37410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37420 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
37430 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70  trol(testctrl, p
37440 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  ->out);.        
37450 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20      isOk = 3;.  
37460 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
37470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37480 20 20 20 69 66 28 20 69 73 4f 6b 3d 3d 30 20 26     if( isOk==0 &
37490 26 20 69 43 74 72 6c 3e 3d 30 20 29 7b 0a 20 20  & iCtrl>=0 ){.  
374a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
374b0 70 2d 3e 6f 75 74 2c 20 22 55 73 61 67 65 3a 20  p->out, "Usage: 
374c0 2e 74 65 73 74 63 74 72 6c 20 25 73 20 25 73 5c  .testctrl %s %s\
374d0 6e 22 2c 20 7a 43 6d 64 2c 20 61 43 74 72 6c 5b  n", zCmd, aCtrl[
374e0 69 43 74 72 6c 5d 2e 7a 55 73 61 67 65 29 3b 0a  iCtrl].zUsage);.
374f0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
37500 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 6b    }else if( isOk
37510 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==1 ){.      raw
37520 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37530 22 25 64 5c 6e 22 2c 20 72 63 32 29 3b 0a 20 20  "%d\n", rc2);.  
37540 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 6b    }else if( isOk
37550 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==2 ){.      raw
37560 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37570 22 30 78 25 30 38 78 5c 6e 22 2c 20 72 63 32 29  "0x%08x\n", rc2)
37580 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
37590 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
375a0 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ed(SQLITE_UNTEST
375b0 41 42 4c 45 29 20 2a 2f 0a 0a 20 20 69 66 28 20  ABLE) */..  if( 
375c0 63 3d 3d 27 74 27 20 26 26 20 6e 3e 34 20 26 26  c=='t' && n>4 &&
375d0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
375e0 5d 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 6e 29  ], "timeout", n)
375f0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
37600 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  db(p, 0);.    sq
37610 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
37620 75 74 28 70 2d 3e 64 62 2c 20 6e 41 72 67 3e 3d  ut(p->db, nArg>=
37630 32 20 3f 20 28 69 6e 74 29 69 6e 74 65 67 6