/ Hex Artifact Content
Login

Artifact 29309f2ab656c8817fbc3b7910b9af8464557b91cba75277a03669399c8e2730:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
08b0: 47 57 33 32 5f 5f 29 0a 23 20 20 64 65 66 69 6e  GW32__).#  defin
08c0: 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e 74 0a  e DIRENT dirent.
08d0: 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53 4c 4e  #  ifndef S_ISLN
08e0: 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53 5f 49  K.#   define S_I
08f0: 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29 0a 23  SLNK(mode) (0).#
0900: 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69 66 0a    endif.# endif.
0910: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0920: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0930: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0940: 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  .h>..#if HAVE_RE
0950: 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65  ADLINE.# include
0960: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0970: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0980: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0990: 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ry.h>.#endif..#i
09a0: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  f HAVE_EDITLINE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c  # include <editl
09c0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
09d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
09e0: 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56  _EDITLINE || HAV
09f0: 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65  E_READLINE..# de
0a00: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0a10: 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69  istory(X) add_hi
0a20: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0a40: 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73  tory(X) read_his
0a50: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0a60: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a70: 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69  tory(X) write_hi
0a80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a90: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0aa0: 69 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65  istory(X) stifle
0ab0: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0ac0: 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c  fine shell_readl
0ad0: 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28  ine(X) readline(
0ae0: 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  X)..#elif HAVE_L
0af0: 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c  INENOISE..# incl
0b00: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
0b10: 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ".# define shell
0b20: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0b30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b40: 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20  Add(X).# define 
0b50: 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f  shell_read_histo
0b60: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b70: 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20  istoryLoad(X).# 
0b80: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0b90: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69  te_history(X) li
0ba0: 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61  nenoiseHistorySa
0bb0: 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ve(X).# define s
0bc0: 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74  hell_stifle_hist
0bd0: 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65  ory(X) linenoise
0be0: 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e  HistorySetMaxLen
0bf0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0c00: 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c  ll_readline(X) l
0c10: 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c  inenoise(X)..#el
0c20: 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65  se..# define she
0c30: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0c40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c50: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0c60: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c70: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0c80: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48  (X)..# define SH
0c90: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
0ca0: 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a  TLINE 1.#endif..
0cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0cc0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0cd0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0ce0: 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64   <io.h>.# includ
0cf0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65  e <fcntl.h>.# de
0d00: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
0d10: 69 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64  isatty(h).# ifnd
0d20: 65 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66  ef access.#  def
0d30: 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20  ine access(f,m) 
0d40: 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29  _access((f),(m))
0d50: 0a 23 20 65 6e 64 69 66 0a 23 20 69 66 6e 64 65  .# endif.# ifnde
0d60: 66 20 75 6e 6c 69 6e 6b 0a 23 20 20 64 65 66 69  f unlink.#  defi
0d70: 6e 65 20 75 6e 6c 69 6e 6b 20 5f 75 6e 6c 69 6e  ne unlink _unlin
0d80: 6b 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65  k.# endif.# unde
0d90: 66 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65  f popen.# define
0da0: 20 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20   popen _popen.# 
0db0: 75 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64  undef pclose.# d
0dc0: 65 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63  efine pclose _pc
0dd0: 6c 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d  lose.#else. /* M
0de0: 61 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28  ake sure isatty(
0df0: 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70  ) has a prototyp
0e00: 65 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e  e. */. extern in
0e10: 74 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a  t isatty(int);..
0e20: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
0e30: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0e40: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0e50: 20 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70    /* popen and p
0e60: 63 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38  close are not C8
0e70: 39 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  9 functions and 
0e80: 73 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65  so are.  ** some
0e90: 74 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72  times omitted fr
0ea0: 6f 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e  om the <stdio.h>
0eb0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78   header */.   ex
0ec0: 74 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e  tern FILE *popen
0ed0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  (const char*,con
0ee0: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78  st char*);.   ex
0ef0: 74 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28  tern int pclose(
0f00: 46 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23  FILE*);.# else.#
0f10: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0f20: 4f 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65  OMIT_POPEN 1.# e
0f30: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ndif.#endif..#if
0f40: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
0f50: 57 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20  WCE)./* Windows 
0f60: 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
0f70: 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
0f80: 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73  s not provide is
0f90: 61 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77  atty(). * thus w
0fa0: 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20  e always assume 
0fb0: 74 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63  that we have a c
0fc0: 6f 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e  onsole. That can
0fd0: 20 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65   be. * overridde
0fe0: 6e 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63  n with the -batc
0ff0: 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  h command line o
1000: 70 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69  ption.. */.#defi
1010: 6e 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23  ne isatty(x) 1.#
1020: 65 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20  endif../* ctype 
1030: 6d 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b  macros that work
1040: 20 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61   with signed cha
1050: 72 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  racters */.#defi
1060: 6e 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69  ne IsSpace(X)  i
1070: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
1080: 20 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65   char)X).#define
1090: 20 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64   IsDigit(X)  isd
10a0: 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63  igit((unsigned c
10b0: 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54  har)X).#define T
10c0: 6f 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72  oLower(X)  (char
10d0: 29 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e  )tolower((unsign
10e0: 65 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20  ed char)X)..#if 
10f0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
1100: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
1110: 29 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64  ).#include <wind
1120: 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e  ows.h>../* strin
1130: 67 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75  g conversion rou
1140: 74 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65  tines only neede
1150: 64 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78  d on Win32 */.ex
1160: 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74  tern char *sqlit
1170: 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65  e3_win32_unicode
1180: 5f 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52  _to_utf8(LPCWSTR
1190: 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a  );.extern char *
11a0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
11b0: 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f  cs_to_utf8_v2(co
11c0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29  nst char *, int)
11d0: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
11e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
11f0: 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e  8_to_mbcs_v2(con
1200: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
1210: 0a 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73  .extern LPWSTR s
1220: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
1230: 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e  8_to_unicode(con
1240: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b  st char *zText);
1250: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57  .#endif../* On W
1260: 69 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61  indows, we norma
1270: 6c 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74  lly run with out
1280: 70 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54  put mode of TEXT
1290: 20 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72   so that \n char
12a0: 61 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75  acters.** are au
12b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e  tomatically tran
12c0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e  slated into \r\n
12d0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  .  However, this
12e0: 20 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a   behavior needs.
12f0: 2a 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ** to be disable
1300: 64 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20  d in some cases 
1310: 28 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61  (ex: when genera
1320: 74 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20  ting CSV output 
1330: 61 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64  and when.** rend
1340: 65 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72  ering quoted str
1350: 69 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ings that contai
1360: 6e 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29  n \n characters)
1370: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1380: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b  .** routines tak
1390: 65 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a  e care of that..
13a0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
13b0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
13c0: 64 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20  d(WIN32).static 
13d0: 76 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f  void setBinaryMo
13e0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
13f0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
1400: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
1410: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
1420: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
1430: 66 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59  file), _O_BINARY
1440: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1450: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c   setTextMode(FIL
1460: 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f  E *file, int isO
1470: 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73  utput){.  if( is
1480: 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28  Output ) fflush(
1490: 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64  file);.  _setmod
14a0: 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c  e(_fileno(file),
14b0: 20 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c   _O_TEXT);.}.#el
14c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42  se.# define setB
14d0: 69 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23  inaryMode(X,Y).#
14e0: 20 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d   define setTextM
14f0: 6f 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a  ode(X,Y).#endif.
1500: 0a 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ../* True if the
1510: 20 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65   timer is enable
1520: 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
1530: 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b  enableTimer = 0;
1540: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
1550: 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f  current wall-clo
1560: 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69  ck time */.stati
1570: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1580: 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b  timeOfDay(void){
1590: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
15a0: 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20  3_vfs *clockVfs 
15b0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
15c0: 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c  nt64 t;.  if( cl
15d0: 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63  ockVfs==0 ) cloc
15e0: 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  kVfs = sqlite3_v
15f0: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1600: 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72  ( clockVfs->iVer
1610: 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b  sion>=2 && clock
1620: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
1630: 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20  eInt64!=0 ){.   
1640: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1650: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f  entTimeInt64(clo
1660: 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65  ckVfs, &t);.  }e
1670: 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  lse{.    double 
1680: 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  r;.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c  >xCurrentTime(cl
16a0: 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20  ockVfs, &r);.   
16b0: 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e   t = (sqlite3_in
16c0: 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e  t64)(r*86400000.
16d0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
16e0: 20 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69   t;.}..#if !defi
16f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
1700: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
1710: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e  & !defined(__min
1720: 75 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  ux).#include <sy
1730: 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75  s/time.h>.#inclu
1740: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1750: 2e 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20  .h>../* VxWorks 
1760: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
1770: 20 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20   getrusage() as 
1780: 66 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65  far as we can de
1790: 74 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64  termine */.#if d
17a0: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
17b0: 45 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  EL) || defined(_
17c0: 5f 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72  _RTP__).struct r
17d0: 75 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74  usage {.  struct
17e0: 20 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d   timeval ru_utim
17f0: 65 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74  e; /* user CPU t
1800: 69 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74  ime used */.  st
1810: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f  ruct timeval ru_
1820: 73 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d  stime; /* system
1830: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1840: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74  /.};.#define get
1850: 72 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73  rusage(A,B) mems
1860: 65 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42  et(B,0,sizeof(*B
1870: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61  )).#endif../* Sa
1880: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1890: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
18a0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
18b0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
18c0: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
18d0: 67 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43  ge sBegin;  /* C
18e0: 50 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74  PU time at start
18f0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74   */.static sqlit
1900: 65 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b  e3_int64 iBegin;
1910: 20 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20    /* Wall-clock 
1920: 74 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f  time at start */
1930: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69  ../*.** Begin ti
1940: 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  ming an operatio
1950: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
1960: 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64   beginTimer(void
1970: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
1980: 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72  imer ){.    getr
1990: 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
19a0: 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20  F, &sBegin);.   
19b0: 20 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66   iBegin = timeOf
19c0: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
19d0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
19e0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69  erence of two ti
19f0: 6d 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65  me_structs in se
1a00: 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  conds */.static 
1a10: 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28  double timeDiff(
1a20: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a  struct timeval *
1a30: 70 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74  pStart, struct t
1a40: 69 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20  imeval *pEnd){. 
1a50: 20 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74   return (pEnd->t
1a60: 76 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d  v_usec - pStart-
1a70: 3e 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30  >tv_usec)*0.0000
1a80: 30 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64  01 +.         (d
1a90: 6f 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f  ouble)(pEnd->tv_
1aa0: 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76  sec - pStart->tv
1ab0: 5f 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _sec);.}../*.** 
1ac0: 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67  Print the timing
1ad0: 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61   results..*/.sta
1ae0: 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65  tic void endTime
1af0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
1b00: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
1b10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b20: 69 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79  iEnd = timeOfDay
1b30: 28 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72  ();.    struct r
1b40: 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20  usage sEnd;.    
1b50: 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
1b60: 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20  _SELF, &sEnd);. 
1b70: 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54     printf("Run T
1b80: 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75  ime: real %.3f u
1b90: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
1ba0: 2c 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d  ,.       (iEnd -
1bb0: 20 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a   iBegin)*0.001,.
1bc0: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
1bd0: 26 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65  &sBegin.ru_utime
1be0: 2c 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65  , &sEnd.ru_utime
1bf0: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
1c00: 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74  ff(&sBegin.ru_st
1c10: 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74  ime, &sEnd.ru_st
1c20: 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  ime));.  }.}..#d
1c30: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
1c40: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
1c50: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
1c60: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
1c70: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a  ine HAS_TIMER 1.
1c80: 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28  .#elif (defined(
1c90: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
1ca0: 65 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53  ed(WIN32))../* S
1cb0: 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e  aved resource in
1cc0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1cd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
1ce0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73  n operation */.s
1cf0: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72  tatic HANDLE hPr
1d00: 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49  ocess;.static FI
1d10: 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42  LETIME ftKernelB
1d20: 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c  egin;.static FIL
1d30: 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69  ETIME ftUserBegi
1d40: 6e 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  n;.static sqlite
1d50: 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65  3_int64 ftWallBe
1d60: 67 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f  gin;.typedef BOO
1d70: 4c 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52  L (WINAPI *GETPR
1d80: 4f 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c  OCTIMES)(HANDLE,
1d90: 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46   LPFILETIME, LPF
1da0: 49 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20  ILETIME,.       
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46               LPF
1dd0: 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54  ILETIME, LPFILET
1de0: 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54  IME);.static GET
1df0: 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f  PROCTIMES getPro
1e00: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20  cessTimesAddr = 
1e10: 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  NULL;../*.** Che
1e20: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
1e30: 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f  have timer suppo
1e40: 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  rt.  Return 1 if
1e50: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75   necessary.** su
1e60: 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20  pport found (or 
1e70: 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79  found previously
1e80: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1e90: 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b   hasTimer(void){
1ea0: 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73  .  if( getProces
1eb0: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
1ec0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20    return 1;.  } 
1ed0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65  else {.    /* Ge
1ee0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20  tProcessTimes() 
1ef0: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1f00: 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d  in WIN95 and som
1f10: 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a  e other Windows.
1f20: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e      ** versions.
1f30: 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73   See if the vers
1f40: 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69  ion we are runni
1f50: 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e  ng on has it, an
1f60: 64 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64  d if it.    ** d
1f70: 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20  oes, save off a 
1f80: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e  pointer to it an
1f90: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  d the current pr
1fa0: 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20  ocess handle..  
1fb0: 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73    */.    hProces
1fc0: 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  s = GetCurrentPr
1fd0: 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28  ocess();.    if(
1fe0: 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20   hProcess ){.   
1ff0: 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e     HINSTANCE hin
2000: 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72  stLib = LoadLibr
2010: 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c  ary(TEXT("Kernel
2020: 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20  32.dll"));.     
2030: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e   if( NULL != hin
2040: 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20  stLib ){.       
2050: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2060: 41 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Addr =.         
2070: 20 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53     (GETPROCTIMES
2080: 29 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ) GetProcAddress
2090: 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50  (hinstLib, "GetP
20a0: 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20  rocessTimes");. 
20b0: 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20         if( NULL 
20c0: 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  != getProcessTim
20d0: 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20  esAddr ){.      
20e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2100: 46 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73  FreeLibrary(hins
2110: 74 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tLib);.      }. 
2120: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2130: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  n 0;.}../*.** Be
2140: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
2150: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
2160: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
2170: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
2180: 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65  nableTimer && ge
2190: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
21a0: 72 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d  r ){.    FILETIM
21b0: 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74  E ftCreation, ft
21c0: 45 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f  Exit;.    getPro
21d0: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
21e0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
21f0: 6f 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20  on,&ftExit,.    
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67      &ftKernelBeg
2220: 69 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29  in,&ftUserBegin)
2230: 3b 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69  ;.    ftWallBegi
2240: 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  n = timeOfDay();
2250: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  .  }.}../* Retur
2260: 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  n the difference
2270: 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45   of two FILETIME
2280: 20 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f   structs in seco
2290: 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f  nds */.static do
22a0: 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49  uble timeDiff(FI
22b0: 4c 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20  LETIME *pStart, 
22c0: 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b  FILETIME *pEnd){
22d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
22e0: 69 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71  i64Start = *((sq
22f0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53  lite_int64 *) pS
2300: 74 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f  tart);.  sqlite_
2310: 69 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a  int64 i64End = *
2320: 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  ((sqlite_int64 *
2330: 29 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  ) pEnd);.  retur
2340: 6e 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34  n (double) ((i64
2350: 45 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20  End - i64Start) 
2360: 2f 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d  / 10000000.0);.}
2370: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
2380: 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73  e timing results
2390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23a0: 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b   endTimer(void){
23b0: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
23c0: 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73  er && getProcess
23d0: 54 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20  TimesAddr){.    
23e0: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
23f0: 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b  ion, ftExit, ftK
2400: 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72  ernelEnd, ftUser
2410: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
2420: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64  _int64 ftWallEnd
2430: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2440: 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69      getProcessTi
2450: 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73  mesAddr(hProcess
2460: 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74  ,&ftCreation,&ft
2470: 45 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e  Exit,&ftKernelEn
2480: 64 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20  d,&ftUserEnd);. 
2490: 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54     printf("Run T
24a0: 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75  ime: real %.3f u
24b0: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
24c0: 2c 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c  ,.       (ftWall
24d0: 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69  End - ftWallBegi
24e0: 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20  n)*0.001,.      
24f0: 20 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65   timeDiff(&ftUse
2500: 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45  rBegin, &ftUserE
2510: 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65  nd),.       time
2520: 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65  Diff(&ftKernelBe
2530: 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e  gin, &ftKernelEn
2540: 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66  d));.  }.}..#def
2550: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20  ine BEGIN_TIMER 
2560: 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65  beginTimer().#de
2570: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65  fine END_TIMER e
2580: 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  ndTimer().#defin
2590: 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54  e HAS_TIMER hasT
25a0: 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64  imer()..#else.#d
25b0: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
25c0: 52 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49  R.#define END_TI
25d0: 4d 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  MER.#define HAS_
25e0: 54 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a  TIMER 0.#endif..
25f0: 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72  /*.** Used to pr
2600: 65 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61  event warnings a
2610: 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
2620: 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e  meters.*/.#defin
2630: 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
2640: 45 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a  ER(x) (void)(x).
2650: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
2660: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
2670: 61 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65  array.*/.#define
2680: 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28   ArraySize(X)  (
2690: 69 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73  int)(sizeof(X)/s
26a0: 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a  izeof(X[0]))../*
26b0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
26c0: 77 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74  wing flag is set
26d0: 2c 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65  , then command e
26e0: 78 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a  xecution stops.*
26f0: 2a 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66  * at an error if
2700: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65   we are not inte
2710: 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ractive..*/.stat
2720: 69 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65  ic int bail_on_e
2730: 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  rror = 0;../*.**
2740: 20 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73   Threat stdin as
2750: 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20   an interactive 
2760: 69 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c  input if the fol
2770: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a  lowing variable.
2780: 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68  ** is true.  Oth
2790: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73  erwise, assume s
27a0: 74 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65  tdin is connecte
27b0: 64 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70  d to a file or p
27c0: 69 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ipe..*/.static i
27d0: 6e 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  nt stdin_is_inte
27e0: 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a  ractive = 1;../*
27f0: 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73  .** On Windows s
2800: 79 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74  ystems we have t
2810: 6f 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61  o know if standa
2820: 72 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63  rd output is a c
2830: 6f 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64  onsole.** in ord
2840: 65 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  er to translate 
2850: 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e  UTF-8 into MBCS.
2860: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2870: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74  variable is.** t
2880: 72 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69  rue if translati
2890: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  on is required..
28a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
28b0: 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20  dout_is_console 
28c0: 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  = 1;../*.** The 
28d0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65  following is the
28e0: 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74   open SQLite dat
28f0: 61 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20  abase.  We make 
2900: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
2910: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20  this database a 
2920: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20  static variable 
2930: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
2940: 65 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79  e accessed.** by
2950: 20 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64   the SIGINT hand
2960: 6c 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74  ler to interrupt
2970: 20 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73   database proces
2980: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2990: 73 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44  sqlite3 *globalD
29a0: 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  b = 0;../*.** Tr
29b0: 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75  ue if an interru
29c0: 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68  pt (Control-C) h
29d0: 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64  as been received
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61  ..*/.static vola
29f0: 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74  tile int seenInt
2a00: 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  errupt = 0;../*.
2a10: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e  ** This is the n
2a20: 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72  ame of our progr
2a30: 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e  am. It is set in
2a40: 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a   main(), used.**
2a50: 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   in a number of 
2a60: 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f  other places, mo
2a70: 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d  stly for error m
2a80: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
2a90: 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a  ic char *Argv0;.
2aa0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74  ./*.** Prompt st
2ab0: 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a  rings. Initializ
2ac0: 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74  ed in main. Sett
2ad0: 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e  able with.**   .
2ae0: 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74  prompt main cont
2af0: 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  inue.*/.static c
2b00: 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32  har mainPrompt[2
2b10: 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74  0];     /* First
2b20: 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65   line prompt. de
2b30: 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20  fault: "sqlite> 
2b40: 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  "*/.static char 
2b50: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32  continuePrompt[2
2b60: 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74  0]; /* Continuat
2b70: 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ion prompt. defa
2b80: 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20  ult: "   ...> " 
2b90: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72  */../*.** Render
2ba0: 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72   output like fpr
2bb0: 69 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c  intf().  Except,
2bc0: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
2bd0: 73 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a  s going to the.*
2be0: 2a 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66  * console and if
2bf0: 20 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67   this is running
2c00: 20 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61   on a Windows ma
2c10: 63 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65  chine, translate
2c20: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66   the.** output f
2c30: 72 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d  rom UTF-8 into M
2c40: 42 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  BCS..*/.#if defi
2c50: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
2c60: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f  efined(WIN32).vo
2c70: 69 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46  id utf8_printf(F
2c80: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
2c90: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
2ca0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2cb0: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
2cc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66  , zFormat);.  if
2cd0: 28 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73  ( stdout_is_cons
2ce0: 6f 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64  ole && (out==std
2cf0: 6f 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65  out || out==stde
2d00: 72 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  rr) ){.    char 
2d10: 2a 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  *z1 = sqlite3_vm
2d20: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
2d30: 61 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ap);.    char *z
2d40: 32 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  2 = sqlite3_win3
2d50: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76  2_utf8_to_mbcs_v
2d60: 32 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  2(z1, 0);.    sq
2d70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a  lite3_free(z1);.
2d80: 20 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75      fputs(z2, ou
2d90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2da0: 66 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73  free(z2);.  }els
2db0: 65 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28  e{.    vfprintf(
2dc0: 6f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  out, zFormat, ap
2dd0: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  );.  }.  va_end(
2de0: 61 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65  ap);.}.#elif !de
2df0: 66 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74  fined(utf8_print
2e00: 66 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38  f).# define utf8
2e10: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
2e30: 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65  nder output like
2e40: 20 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69   fprintf().  Thi
2e50: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
2e60: 75 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67  used on anything
2e70: 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65   that.** include
2e80: 73 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74  s string formatt
2e90: 69 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e  ing (e.g. "%s").
2ea0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
2eb0: 28 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64  (raw_printf).# d
2ec0: 65 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66  efine raw_printf
2ed0: 20 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a   fprintf.#endif.
2ee0: 0a 2f 2a 20 49 6e 64 69 63 61 74 65 20 6f 75 74  ./* Indicate out
2ef0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 61 6e 64 20 65  -of-memory and e
2f00: 78 69 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  xit. */.static v
2f10: 6f 69 64 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  oid shell_out_of
2f20: 5f 6d 65 6d 6f 72 79 28 76 6f 69 64 29 7b 0a 20  _memory(void){. 
2f30: 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f40: 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  rr,"Error: out o
2f50: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
2f60: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(1);.}../*.*
2f70: 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63  * Write I/O trac
2f80: 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  es to the follow
2f90: 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23  ing stream..*/.#
2fa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2fb0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74  BLE_IOTRACE.stat
2fc0: 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65  ic FILE *iotrace
2fd0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
2fe0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ff0: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e   works like prin
3000: 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20 66  tf in that its f
3010: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
3020: 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72   a.** format str
3030: 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75 65  ing and subseque
3040: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  nt arguments are
3050: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75   values to be su
3060: 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e 20  bstituted.** in 
3070: 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c 64  place of % field
3080: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f  s.  The result o
3090: 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68 69  f formatting thi
30a0: 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 77  s string.** is w
30b0: 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61 63  ritten to iotrac
30c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
30d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
30e0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  CE.static void S
30f0: 51 4c 49 54 45 5f 43 44 45 43 4c 20 69 6f 74 72  QLITE_CDECL iotr
3100: 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73 74 20  acePrintf(const 
3110: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
3120: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3130: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
3140: 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29  if( iotrace==0 )
3150: 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74   return;.  va_st
3160: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3170: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
3180: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
3190: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
31a0: 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  ap);.  utf8_prin
31b0: 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22  tf(iotrace, "%s"
31c0: 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , z);.  sqlite3_
31d0: 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69  free(z);.}.#endi
31e0: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  f../*.** Output 
31f0: 73 74 72 69 6e 67 20 7a 55 74 66 20 74 6f 20 73  string zUtf to s
3200: 74 72 65 61 6d 20 70 4f 75 74 20 61 73 20 77 20  tream pOut as w 
3210: 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20  characters.  If 
3220: 77 20 69 73 20 6e 65 67 61 74 69 76 65 2c 0a 2a  w is negative,.*
3230: 2a 20 74 68 65 6e 20 72 69 67 68 74 2d 6a 75 73  * then right-jus
3240: 74 69 66 79 20 74 68 65 20 74 65 78 74 2e 20 20  tify the text.  
3250: 57 20 69 73 20 74 68 65 20 77 69 64 74 68 20 69  W is the width i
3260: 6e 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  n UTF-8 characte
3270: 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69 6e 20 62 79  rs, not.** in by
3280: 74 65 73 2e 20 20 54 68 69 73 20 69 73 20 64 69  tes.  This is di
3290: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
32a0: 20 25 2a 2e 2a 73 20 73 70 65 63 69 66 69 63 61   %*.*s specifica
32b0: 74 69 6f 6e 20 69 6e 20 70 72 69 6e 74 66 0a 2a  tion in printf.*
32c0: 2a 20 73 69 6e 63 65 20 77 69 74 68 20 25 2a 2e  * since with %*.
32d0: 2a 73 20 74 68 65 20 77 69 64 74 68 20 69 73 20  *s the width is 
32e0: 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65  measured in byte
32f0: 73 2c 20 6e 6f 74 20 63 68 61 72 61 63 74 65 72  s, not character
3300: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3310: 64 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69  d utf8_width_pri
3320: 6e 74 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  nt(FILE *pOut, i
3330: 6e 74 20 77 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt w, const char
3340: 20 2a 7a 55 74 66 29 7b 0a 20 20 69 6e 74 20 69   *zUtf){.  int i
3350: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
3360: 20 61 77 20 3d 20 77 3c 30 20 3f 20 2d 77 20 3a   aw = w<0 ? -w :
3370: 20 77 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   w;.  char zBuf[
3380: 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 61 77 3e  1000];.  if( aw>
3390: 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66  (int)sizeof(zBuf
33a0: 29 2f 33 20 29 20 61 77 20 3d 20 28 69 6e 74 29  )/3 ) aw = (int)
33b0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 33 3b 0a  sizeof(zBuf)/3;.
33c0: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 55 74    for(i=n=0; zUt
33d0: 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  f[i]; i++){.    
33e0: 69 66 28 20 28 7a 55 74 66 5b 69 5d 26 30 78 63  if( (zUtf[i]&0xc
33f0: 30 29 21 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  0)!=0x80 ){.    
3400: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    n++;.      if(
3410: 20 6e 3d 3d 61 77 20 29 7b 0a 20 20 20 20 20 20   n==aw ){.      
3420: 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d 77 68 69 6c    do{ i++; }whil
3430: 65 28 20 28 7a 55 74 66 5b 69 5d 26 30 78 63 30  e( (zUtf[i]&0xc0
3440: 29 3d 3d 30 78 38 30 20 29 3b 0a 20 20 20 20 20  )==0x80 );.     
3450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3460: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
3470: 28 20 6e 3e 3d 61 77 20 29 7b 0a 20 20 20 20 75  ( n>=aw ){.    u
3480: 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c  tf8_printf(pOut,
3490: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 55 74 66   "%.*s", i, zUtf
34a0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  );.  }else if( w
34b0: 3c 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  <0 ){.    utf8_p
34c0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 2a 73  rintf(pOut, "%*s
34d0: 25 73 22 2c 20 61 77 2d 6e 2c 20 22 22 2c 20 7a  %s", aw-n, "", z
34e0: 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Utf);.  }else{. 
34f0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
3500: 4f 75 74 2c 20 22 25 73 25 2a 73 22 2c 20 7a 55  Out, "%s%*s", zU
3510: 74 66 2c 20 61 77 2d 6e 2c 20 22 22 29 3b 0a 20  tf, aw-n, "");. 
3520: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74   }.}.../*.** Det
3530: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 72  ermines if a str
3540: 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65 72 20  ing is a number 
3550: 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  of not..*/.stati
3560: 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72 28 63  c int isNumber(c
3570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
3580: 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20 69  t *realnum){.  i
3590: 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a  f( *z=='-' || *z
35a0: 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20 69  =='+' ) z++;.  i
35b0: 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20  f( !IsDigit(*z) 
35c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
35d0: 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66  .  }.  z++;.  if
35e0: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
35f0: 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  lnum = 0;.  whil
3600: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3610: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  { z++; }.  if( *
3620: 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a 2b  z=='.' ){.    z+
3630: 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44 69  +;.    if( !IsDi
3640: 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  git(*z) ) return
3650: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   0;.    while( I
3660: 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sDigit(*z) ){ z+
3670: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61  +; }.    if( rea
3680: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
3690: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  = 1;.  }.  if( *
36a0: 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45  z=='e' || *z=='E
36b0: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
36c0: 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c    if( *z=='+' ||
36d0: 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a   *z=='-' ) z++;.
36e0: 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74      if( !IsDigit
36f0: 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
3700: 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69  .    while( IsDi
3710: 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  git(*z) ){ z++; 
3720: 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75  }.    if( realnu
3730: 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31  m ) *realnum = 1
3740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ;.  }.  return *
3750: 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z==0;.}../*.** C
3760: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
3770: 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c  length that is l
3780: 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20 63  imited to what c
3790: 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
37a0: 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73  ** lower 30 bits
37b0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69 67   of a 32-bit sig
37c0: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  ned integer..*/.
37d0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65  static int strle
37e0: 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  n30(const char *
37f0: 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z){.  const char
3800: 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c   *z2 = z;.  whil
3810: 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20  e( *z2 ){ z2++; 
3820: 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66 66  }.  return 0x3ff
3830: 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32  fffff & (int)(z2
3840: 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - z);.}../*.** 
3850: 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
3860: 68 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  h of a string in
3870: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 4d 75   characters.  Mu
3880: 6c 74 69 62 79 74 65 20 55 54 46 38 20 63 68 61  ltibyte UTF8 cha
3890: 72 61 63 74 65 72 73 0a 2a 2a 20 63 6f 75 6e 74  racters.** count
38a0: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68 61   as a single cha
38b0: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
38c0: 63 20 69 6e 74 20 73 74 72 6c 65 6e 43 68 61 72  c int strlenChar
38d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
38e0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
38f0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
3900: 20 69 66 28 20 28 30 78 63 30 26 2a 28 7a 2b 2b   if( (0xc0&*(z++
3910: 29 29 21 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a  ))!=0x80 ) n++;.
3920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
3930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3940: 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69  utine reads a li
3950: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
3960: 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a  FILE in, stores.
3970: 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d  ** the text in m
3980: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3990: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
39a0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
39b0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78  er.** to the tex
39c0: 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  t.  NULL is retu
39d0: 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66  rned at end of f
39e0: 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f  ile, or if mallo
39f0: 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a  c().** fails..**
3a00: 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20 69 73 20  .** If zLine is 
3a10: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3a20: 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   is a malloced b
3a30: 75 66 66 65 72 20 72 65 74 75 72 6e 65 64 20 66  uffer returned f
3a40: 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76 69 6f 75  rom.** a previou
3a50: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
3a60: 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 79 20  outine that may 
3a70: 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 73 74  be reused..*/.st
3a80: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
3a90: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
3aa0: 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69 6e 29 7b  Line, FILE *in){
3ab0: 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 7a  .  int nLine = z
3ac0: 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a 20 31 30  Line==0 ? 0 : 10
3ad0: 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  0;.  int n = 0;.
3ae0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
3af0: 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69     if( n+100>nLi
3b00: 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e  ne ){.      nLin
3b10: 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30  e = nLine*2 + 10
3b20: 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d  0;.      zLine =
3b30: 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20   realloc(zLine, 
3b40: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  nLine);.      if
3b50: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
3b60: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3b70: 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e   if( fgets(&zLin
3b80: 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c  e[n], nLine - n,
3b90: 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   in)==0 ){.     
3ba0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
3bb0: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
3bc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3bd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3be0: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
3bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c00: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c   }.    while( zL
3c10: 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20 20  ine[n] ) n++;.  
3c20: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
3c30: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b  ne[n-1]=='\n' ){
3c40: 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  .      n--;.    
3c50: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
3c60: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  ne[n-1]=='\r' ) 
3c70: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
3c80: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [n] = 0;.      b
3c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3ca0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
3cb0: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
3cc0: 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f 72 20 69  IN32).  /* For i
3cd0: 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75 74  nteractive input
3ce0: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74   on Windows syst
3cf0: 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74 65 20 74  ems, translate t
3d00: 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69 2d 62 79  he.  ** multi-by
3d10: 74 65 20 63 68 61 72 61 63 74 65 72 73 65 74 20  te characterset 
3d20: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
3d30: 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69 66 28 20  UTF-8. */.  if( 
3d40: 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
3d50: 74 69 76 65 20 26 26 20 69 6e 3d 3d 73 74 64 69  tive && in==stdi
3d60: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  n ){.    char *z
3d70: 54 72 61 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f  Trans = sqlite3_
3d80: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
3d90: 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20 30 29 3b  f8_v2(zLine, 0);
3da0: 0a 20 20 20 20 69 66 28 20 7a 54 72 61 6e 73 20  .    if( zTrans 
3db0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 72  ){.      int nTr
3dc0: 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ans = strlen30(z
3dd0: 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20 20 20 20  Trans)+1;.      
3de0: 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c 69 6e 65  if( nTrans>nLine
3df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
3e00: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
3e10: 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20  e, nTrans);.    
3e20: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3e40: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61 6e  lite3_free(zTran
3e50: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  s);.          re
3e60: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
3e70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
3e80: 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 20 7a 54  memcpy(zLine, zT
3e90: 72 61 6e 73 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  rans, nTrans);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3eb0: 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 7d  e(zTrans);.    }
3ec0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  .  }.#endif /* d
3ed0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
3ee0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
3ef0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   */.  return zLi
3f00: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ne;.}../*.** Ret
3f10: 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c  rieve a single l
3f20: 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78  ine of input tex
3f30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d  t..**.** If in==
3f40: 30 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d  0 then read from
3f50: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
3f60: 61 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f 72  and prompt befor
3f70: 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20  e each line..** 
3f80: 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f  If isContinuatio
3f90: 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  n is true, then 
3fa0: 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70  a continuation p
3fb0: 72 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70 72  rompt is appropr
3fc0: 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f  iate..** If isCo
3fd0: 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a 65  ntinuation is ze
3fe0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  ro, then the mai
3ff0: 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64 20  n prompt should 
4000: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  be used..**.** I
4010: 66 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74 20  f zPrior is not 
4020: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
4030: 61 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61 20  a buffer from a 
4040: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
4050: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 68  is.** routine th
4060: 61 74 20 63 61 6e 20 62 65 20 72 65 75 73 65 64  at can be reused
4070: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
4080: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
4090: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
40a0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
40b0: 20 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a 20   must either.** 
40c0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
40d0: 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20 70  caller or else p
40e0: 61 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  assed back into 
40f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4100: 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20 61   the.** zPrior a
4110: 72 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75 73  rgument for reus
4120: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
4130: 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e  r *one_input_lin
4140: 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61 72  e(FILE *in, char
4150: 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69 73   *zPrior, int is
4160: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a 20  Continuation){. 
4170: 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a   char *zPrompt;.
4180: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b    char *zResult;
4190: 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a  .  if( in!=0 ){.
41a0: 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f      zResult = lo
41b0: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69  cal_getline(zPri
41c0: 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  or, in);.  }else
41d0: 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20  {.    zPrompt = 
41e0: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 3f  isContinuation ?
41f0: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 20   continuePrompt 
4200: 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23 69  : mainPrompt;.#i
4210: 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41  f SHELL_USE_LOCA
4220: 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70 72  L_GETLINE.    pr
4230: 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f 6d  intf("%s", zProm
4240: 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28  pt);.    fflush(
4250: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52 65  stdout);.    zRe
4260: 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  sult = local_get
4270: 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74 64  line(zPrior, std
4280: 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  in);.#else.    f
4290: 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 20  ree(zPrior);.   
42a0: 20 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c 6c   zResult = shell
42b0: 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70  _readline(zPromp
42c0: 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 73  t);.    if( zRes
42d0: 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20  ult && *zResult 
42e0: 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74  ) shell_add_hist
42f0: 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65  ory(zResult);.#e
4300: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
4310: 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n zResult;.}.../
4320: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4330: 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
4340: 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
4350: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
4360: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
4370: 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
4380: 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
4390: 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
43a0: 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
43b0: 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
43c0: 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
43d0: 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
43e0: 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
43f0: 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
4400: 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
4410: 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
4420: 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
4430: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
4440: 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
4450: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
4460: 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
4470: 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
4480: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
4490: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
44a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
44b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
44c0: 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
44d0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
44e0: 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
44f0: 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
4500: 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
4510: 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
4520: 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
4530: 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
4540: 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
4550: 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
4560: 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
4570: 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
4580: 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
4590: 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
45a0: 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
45b0: 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
45c0: 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
45d0: 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
45e0: 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
45f0: 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
4600: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
4610: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
4620: 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
4630: 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
4640: 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
4650: 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
4660: 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
4670: 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
4680: 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
4690: 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
46a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
46b0: 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
46c0: 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
46d0: 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
46e0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
46f0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
4700: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  e{.    while( Is
4710: 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  Digit(zArg[0]) )
4720: 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
4730: 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
4760: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4770: 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  (aMult); i++){. 
4780: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4790: 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
47a0: 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
47b0: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
47c0: 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
47d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
47f0: 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d  isNeg? -v : v;.}
4800: 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61 72 69 61 62  ../*.** A variab
4810: 6c 65 20 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  le length string
4820: 20 74 6f 20 77 68 69 63 68 20 6f 6e 65 20 63 61   to which one ca
4830: 6e 20 61 70 70 65 6e 64 20 74 65 78 74 2e 0a 2a  n append text..*
4840: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4850: 20 53 68 65 6c 6c 54 65 78 74 20 53 68 65 6c 6c   ShellText Shell
4860: 54 65 78 74 3b 0a 73 74 72 75 63 74 20 53 68 65  Text;.struct She
4870: 6c 6c 54 65 78 74 20 7b 0a 20 20 63 68 61 72 20  llText {.  char 
4880: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *z;.  int n;.  i
4890: 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f  nt nAlloc;.};../
48a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
48b0: 61 6e 64 20 64 65 73 74 72 6f 79 20 61 20 53 68  and destroy a Sh
48c0: 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 0a 2a  ellText object.*
48d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
48e0: 69 74 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  itText(ShellText
48f0: 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
4900: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
4910: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4920: 66 72 65 65 54 65 78 74 28 53 68 65 6c 6c 54 65  freeText(ShellTe
4930: 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 70  xt *p){.  free(p
4940: 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78 74  ->z);.  initText
4950: 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69  (p);.}../* zIn i
4960: 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
4970: 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72  er to a NULL-ter
4980: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
4990: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
49a0: 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  d.** from malloc
49b0: 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f  (), or a NULL po
49c0: 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e  inter. The strin
49d0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
49e0: 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64  zAppend is.** ad
49f0: 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20  ded to zIn, and 
4a00: 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75 72  the result retur
4a10: 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ned in memory ob
4a20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4a30: 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66  oc()..** zIn, if
4a40: 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c   it was not NULL
4a50: 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  , is freed..**.*
4a60: 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
4a70: 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20  rgument, quote, 
4a80: 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65  is not '\0', the
4a90: 6e 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20  n it is used as 
4aa0: 61 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  a.** quote chara
4ab0: 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64  cter for zAppend
4ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ad0: 20 61 70 70 65 6e 64 54 65 78 74 28 53 68 65 6c   appendText(Shel
4ae0: 6c 54 65 78 74 20 2a 70 2c 20 63 68 61 72 20 63  lText *p, char c
4af0: 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63  onst *zAppend, c
4b00: 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e  har quote){.  in
4b10: 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  t len;.  int i;.
4b20: 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20    int nAppend = 
4b30: 73 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e 64  strlen30(zAppend
4b40: 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70  );..  len = nApp
4b50: 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66  end+p->n+1;.  if
4b60: 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c  ( quote ){.    l
4b70: 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72  en += 2;.    for
4b80: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
4b90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4ba0: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
4bb0: 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20  te ) len++;.    
4bc0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
4bd0: 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63  n+len>=p->nAlloc
4be0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f   ){.    p->nAllo
4bf0: 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  c = p->nAlloc*2 
4c00: 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a 20 20 20 20  + len + 20;.    
4c10: 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 70  p->z = realloc(p
4c20: 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  ->z, p->nAlloc);
4c30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30  .    if( p->z==0
4c40: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
4c50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
4c60: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
4c70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
4c80: 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  f( quote ){.    
4c90: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e  char *zCsr = p->
4ca0: 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73  z+p->n;.    *zCs
4cb0: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
4cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4cd0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ce0: 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65   *zCsr++ = zAppe
4cf0: 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  nd[i];.      if(
4d00: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
4d10: 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  te ) *zCsr++ = q
4d20: 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uote;.    }.    
4d30: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4d40: 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74  .    p->n = (int
4d50: 29 28 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a  )(zCsr - p->z);.
4d60: 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27      *zCsr = '\0'
4d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
4d80: 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c  emcpy(p->z+p->n,
4d90: 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e   zAppend, nAppen
4da0: 64 29 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20  d);.    p->n += 
4db0: 6e 41 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e  nAppend;.    p->
4dc0: 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a  z[p->n] = '\0';.
4dd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
4de0: 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
4df0: 65 20 69 66 20 69 64 65 6e 74 69 66 69 65 72 20  e if identifier 
4e00: 7a 4e 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62  zName needs to b
4e10: 65 20 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72  e quoted, either
4e20: 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 63  .** because it c
4e30: 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68  ontains non-alph
4e40: 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74  anumeric charact
4e50: 65 72 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20  ers, or because 
4e60: 69 74 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69  it is an.** SQLi
4e70: 74 65 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20  te keyword.  Be 
4e80: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20  conservative in 
4e90: 74 68 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20  this estimate:  
4ea0: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73  When in doubt as
4eb0: 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f  sume.** that quo
4ec0: 74 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  ting is required
4ed0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27  ..**.** Return '
4ee0: 22 27 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73  "' if quoting is
4ef0: 20 72 65 71 75 69 72 65 64 2e 20 20 52 65 74 75   required.  Retu
4f00: 72 6e 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69  rn 0 if no quoti
4f10: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 71  */.static char q
4f30: 75 6f 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63  uoteChar(const c
4f40: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
4f50: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61  nt i;.  if( !isa
4f60: 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63  lpha((unsigned c
4f70: 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26  har)zName[0]) &&
4f80: 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29   zName[0]!='_' )
4f90: 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66   return '"';.  f
4fa0: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
4fb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4fc0: 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e  !isalnum((unsign
4fd0: 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d  ed char)zName[i]
4fe0: 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ) && zName[i]!='
4ff0: 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b  _' ) return '"';
5000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
5010: 6c 69 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68  lite3_keyword_ch
5020: 65 63 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20  eck(zName, i) ? 
5030: 27 22 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  '"' : 0;.}../*.*
5040: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61  * Construct a fa
5050: 6b 65 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61  ke object name a
5060: 6e 64 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74  nd column list t
5070: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
5080: 74 72 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74  tructure.** of t
5090: 68 65 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c  he view, virtual
50a0: 20 74 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65   table, or table
50b0: 20 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e   valued function
50c0: 20 7a 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a   zSchema.zName..
50d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
50e0: 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28  shellFakeSchema(
50f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
5100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5110: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
5120: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  ction containing
5130: 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63   the vtab */.  c
5140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
5150: 6d 61 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61  ma,    /* Schema
5160: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5170: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61   holding the vta
5180: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  b */.  const cha
5190: 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f  r *zName       /
51a0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
51b0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
51c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
51d0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
51e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
51f0: 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20   ShellText s;.  
5200: 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63  char cQuote;.  c
5210: 68 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b  har *zDiv = "(";
5220: 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b  .  int nRow = 0;
5230: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
5240: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
5250: 4d 41 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f  MA \"%w\".table_
5260: 69 6e 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20  info=%Q;",.     
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53      zSchema ? zS
5290: 63 68 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20  chema : "main", 
52a0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
52b0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
52c0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
52d0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
52e0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
52f0: 6e 69 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69  nitText(&s);.  i
5300: 66 28 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20  f( zSchema ){.  
5310: 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65    cQuote = quote
5320: 43 68 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20  Char(zSchema);. 
5330: 20 20 20 69 66 28 20 63 51 75 6f 74 65 20 26 26     if( cQuote &&
5340: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
5350: 28 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29  (zSchema,"temp")
5360: 3d 3d 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30  ==0 ) cQuote = 0
5370: 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
5380: 28 26 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51  (&s, zSchema, cQ
5390: 75 6f 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  uote);.    appen
53a0: 64 54 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30  dText(&s, ".", 0
53b0: 29 3b 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20  );.  }.  cQuote 
53c0: 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d  = quoteChar(zNam
53d0: 65 29 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74  e);.  appendText
53e0: 28 26 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f  (&s, zName, cQuo
53f0: 74 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  te);.  while( sq
5400: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
5410: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
5420: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5430: 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zCol = (const c
5440: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
5450: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
5460: 31 29 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  1);.    nRow++;.
5470: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
5480: 73 2c 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20  s, zDiv, 0);.   
5490: 20 7a 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20   zDiv = ",";.   
54a0: 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43   cQuote = quoteC
54b0: 68 61 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61  har(zCol);.    a
54c0: 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43  ppendText(&s, zC
54d0: 6f 6c 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d  ol, cQuote);.  }
54e0: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
54f0: 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c  , ")", 0);.  sql
5500: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
5510: 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77  tmt);.  if( nRow
5520: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54  ==0 ){.    freeT
5530: 65 78 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a  ext(&s);.    s.z
5540: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
5550: 72 6e 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn s.z;.}../*.**
5560: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
5570: 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68  shell_module_sch
5580: 65 6d 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74  ema(X).**.** Ret
5590: 75 72 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d  urn a fake schem
55a0: 61 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d  a for the table-
55b0: 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20  valued function 
55c0: 6f 72 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  or eponymous vir
55d0: 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e  tual.** table X.
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
55f0: 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d  shellModuleSchem
5600: 61 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  a(.  sqlite3_con
5610: 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e  text *pCtx,.  in
5620: 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65  t nVal,.  sqlite
5630: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a  3_value **apVal.
5640: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
5650: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5660: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5670: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
5680: 5d 29 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b  ]);.  char *zFak
5690: 65 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68  e = shellFakeSch
56a0: 65 6d 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ema(sqlite3_cont
56b0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
56c0: 74 78 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a  tx), 0, zName);.
56d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
56e0: 45 52 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20  ER(nVal);.  if( 
56f0: 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c  zFake ){.    sql
5700: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5710: 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d  (pCtx, sqlite3_m
5720: 70 72 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f  printf("/* %s */
5730: 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20  ", zFake),.     
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66     -1, sqlite3_f
5760: 72 65 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ree);.    free(z
5770: 46 61 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Fake);.  }.}../*
5780: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
5790: 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  :  shell_add_sch
57a0: 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41  ema(S,X).**.** A
57b0: 64 64 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61  dd the schema na
57c0: 6d 65 20 58 20 74 6f 20 74 68 65 20 43 52 45 41  me X to the CREA
57d0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  TE statement in 
57e0: 53 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  S and return the
57f0: 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d   result..** Exam
5800: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  ples:.**.**    C
5810: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5820: 29 20 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20  )   ->   CREATE 
5830: 54 41 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b  TABLE xyz.t1(x);
5840: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b  .**.** Also work
5850: 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52  s on.**.**    CR
5860: 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20  EATE INDEX.**   
5870: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
5880: 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54  NDEX.**    CREAT
5890: 45 20 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45  E VIEW.**    CRE
58a0: 41 54 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20  ATE TRIGGER.**  
58b0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
58c0: 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69   TABLE.**.** Thi
58d0: 73 20 55 44 46 20 69 73 20 75 73 65 64 20 62 79  s UDF is used by
58e0: 20 74 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d   the .schema com
58f0: 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74  mand to insert t
5900: 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f  he schema name o
5910: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
5920: 74 61 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65  tabases into the
5930: 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73   middle of the s
5940: 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c  qlite_master.sql
5950: 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
5960: 63 20 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53  c void shellAddS
5970: 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c  chemaName(.  sql
5980: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
5990: 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
59a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
59b0: 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61  **apVal.){.  sta
59c0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
59d0: 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20  aPrefix[] = {.  
59e0: 20 20 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20     "TABLE",.    
59f0: 20 22 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22   "INDEX",.     "
5a00: 55 4e 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20  UNIQUE INDEX",. 
5a10: 20 20 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20      "VIEW",.    
5a20: 20 22 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20   "TRIGGER",.    
5a30: 20 22 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22   "VIRTUAL TABLE"
5a40: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20  .  };.  int i = 
5a50: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
5a60: 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zIn = (const ch
5a70: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5a80: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
5a90: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5aa0: 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74  zSchema = (const
5ab0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5ac0: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
5ad0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
5ae0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
5af0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5b00: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
5b10: 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  [2]);.  sqlite3 
5b20: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
5b30: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5b40: 70 43 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pCtx);.  UNUSED_
5b50: 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
5b60: 0a 20 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26  .  if( zIn!=0 &&
5b70: 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43   strncmp(zIn, "C
5b80: 52 45 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29  REATE ", 7)==0 )
5b90: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5ba0: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50  <(int)(sizeof(aP
5bb0: 72 65 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50  refix)/sizeof(aP
5bc0: 72 65 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29  refix[0])); i++)
5bd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5be0: 73 74 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78  strlen30(aPrefix
5bf0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
5c00: 73 74 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61  strncmp(zIn+7, a
5c10: 50 72 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30  Prefix[i], n)==0
5c20: 20 26 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20   && zIn[n+7]==' 
5c30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ' ){.        cha
5c40: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  r *z = 0;.      
5c50: 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20    char *zFake = 
5c60: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  0;.        if( z
5c70: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
5c80: 20 20 20 20 63 68 61 72 20 63 51 75 6f 74 65 20      char cQuote 
5c90: 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68  = quoteChar(zSch
5ca0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
5cb0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5cc0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5cd0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30  chema,"temp")!=0
5ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5cf0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5d00: 6e 74 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22  ntf("%.*s \"%w\"
5d10: 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20  .%s", n+7, zIn, 
5d20: 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38  zSchema, zIn+n+8
5d30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
5d40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5d50: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5d60: 6e 74 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22  ntf("%.*s %s.%s"
5d70: 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68  , n+7, zIn, zSch
5d80: 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20  ema, zIn+n+8);. 
5d90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5da0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5db0: 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20   zName.         
5dc0: 26 26 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d  && aPrefix[i][0]
5dd0: 3d 3d 27 56 27 0a 20 20 20 20 20 20 20 20 20 26  =='V'.         &
5de0: 26 20 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c  & (zFake = shell
5df0: 46 61 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a  FakeSchema(db, z
5e00: 53 63 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21  Schema, zName))!
5e10: 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
5e20: 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
5e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5e40: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5e50: 6e 74 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a  ntf("%s\n/* %s *
5e60: 2f 22 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b  /", zIn, zFake);
5e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5ea0: 66 28 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%z\n/* %s */"
5eb0: 2c 20 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20  , z, zFake);.   
5ec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5ed0: 20 20 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a     free(zFake);.
5ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ef0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
5f00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5f10: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
5f20: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
5f30: 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ee);.          r
5f40: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
5f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5f60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
5f70: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
5f80: 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a  apVal[0]);.}../*
5f90: 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63  .** The source c
5fa0: 6f 64 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ode for several 
5fb0: 72 75 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c  run-time loadabl
5fc0: 65 20 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20  e extensions is 
5fd0: 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f  inserted.** belo
5fe0: 77 20 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c  w by the ../tool
5ff0: 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63  /mkshellc.tcl sc
6000: 72 69 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72  ript.  Before pr
6010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e  ocessing that in
6020: 63 6c 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20  cluded.** code, 
6030: 77 65 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72  we need to overr
6040: 69 64 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20  ide some macros 
6050: 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c  to make the incl
6060: 75 64 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64  uded program cod
6070: 65 0a 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69  e.** work here i
6080: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
6090: 74 68 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f  this regular pro
60a0: 67 72 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gram..*/.#define
60b0: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
60c0: 4e 5f 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20  N_INIT1.#define 
60d0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
60e0: 5f 49 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29  _INIT2(X) (void)
60f0: 28 58 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  (X)..#if defined
6100: 28 5f 57 49 4e 33 32 29 20 26 26 20 64 65 66 69  (_WIN32) && defi
6110: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e  ned(_MSC_VER).IN
6120: 43 4c 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69  CLUDE test_windi
6130: 72 65 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74  rent.h.INCLUDE t
6140: 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a  est_windirent.c.
6150: 23 64 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44  #define dirent D
6160: 49 52 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43  IRENT.#endif.INC
6170: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6180: 2f 73 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c  /shathree.c.INCL
6190: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
61a0: 66 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45  fileio.c.INCLUDE
61b0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d   ../ext/misc/com
61c0: 70 6c 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44  pletion.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70  E ../ext/misc/ap
61e0: 70 65 6e 64 76 66 73 2e 63 0a 23 69 66 64 65 66  pendvfs.c.#ifdef
61f0: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49   SQLITE_HAVE_ZLI
6200: 42 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  B.INCLUDE ../ext
6210: 2f 6d 69 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a  /misc/zipfile.c.
6220: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d  INCLUDE ../ext/m
6230: 69 73 63 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64  isc/sqlar.c.#end
6240: 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78  if.INCLUDE ../ex
6250: 74 2f 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33  t/expert/sqlite3
6260: 65 78 70 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45  expert.h.INCLUDE
6270: 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72 74 2f 73   ../ext/expert/s
6280: 71 6c 69 74 65 33 65 78 70 65 72 74 2e 63 0a 0a  qlite3expert.c..
6290: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
62a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
62b0: 4e 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69  N)./*.** State i
62c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
62d0: 20 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73   single open ses
62e0: 73 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  sion.*/.typedef 
62f0: 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69  struct OpenSessi
6300: 6f 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a  on OpenSession;.
6310: 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69  struct OpenSessi
6320: 6f 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  on {.  char *zNa
6330: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
6340: 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  /* Symbolic name
6350: 20 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f   for this sessio
6360: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74  n */.  int nFilt
6370: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
6380: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69  /* Number of xFi
6390: 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47  lter rejection G
63a0: 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a  LOB patterns */.
63b0: 20 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65    char **azFilte
63c0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  r;         /* Ar
63d0: 72 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72  ray of xFilter r
63e0: 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61  ejection GLOB pa
63f0: 74 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  tterns */.  sqli
6400: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20  te3_session *p; 
6410: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e       /* The open
6420: 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23   session */.};.#
6430: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65  endif../*.** She
6440: 6c 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69  ll output mode i
6450: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
6460: 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e  before ".explain
6470: 20 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73   on",.** saved s
6480: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
6490: 20 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65   restored by ".e
64a0: 78 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74  xplain off".*/.t
64b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61  ypedef struct Sa
64c0: 76 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65  vedModeInfo Save
64d0: 64 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63  dModeInfo;.struc
64e0: 74 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20  t SavedModeInfo 
64f0: 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20  {.  int valid;  
6500: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68          /* Is th
6510: 65 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69  ere legit data i
6520: 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74  n here? */.  int
6530: 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   mode;          
6540: 20 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74   /* Mode prior t
6550: 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20  o ".explain on" 
6560: 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61  */.  int showHea
6570: 64 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  der;     /* The 
6580: 22 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e  ".header" settin
6590: 67 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  g prior to ".exp
65a0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
65b0: 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b  t colWidth[100];
65c0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74    /* Column widt
65d0: 68 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78  hs prior to ".ex
65e0: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a  plain on" */.};.
65f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
6600: 45 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72  ExpertInfo Exper
6610: 74 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78  tInfo;.struct Ex
6620: 70 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c  pertInfo {.  sql
6630: 69 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70  ite3expert *pExp
6640: 65 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62  ert;.  int bVerb
6650: 6f 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69  ose;.};../* A si
6660: 6e 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65  ngle line in the
6670: 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74   EQP output */.t
6680: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51  ypedef struct EQ
6690: 50 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61  PGraphRow EQPGra
66a0: 70 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51  phRow;.struct EQ
66b0: 50 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e  PGraphRow {.  in
66c0: 74 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20  t iEqpId;       
66d0: 20 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68      /* ID for th
66e0: 69 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  is row */.  int 
66f0: 69 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20  iParentId;      
6700: 20 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70    /* ID of the p
6710: 61 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45  arent row */.  E
6720: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78  QPGraphRow *pNex
6730: 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77  t;   /* Next row
6740: 20 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a   in sequence */.
6750: 20 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b    char zText[1];
6760: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
6770: 74 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74  to display for t
6780: 68 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f  his row */.};../
6790: 2a 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74  * All EQP output
67a0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
67b0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
67c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
67d0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
67e0: 74 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72  t EQPGraph EQPGr
67f0: 61 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47  aph;.struct EQPG
6800: 72 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70  raph {.  EQPGrap
6810: 68 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f  hRow *pRow;    /
6820: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
6830: 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
6840: 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
6850: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c   EQPGraphRow *pL
6860: 61 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65  ast;   /* Last e
6870: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52  lement of the pR
6880: 6f 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  ow list */.  cha
6890: 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20  r zPrefix[100]; 
68a0: 20 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66     /* Graph pref
68b0: 69 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ix */.};../*.** 
68c0: 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  State informatio
68d0: 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
68e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
68f0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
6900: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
6910: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6920: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
6930: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
6940: 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61  llState ShellSta
6950: 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c  te;.struct Shell
6960: 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65  State {.  sqlite
6970: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
6980: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
6990: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70   */.  u8 autoExp
69a0: 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  lain;        /* 
69b0: 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75  Automatically tu
69c0: 72 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d  rn on .explain m
69d0: 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f  ode */.  u8 auto
69e0: 45 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20  EQP;            
69f0: 2f 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51  /* Run EXPLAIN Q
6a00: 55 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20  UERY PLAN prior 
6a10: 74 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d  to seach SQL stm
6a20: 74 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51  t */.  u8 autoEQ
6a30: 50 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  Ptest;        /*
6a40: 20 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74   autoEQP is in t
6a50: 65 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38  est mode */.  u8
6a60: 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20   statsOn;       
6a70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6a80: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
6a90: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
6aa0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75   finalize */.  u
6ab0: 38 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20  8 scanstatsOn;  
6ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ad0: 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74   display scan st
6ae0: 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20  ats before each 
6af0: 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38  finalize */.  u8
6b00: 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
6b10: 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50       /* SHELL_OP
6b20: 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45  EN_NORMAL, _APPE
6b30: 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49  NDVFS, or _ZIPFI
6b40: 4c 45 20 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67  LE */.  u8 doXdg
6b50: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  Open;          /
6b60: 2a 20 49 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f  * Invoke start/o
6b70: 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20  pen/xdg-open in 
6b80: 6f 75 74 70 75 74 5f 72 65 73 65 74 28 29 20 2a  output_reset() *
6b90: 2f 0a 20 20 75 38 20 6e 45 71 70 4c 65 76 65 6c  /.  u8 nEqpLevel
6ba0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
6bb0: 70 74 68 20 6f 66 20 74 68 65 20 45 51 50 20 6f  pth of the EQP o
6bc0: 75 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20  utput graph */. 
6bd0: 20 75 6e 73 69 67 6e 65 64 20 6d 45 71 70 4c 69   unsigned mEqpLi
6be0: 6e 65 73 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  nes;    /* Mask 
6bf0: 6f 66 20 76 65 72 69 74 69 63 61 6c 20 6c 69 6e  of veritical lin
6c00: 65 73 20 69 6e 20 74 68 65 20 45 51 50 20 6f 75  es in the EQP ou
6c10: 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20  tput graph */.  
6c20: 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20  int outCount;   
6c30: 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74         /* Revert
6c40: 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20   to stdout when 
6c50: 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f  reaching zero */
6c60: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6c80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64  ber of records d
6c90: 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20  isplayed so far 
6ca0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6cc0: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
6cd0: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  e */.  FILE *tra
6ce0: 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ceOut;        /*
6cf0: 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69   Output for sqli
6d00: 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20  te3_trace() */. 
6d10: 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
6d20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6d30: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
6d40: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d60: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
6d70: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
6d80: 6d 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20  modePrior;      
6d90: 20 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65     /* Saved mode
6da0: 20 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b   */.  int cMode;
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6dc0: 74 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74  temporary output
6dd0: 20 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75   mode for the cu
6de0: 72 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20  rrent query */. 
6df0: 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b   int normalMode;
6e00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
6e10: 74 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e  t mode before ".
6e20: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
6e30: 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68   int writableSch
6e40: 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  ema;    /* True 
6e50: 69 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  if PRAGMA writab
6e60: 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a  le_schema=ON */.
6e70: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6e80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
6e90: 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20   to show column 
6ea0: 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72  names in List or
6eb0: 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a   Column mode */.
6ec0: 20 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20    int nCheck;   
6ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6ee0: 65 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63  er of ".check" c
6ef0: 6f 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20  ommands run */. 
6f00: 20 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46   unsigned shellF
6f10: 6c 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f  lgs;    /* Vario
6f20: 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68  us flags */.  ch
6f30: 61 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20  ar *zDestTable; 
6f40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6f50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
6f60: 65 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65  e when MODE_Inse
6f70: 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  rt */.  char *zT
6f80: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 2f  empFile;       /
6f90: 2a 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * Temporary file
6fa0: 20 74 68 61 74 20 6d 69 67 68 74 20 6e 65 65 64   that might need
6fb0: 20 64 65 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63   deleting */.  c
6fc0: 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b 33 30  har zTestcase[30
6fd0: 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ];    /* Name of
6fe0: 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 63 61   current test ca
6ff0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c  se */.  char col
7000: 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f  Separator[20]; /
7010: 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  * Column separat
7020: 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72  or character for
7030: 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a   several modes *
7040: 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65 70 61  /.  char rowSepa
7050: 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f  rator[20]; /* Ro
7060: 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  w separator char
7070: 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41  acter for MODE_A
7080: 73 63 69 69 20 2a 2f 0a 20 20 63 68 61 72 20 63  scii */.  char c
7090: 6f 6c 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  olSepPrior[20]; 
70a0: 20 2f 2a 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e   /* Saved column
70b0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
70c0: 63 68 61 72 20 72 6f 77 53 65 70 50 72 69 6f 72  char rowSepPrior
70d0: 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20  [20];  /* Saved 
70e0: 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 2a 2f  row separator */
70f0: 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b  .  int colWidth[
7100: 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71  100];     /* Req
7110: 75 65 73 74 65 64 20 77 69 64 74 68 20 6f 66 20  uested width of 
7120: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e  each column when
7130: 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a   in column mode*
7140: 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69  /.  int actualWi
7150: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63  dth[100];  /* Ac
7160: 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61  tual width of ea
7170: 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ch column */.  c
7180: 68 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30  har nullValue[20
7190: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78  ];    /* The tex
71a0: 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20  t to print when 
71b0: 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
71c0: 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20  k from.         
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
71f0: 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c  */.  char outfil
7200: 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b  e[FILENAME_MAX];
7210: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72   /* Filename for
7220: 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   *out */.  const
7230: 20 63 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61   char *zDbFilena
7240: 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  me;    /* name o
7250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7270: 46 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20  FreeOnClose;    
7280: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
7290: 20 74 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c   to free when cl
72a0: 6f 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  osing */.  const
72b0: 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20   char *zVfs;    
72c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
72d0: 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  f VFS to use */.
72e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
72f0: 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72  pStmt;   /* Curr
7300: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66  ent statement if
7310: 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20   any. */.  FILE 
7320: 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20  *pLog;          
7330: 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f    /* Write log o
7340: 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20  utput here */.  
7350: 69 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20  int *aiIndent;  
7360: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
7370: 6f 66 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20  of indents used 
7380: 69 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  in MODE_Explain 
7390: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74  */.  int nIndent
73a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
73b0: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 69 49  ize of array aiI
73c0: 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ndent[] */.  int
73d0: 20 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   iIndent;       
73e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
73f0: 63 75 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69  current op in ai
7400: 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51  Indent[] */.  EQ
7410: 50 47 72 61 70 68 20 73 47 72 61 70 68 3b 20 20  PGraph sGraph;  
7420: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
7430: 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 61 70  ion for the grap
7440: 68 69 63 61 6c 20 45 58 50 4c 41 49 4e 20 51 55  hical EXPLAIN QU
7450: 45 52 59 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20  ERY PLAN */.#if 
7460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
7470: 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
7480: 20 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20   int nSession;  
7490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
74a0: 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
74b0: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65  essions */.  Ope
74c0: 6e 53 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f  nSession aSessio
74d0: 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20  n[4];  /* Array 
74e0: 6f 66 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30  of sessions.  [0
74f0: 5d 20 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a  ] is in focus. *
7500: 2f 0a 23 65 6e 64 69 66 0a 20 20 45 78 70 65 72  /.#endif.  Exper
7510: 74 49 6e 66 6f 20 65 78 70 65 72 74 3b 20 20 20  tInfo expert;   
7520: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66       /* Valid if
7530: 20 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e   previous comman
7540: 64 20 77 61 73 20 22 2e 65 78 70 65 72 74 20 4f  d was ".expert O
7550: 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  PT..." */.};.../
7560: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
7570: 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e   for ShellState.
7580: 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69  autoEQP.*/.#defi
7590: 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66 66 20 20  ne AUTOEQP_off  
75a0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
75b0: 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 45 58 50  /* Automatic EXP
75c0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
75d0: 69 73 20 6f 66 66 20 2a 2f 0a 23 64 65 66 69 6e  is off */.#defin
75e0: 65 20 41 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20  e AUTOEQP_on    
75f0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 2f     1           /
7600: 2a 20 41 75 74 6f 6d 61 74 69 63 20 45 51 50 20  * Automatic EQP 
7610: 69 73 20 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  is on */.#define
7620: 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72   AUTOEQP_trigger
7630: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 2f 2a    2           /*
7640: 20 4f 6e 20 61 6e 64 20 61 6c 73 6f 20 73 68 6f   On and also sho
7650: 77 20 70 6c 61 6e 73 20 66 6f 72 20 74 72 69 67  w plans for trig
7660: 67 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  gers */.#define 
7670: 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20  AUTOEQP_full    
7680: 20 33 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   3           /* 
7690: 53 68 6f 77 20 66 75 6c 6c 20 45 58 50 4c 41 49  Show full EXPLAI
76a0: 4e 20 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64  N */../* Allowed
76b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c   values for Shel
76c0: 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a  lState.openMode.
76d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
76e0: 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20 20 20  _OPEN_UNSPEC    
76f0: 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70   0      /* No op
7700: 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69 66 69 65  en-mode specifie
7710: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  d */.#define SHE
7720: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20  LL_OPEN_NORMAL  
7730: 20 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72     1      /* Nor
7740: 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
7750: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7760: 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
7770: 53 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73 65  S  2      /* Use
7780: 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64   appendvfs */.#d
7790: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
77a0: 5f 5a 49 50 46 49 4c 45 20 20 20 20 33 20 20 20  _ZIPFILE    3   
77b0: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69     /* Use the zi
77c0: 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61  pfile virtual ta
77d0: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ble */.#define S
77e0: 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
77f0: 4c 59 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f  LY   4      /* O
7800: 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74  pen a normal dat
7810: 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20  abase read-only 
7820: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  */../*.** These 
7830: 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  are the allowed 
7840: 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73  shellFlgs values
7850: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c  .*/.#define SHFL
7860: 47 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20  G_Pagecache     
7870: 20 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54   0x00000001 /* T
7880: 68 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f  he --pagecache o
7890: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
78a0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c  .#define SHFLG_L
78b0: 6f 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78  ookaside      0x
78c0: 30 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b  00000002 /* Look
78d0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
78e0: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
78f0: 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20  SHFLG_Backslash 
7900: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20       0x00000004 
7910: 2f 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61  /* The --backsla
7920: 73 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  sh option is use
7930: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7940: 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
7950: 20 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20    0x00000008 /* 
7960: 2e 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20  .dump preserves 
7970: 72 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a  rowid values */.
7980: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65  #define SHFLG_Ne
7990: 77 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30  wlines       0x0
79a0: 30 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70  0000010 /* .dump
79b0: 20 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20   --newline flag 
79c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
79d0: 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20  _CountChanges   
79e0: 30 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63  0x00000020 /* .c
79f0: 68 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a  hanges setting *
7a00: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7a10: 45 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30  Echo           0
7a20: 78 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63  x00000040 /* .ec
7a30: 68 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74  ho or --echo set
7a40: 74 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  ting */../*.** M
7a50: 61 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e  acros for testin
7a60: 67 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68  g and setting sh
7a70: 65 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69  ellFlgs.*/.#defi
7a80: 6e 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  ne ShellHasFlag(
7a90: 50 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73  P,X)    (((P)->s
7aa0: 68 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21  hellFlgs & (X))!
7ab0: 3d 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  =0).#define Shel
7ac0: 6c 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20  lSetFlag(P,X)   
7ad0: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
7ae0: 7c 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53  |=(X)).#define S
7af0: 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c  hellClearFlag(P,
7b00: 58 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46  X)  ((P)->shellF
7b10: 6c 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a  lgs&=(~(X)))../*
7b20: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7b30: 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e  e allowed modes.
7b40: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45  .*/.#define MODE
7b50: 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20  _Line     0  /* 
7b60: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c  One column per l
7b70: 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65  ine.  Blank line
7b80: 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73   between records
7b90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7ba0: 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20  _Column   1  /* 
7bb0: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
7bc0: 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75  ine in neat colu
7bd0: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mns */.#define M
7be0: 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20  ODE_List     2  
7bf0: 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65  /* One record pe
7c00: 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65  r line with a se
7c10: 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  parator */.#defi
7c20: 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20  ne MODE_Semi    
7c30: 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d   3  /* Same as M
7c40: 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70  ODE_List but app
7c50: 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20  end ";" to each 
7c60: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
7c70: 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20  MODE_Html     4 
7c80: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20   /* Generate an 
7c90: 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23  XHTML table */.#
7ca0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65  define MODE_Inse
7cb0: 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72  rt   5  /* Gener
7cc0: 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22  ate SQL "insert"
7cd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23   statements */.#
7ce0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74  define MODE_Quot
7cf0: 65 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65  e    6  /* Quote
7d00: 20 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53   values as for S
7d10: 51 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  QL */.#define MO
7d20: 44 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f  DE_Tcl      7  /
7d30: 2a 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d  * Generate ANSI-
7d40: 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20  C or TCL quoted 
7d50: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  elements */.#def
7d60: 69 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20  ine MODE_Csv    
7d70: 20 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74    8  /* Quote st
7d80: 72 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61  rings, numbers a
7d90: 72 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66  re plain */.#def
7da0: 69 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ine MODE_Explain
7db0: 20 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44    9  /* Like MOD
7dc0: 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f  E_Column, but do
7dd0: 20 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61   not truncate da
7de0: 74 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ta */.#define MO
7df0: 44 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f  DE_Ascii   10  /
7e00: 2a 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74  * Use ASCII unit
7e10: 20 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61   and record sepa
7e20: 72 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31  rators (0x1F/0x1
7e30: 45 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  E) */.#define MO
7e40: 44 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f  DE_Pretty  11  /
7e50: 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73  * Pretty-print s
7e60: 63 68 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e  chemas */.#defin
7e70: 65 20 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31  e MODE_EQP     1
7e80: 32 20 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45  2  /* Converts E
7e90: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
7ea0: 4e 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20  N output into a 
7eb0: 67 72 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63  graph */..static
7ec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
7ed0: 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22  eDescr[] = {.  "
7ee0: 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e  line",.  "column
7ef0: 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22  ",.  "list",.  "
7f00: 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c  semi",.  "html",
7f10: 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22  .  "insert",.  "
7f20: 71 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c  quote",.  "tcl",
7f30: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
7f40: 6c 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22  lain",.  "ascii"
7f50: 2c 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74  ,.  "prettyprint
7f60: 22 2c 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f  ",.  "eqp".};../
7f70: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
7f80: 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69  he column/row/li
7f90: 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73  ne separators us
7fa0: 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ed by the variou
7fb0: 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f  s.** import/expo
7fc0: 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  rt modes..*/.#de
7fd0: 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20  fine SEP_Column 
7fe0: 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53     "|".#define S
7ff0: 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e  EP_Row       "\n
8000: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61  ".#define SEP_Ta
8010: 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65  b       "\t".#de
8020: 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20  fine SEP_Space  
8030: 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53     " ".#define S
8040: 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22  EP_Comma     ","
8050: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c  .#define SEP_CrL
8060: 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64  f      "\r\n".#d
8070: 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20  efine SEP_Unit  
8080: 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69      "\x1F".#defi
8090: 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20  ne SEP_Record   
80a0: 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41   "\x1E"../*.** A
80b0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
80c0: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
80d0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
80e0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c  atic void shellL
80f0: 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  og(void *pArg, i
8100: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
8110: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
8120: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
8130: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
8140: 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  Arg;.  if( p->pL
8150: 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  og==0 ) return;.
8160: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
8170: 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c  >pLog, "(%d) %s\
8180: 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d  n", iErrCode, zM
8190: 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d  sg);.  fflush(p-
81a0: 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pLog);.}../*.**
81b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
81c0: 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a  shell_putsnl(X).
81d0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
81e0: 74 65 78 74 20 58 20 74 6f 20 74 68 65 20 73 63  text X to the sc
81f0: 72 65 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65  reen (or whateve
8200: 72 20 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e  r output is bein
8210: 67 20 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61  g directed).** a
8220: 64 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20  dding a newline 
8230: 61 74 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20  at the end, and 
8240: 74 68 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a  then return X..*
8250: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
8260: 65 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73  ellPutsFunc(.  s
8270: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8280: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
8290: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
82a0: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53  e **apVal.){.  S
82b0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
82c0: 53 68 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69  ShellState*)sqli
82d0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
82e0: 74 78 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61  tx);.  (void)nVa
82f0: 6c 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  l;.  utf8_printf
8300: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
8310: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8320: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a  ext(apVal[0]));.
8330: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8340: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
8350: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
8360: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
8370: 20 65 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20   edit(VALUE).** 
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 65 64 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f  edit(VALUE,EDITO
83a0: 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73  R).**.** These s
83b0: 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  teps:.**.**     
83c0: 28 31 29 20 57 72 69 74 65 20 56 41 4c 55 45 20  (1) Write VALUE 
83d0: 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  into a temporary
83e0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32   file..**     (2
83f0: 29 20 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44  ) Run program ED
8400: 49 54 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d  ITOR on that tem
8410: 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20  porary file..** 
8420: 20 20 20 20 28 33 29 20 52 65 61 64 20 74 68 65      (3) Read the
8430: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
8440: 62 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  back and return 
8450: 69 74 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  its content as t
8460: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20  he result..**   
8470: 20 20 28 34 29 20 44 65 6c 65 74 65 20 74 68 65    (4) Delete the
8480: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a   temporary file.
8490: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49  **.** If the EDI
84a0: 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20  TOR argument is 
84b0: 6f 6d 69 74 74 65 64 2c 20 75 73 65 20 74 68 65  omitted, use the
84c0: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49   value in the VI
84d0: 53 55 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d  SUAL.** environm
84e0: 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49  ent variable.  I
84f0: 66 20 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73  f still there is
8500: 20 6e 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f   no EDITOR, thro
8510: 75 67 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a  ugh an error..**
8520: 0a 2a 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61  .** Also throw a
8530: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 45  n error if the E
8540: 44 49 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65  DITOR program re
8550: 74 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f  turns a non-zero
8560: 20 65 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23   exit code..*/.#
8570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
8580: 48 41 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74  HAVE_SYSTEM.stat
8590: 69 63 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63  ic void editFunc
85a0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
85b0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
85c0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
85d0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
85e0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
85f0: 20 2a 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61   *zEditor;.  cha
8600: 72 20 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  r *zTempFile = 0
8610: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8620: 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20  .  char *zCmd = 
8630: 30 3b 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20  0;.  int bBin;. 
8640: 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 20   int rc;.  FILE 
8650: 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  *f = 0;.  sqlite
8660: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71  3_int64 sz;.  sq
8670: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
8680: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8690: 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  p = 0;..  if( ar
86a0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64  gc==2 ){.    zEd
86b0: 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  itor = (const ch
86c0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
86d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
86e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
86f0: 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22  ditor = getenv("
8700: 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20  VISUAL");.  }.  
8710: 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29  if( zEditor==0 )
8720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8730: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8740: 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66  xt, "no editor f
8750: 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  or edit()", -1);
8760: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8770: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
8780: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
8790: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
87a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
87b0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
87c0: 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74  ext, "NULL input
87d0: 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29   to edit()", -1)
87e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
87f0: 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  }.  db = sqlite3
8800: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8810: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  le(context);.  z
8820: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8830: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
8840: 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49  trol(db, 0, SQLI
8850: 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
8860: 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c  ENAME, &zTempFil
8870: 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46  e);.  if( zTempF
8880: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
8890: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d  lite3_uint64 r =
88a0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
88b0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
88c0: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a  f(r), &r);.    z
88d0: 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
88e0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
88f0: 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69  %llx", r);.    i
8900: 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  f( zTempFile==0 
8910: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8920: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8930: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8940: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8950: 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73  }.  }.  bBin = s
8960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8970: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8980: 54 45 5f 42 4c 4f 42 3b 0a 20 20 66 20 3d 20 66  TE_BLOB;.  f = f
8990: 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20  open(zTempFile, 
89a0: 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77  bBin ? "wb" : "w
89b0: 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29  ");.  if( f==0 )
89c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
89d0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
89e0: 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e  xt, "edit() cann
89f0: 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c  ot open temp fil
8a00: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  e", -1);.    got
8a10: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8a20: 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69  .  }.  sz = sqli
8a30: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
8a40: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
8a50: 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20  bBin ){.    x = 
8a60: 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76  fwrite(sqlite3_v
8a70: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8a80: 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  ]), 1, sz, f);. 
8a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 20 3d 20   }else{.    x = 
8aa0: 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76  fwrite(sqlite3_v
8ab0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
8ac0: 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  ]), 1, sz, f);. 
8ad0: 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a   }.  fclose(f);.
8ae0: 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78    f = 0;.  if( x
8af0: 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69  !=sz ){.    sqli
8b00: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8b10: 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28  (context, "edit(
8b20: 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) could not writ
8b30: 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  e the whole file
8b40: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
8b50: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
8b60: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73 71 6c    }.  zCmd = sql
8b70: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
8b80: 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69 74 6f   \"%s\"", zEdito
8b90: 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  r, zTempFile);. 
8ba0: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a   if( zCmd==0 ){.
8bb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8bc0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
8bd0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
8be0: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8bf0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 73 74  .  }.  rc = syst
8c00: 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71 6c 69  em(zCmd);.  sqli
8c10: 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
8c20: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8c30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8c40: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 45  rror(context, "E
8c50: 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64 20 6e  DITOR returned n
8c60: 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b 0a 20  on-zero", -1);. 
8c70: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
8c80: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 20 3d  c_end;.  }.  f =
8c90: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
8ca0: 2c 20 62 42 69 6e 20 3f 20 22 72 62 22 20 3a 20  , bBin ? "rb" : 
8cb0: 22 72 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "r");.  if( f==0
8cc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8cd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8ce0: 74 65 78 74 2c 0a 20 20 20 20 20 20 22 65 64 69  text,.      "edi
8cf0: 74 28 29 20 63 61 6e 6e 6f 74 20 72 65 6f 70 65  t() cannot reope
8d00: 6e 20 74 65 6d 70 20 66 69 6c 65 20 61 66 74 65  n temp file afte
8d10: 72 20 65 64 69 74 22 2c 20 2d 31 29 3b 0a 20 20  r edit", -1);.  
8d20: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8d30: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 73 65 65  _end;.  }.  fsee
8d40: 6b 28 66 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  k(f, 0, SEEK_END
8d50: 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28  );.  sz = ftell(
8d60: 66 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 29 3b  f);.  rewind(f);
8d70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
8d80: 61 6c 6c 6f 63 36 34 28 20 73 7a 2b 28 62 42 69  alloc64( sz+(bBi
8d90: 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
8da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8db0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
8dc0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
8dd0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8de0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
8df0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
8e00: 3d 20 66 72 65 61 64 28 70 2c 20 31 2c 20 73 7a  = fread(p, 1, sz
8e10: 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , f);.  }else{. 
8e20: 20 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20     x = fread(p, 
8e30: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 20 20 70  1, sz, f);.    p
8e40: 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  [sz] = 0;.  }.  
8e50: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
8e60: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
8e70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8e80: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8e90: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
8ea0: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
8eb0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
8ec0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8ed0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
8ee0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
8ef0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
8f00: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
8f10: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
8f20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8f30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
8f40: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
8f50: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73  const char*)p, s
8f60: 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8f80: 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54  ite3_free, SQLIT
8f90: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70  E_UTF8);.  }.  p
8fa0: 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63   = 0;..edit_func
8fb0: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20  _end:.  if( f ) 
8fc0: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c  fclose(f);.  unl
8fd0: 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ink(zTempFile);.
8fe0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8ff0: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
9000: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
9010: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9020: 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
9030: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72  /../*.** Save or
9040: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
9050: 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9070: 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53  outputModePush(S
9080: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
9090: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20   p->modePrior = 
90a0: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70  p->mode;.  memcp
90b0: 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  y(p->colSepPrior
90c0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
90d0: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
90e0: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
90f0: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50  emcpy(p->rowSepP
9100: 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61  rior, p->rowSepa
9110: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
9120: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
9130: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  .}.static void o
9140: 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65  utputModePop(She
9150: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70  llState *p){.  p
9160: 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  ->mode = p->mode
9170: 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28  Prior;.  memcpy(
9180: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
9190: 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c   p->colSepPrior,
91a0: 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65   sizeof(p->colSe
91b0: 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d  parator));.  mem
91c0: 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cpy(p->rowSepara
91d0: 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72  tor, p->rowSepPr
91e0: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72  ior, sizeof(p->r
91f0: 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d  owSeparator));.}
9200: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9210: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9220: 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64  as a hex-encoded
9230: 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33   blob (eg. X'123
9240: 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  4' ).*/.static v
9250: 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62  oid output_hex_b
9260: 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  lob(FILE *out, c
9270: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
9280: 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20  , int nBlob){.  
9290: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
92a0: 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70  Blob = (char *)p
92b0: 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e  Blob;.  raw_prin
92c0: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
92d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
92e0: 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e  ; i++){ raw_prin
92f0: 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42  tf(out,"%02x",zB
9300: 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a  lob[i]&0xff); }.
9310: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9320: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
9330: 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68  Find a string th
9340: 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  at is not found 
9350: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e  anywhere in z[].
9360: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
9370: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74  er.** to that st
9380: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20  ring..**.** Try 
9390: 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42  to use zA and zB
93a0: 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68   first.  If both
93b0: 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c   of those are al
93c0: 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a  ready found in z
93d0: 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  [].** then make 
93e0: 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61  up some string a
93f0: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  nd store it in t
9400: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  he buffer zBuf..
9410: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9420: 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72  char *unused_str
9430: 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ing(.  const cha
9440: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
9450: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9460: 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65  lt must not appe
9470: 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a  ar anywhere in z
9480: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9490: 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72   *zA, const char
94a0: 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74   *zB,   /* Try t
94b0: 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  hese first */.  
94c0: 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20  char *zBuf      
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74    /* Space to st
94f0: 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20  ore a generated 
9500: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  string */.){.  u
9510: 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20  nsigned i = 0;. 
9520: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
9530: 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  A)==0 ) return z
9540: 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  A;.  if( strstr(
9550: 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75  z, zB)==0 ) retu
9560: 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20  rn zB;.  do{.   
9570: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9580: 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75  f(20,zBuf,"(%s%u
9590: 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20  )", zA, i++);.  
95a0: 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a  }while( strstr(z
95b0: 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72  ,zBuf)!=0 );.  r
95c0: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f  eturn zBuf;.}../
95d0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
95e0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
95f0: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9600: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9610: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9620: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f  *.** See also: o
9630: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9640: 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f  aped_string().*/
9650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9660: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
9670: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9680: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9690: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
96a0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
96b0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
96c0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
96d0: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
96e0: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
96f0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9700: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
9710: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9720: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9730: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
9740: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
9750: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9760: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
9770: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
9780: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
9790: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
97a0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
97b0: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
97c0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
97d0: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
97e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
97f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
9800: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
9810: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9820: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
9830: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
9840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9850: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
9860: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
9870: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
9880: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
9890: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
98a0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
98b0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
98c0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
98d0: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
98e0: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20  conventions..** 
98f0: 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20  Additionallly , 
9900: 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20  escape the "\n" 
9910: 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
9920: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
9930: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63   do not.** get c
9940: 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d  orrupted by end-
9950: 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  of-line translat
9960: 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69  ion facilities i
9970: 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  n some operating
9980: 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  .** systems..**.
9990: 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  ** This is like 
99a0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
99b0: 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20  ring() but with 
99c0: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
99d0: 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61  the \r\n.** esca
99e0: 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  pe mechanism..*/
99f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9a00: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
9a10: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9a20: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9a30: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9a40: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9a50: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9a60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9a70: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9a80: 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\'' && c!='\n' 
9a90: 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  && c!='\r'; i++)
9aa0: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
9ab0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
9ac0: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
9ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9ae0: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
9af0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9b00: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
9b10: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
9b20: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
9b30: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
9b40: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
9b50: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
9b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
9b70: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
9b80: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
9b90: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
9ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
9bb0: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  NL ){.      raw_
9bc0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70  printf(out, "rep
9bd0: 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a  lace(");.      z
9be0: 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
9bf0: 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  ng(z, "\\n", "\\
9c00: 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
9c10: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20    }.    if( nCR 
9c20: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9c30: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
9c40: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20  e(");.      zCR 
9c50: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
9c60: 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  z, "\\r", "\\015
9c70: 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d  ", zBuf2);.    }
9c80: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
9c90: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
9ca0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
9cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
9cc0: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
9cd0: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26  \n' && c!='\r' &
9ce0: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
9cf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
9d00: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
9d10: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
9d20: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
9d30: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
9d40: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
9d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d60: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
9d70: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
9d80: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9d90: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9da0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9db0: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
9dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9dd0: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
9de0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
9df0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
9e00: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e  tf(out, "%s", zN
9e10: 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  L);.        cont
9e20: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
9e30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9e40: 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a  ut, "%s", zCR);.
9e50: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
9e60: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
9e70: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
9e80: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
9e90: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
9ea0: 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20  (13))", zCR);.  
9eb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
9ec0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9ed0: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
9ee0: 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29  char(10))", zNL)
9ef0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
9f00: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
9f10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9f20: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9f30: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
9f40: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f  according to C o
9f50: 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75  r TCL quoting ru
9f60: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
9f70: 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72  oid output_c_str
9f80: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
9f90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9fa0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
9fb0: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
9fc0: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20  t);.  while( (c 
9fd0: 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a  = *(z++))!=0 ){.
9fe0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
9ff0: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  ){.      fputc(c
a000: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a010: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a020: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
a030: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a040: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a050: 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75     fputc('"', ou
a060: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a070: 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20  ( c=='\t' ){.   
a080: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a090: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a0a0: 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('t', out);.    
a0b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e  }else if( c=='\n
a0c0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a0d0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a0e0: 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75     fputc('n', ou
a0f0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a100: 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  ( c=='\r' ){.   
a110: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a120: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a130: 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('r', out);.    
a140: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69  }else if( !ispri
a150: 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20  nt(c&0xff) ){.  
a160: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a170: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
a180: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
a190: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
a1a0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
a1b0: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a1c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
a1d0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
a1e0: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
a1f0: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
a200: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
a210: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
a220: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a230: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
a240: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a250: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
a260: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
a270: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
a280: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a290: 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20     z[i].        
a2a0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27      && z[i]!='<'
a2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a2c0: 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20  z[i]!='&'.      
a2d0: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
a2e0: 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  >'.            &
a2f0: 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20  & z[i]!='\"'.   
a300: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
a310: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
a320: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
a330: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >0 ){.      utf8
a340: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  _printf(out,"%.*
a350: 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20  s",i,z);.    }. 
a360: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27     if( z[i]=='<'
a370: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a380: 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29  intf(out,"&lt;")
a390: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a3a0: 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[i]=='&' ){.   
a3b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a3c0: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
a3d0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
a3e0: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '>' ){.      raw
a3f0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74  _printf(out,"&gt
a400: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a410: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b  f( z[i]=='\"' ){
a420: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a430: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
a440: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
a450: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
a460: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a470: 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20  t,"&#39;");.    
a480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
a490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
a4a0: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
a4b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c  ./*.** If a fiel
a4c0: 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63  d contains any c
a4d0: 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66  haracter identif
a4e0: 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68  ied by a 1 in th
a4f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61  e following.** a
a500: 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73  rray, then the s
a510: 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75  tring must be qu
a520: 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f  oted for CSV..*/
a530: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
a540: 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  ar needCsvQuote[
a550: 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c  ] = {.  1, 1, 1,
a560: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a570: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a580: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a590: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a5a0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a5b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a5c0: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
a5d0: 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20  , 0, 1,   0, 0, 
a5e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a5f0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a600: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a610: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a620: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a630: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a640: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a650: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
a660: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a670: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a690: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a6a0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
a6b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a6c0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a6d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a6e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a6f0: 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  0, 1,.  1, 1, 1,
a700: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a710: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a720: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a730: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a740: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a750: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a760: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a770: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a780: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a790: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a7a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a7b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7c0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a7d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7e0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a7f0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a800: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a810: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a820: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a830: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a840: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a850: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a860: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a870: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a880: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a890: 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1, 1,.};../*.** 
a8a0: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
a8b0: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
a8c0: 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65  tually, p->colSe
a8d0: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
a8e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
a8f0: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
a900: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
a910: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56  comma.  p->nullV
a920: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
a930: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
a940: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69  ngs are quoted i
a950: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
a960: 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69  e separator.** i
a970: 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66  s only issued if
a980: 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a   bSep is true..*
a990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
a9a0: 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74  tput_csv(ShellSt
a9b0: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
a9c0: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
a9d0: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
a9e0: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
a9f0: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
aa00: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
aa10: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
aa20: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
aa30: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d  ;.    int nSep =
aa40: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
aa50: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
aa60: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
aa70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
aa80: 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e  eedCsvQuote[((un
aa90: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
aaa0: 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  i]].         || 
aab0: 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70  (z[i]==p->colSep
aac0: 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20  arator[0] &&.   
aad0: 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d            (nSep=
aae0: 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20  =1 || memcmp(z, 
aaf0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
ab00: 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20   nSep)==0)) ){. 
ab10: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
ab20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ab40: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
ab50: 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d   char *zQuoted =
ab60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ab70: 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20  ("\"%w\"", z);. 
ab80: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ab90: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f  (out, "%s", zQuo
aba0: 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
abb0: 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64  te3_free(zQuoted
abc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
abd0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
abe0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
abf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
ac00: 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Sep ){.    utf8_
ac10: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ac20: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
ac30: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ator);.  }.}../*
ac40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ac50: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
ac60: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
ac70: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
ac80: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
ac90: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
aca0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
acb0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
acc0: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b   seenInterrupt++
acd0: 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65  ;.  if( seenInte
ace0: 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31  rrupt>2 ) exit(1
acf0: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44  );.  if( globalD
ad00: 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  b ) sqlite3_inte
ad10: 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b  rrupt(globalDb);
ad20: 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64  .}..#if (defined
ad30: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
ad40: 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21  ned(WIN32)) && !
ad50: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
ad60: 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CE)./*.** This r
ad70: 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20  outine runs for 
ad80: 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28  console events (
ad90: 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20  e.g. Ctrl-C) on 
ada0: 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20  Win32.*/.static 
adb0: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73  BOOL WINAPI Cons
adc0: 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a  oleCtrlHandler(.
add0: 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79    DWORD dwCtrlTy
ade0: 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  pe /* One of the
adf0: 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f   CTRL_*_EVENT co
ae00: 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
ae10: 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d  if( dwCtrlType==
ae20: 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a  CTRL_C_EVENT ){.
ae30: 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61      interrupt_ha
ae40: 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65  ndler(0);.    re
ae50: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20  turn TRUE;.  }. 
ae60: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
ae70: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
ae80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ae90: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
aea0: 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68   When the ".auth
aeb0: 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65   ON" is set, the
aec0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f   following autho
aed0: 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  rizer callback i
aee0: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49  s.** invoked.  I
aef0: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
af00: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
af10: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41  tatic int shellA
af20: 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  uth(.  void *pCl
af30: 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20  ientData,.  int 
af40: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
af50: 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA1,.  const c
af60: 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73  har *zA2,.  cons
af70: 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63  t char *zA3,.  c
af80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29  onst char *zA4.)
af90: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
afa0: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
afb0: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
afc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
afd0: 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20  r *azAction[] = 
afe0: 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54  { 0,.     "CREAT
aff0: 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  E_INDEX",       
b000: 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22    "CREATE_TABLE"
b010: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b020: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  E_TEMP_INDEX",. 
b030: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b040: 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45  _TABLE",    "CRE
b050: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
b060: 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50  ",  "CREATE_TEMP
b070: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52  _VIEW",.     "CR
b080: 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20  EATE_TRIGGER",  
b090: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45       "CREATE_VIE
b0a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45  W",          "DE
b0b0: 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f  LETE",.     "DRO
b0c0: 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  P_INDEX",       
b0d0: 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22      "DROP_TABLE"
b0e0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b0f0: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  P_TEMP_INDEX",. 
b100: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b110: 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f  ABLE",      "DRO
b120: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  P_TEMP_TRIGGER",
b130: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56      "DROP_TEMP_V
b140: 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  IEW",.     "DROP
b150: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
b160: 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20     "DROP_VIEW", 
b170: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
b180: 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d  RT",.     "PRAGM
b190: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
b1a0: 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20    "READ",       
b1b0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
b1c0: 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41  T",.     "TRANSA
b1d0: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
b1e0: 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20   "UPDATE",      
b1f0: 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48           "ATTACH
b200: 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22  ",.     "DETACH"
b210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b220: 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20  "ALTER_TABLE",  
b230: 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58          "REINDEX
b240: 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45  ",.     "ANALYZE
b250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b260: 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c  "CREATE_VTABLE",
b270: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54          "DROP_VT
b280: 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e  ABLE",.     "FUN
b290: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
b2a0: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c      "SAVEPOINT",
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43              "REC
b2c0: 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69  URSIVE".  };.  i
b2d0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
b2e0: 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b  ar *az[4];.  az[
b2f0: 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31  0] = zA1;.  az[1
b300: 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d  ] = zA2;.  az[2]
b310: 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20   = zA3;.  az[3] 
b320: 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72  = zA4;.  utf8_pr
b330: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75  intf(p->out, "au
b340: 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61  thorizer: %s", a
b350: 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20  zAction[op]);.  
b360: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
b370: 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  +){.    raw_prin
b380: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
b390: 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29  .    if( az[i] )
b3a0: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  {.      output_c
b3b0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
b3c0: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  az[i]);.    }els
b3d0: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
b3e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c  ntf(p->out, "NUL
b3f0: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
b400: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b410: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74  ut, "\n");.  ret
b420: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b430: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
b440: 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74  rint a schema st
b450: 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f  atement.  Part o
b460: 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20  f MODE_Semi and 
b470: 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70  MODE_Pretty outp
b480: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ut..**.** This r
b490: 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20  outine converts 
b4a0: 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c  some CREATE TABL
b4b0: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  E statements for
b4c0: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a   shadow tables.*
b4d0: 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e  * in FTS3/4/5 in
b4e0: 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
b4f0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
b500: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
b510: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63  tic void printSc
b520: 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f  hemaLine(FILE *o
b530: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
b540: 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  z, const char *z
b550: 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  Tail){.  if( sql
b560: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52  ite3_strglob("CR
b570: 45 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d  EATE TABLE ['\"]
b580: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
b590: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
b5a0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
b5b0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
b5c0: 25 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c  %s", z+13, zTail
b5d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b5e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
b5f0: 20 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69   "%s%s", z, zTai
b600: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
b610: 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d   void printSchem
b620: 61 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74  aLineN(FILE *out
b630: 2c 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  , char *z, int n
b640: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
b650: 61 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d  ail){.  char c =
b660: 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20   z[n];.  z[n] = 
b670: 30 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61  0;.  printSchema
b680: 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61  Line(out, z, zTa
b690: 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b  il);.  z[n] = c;
b6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b6b0: 20 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20   true if string 
b6c0: 7a 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20  z[] has nothing 
b6d0: 62 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61  but whitespace a
b6e0: 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74  nd comments to t
b6f0: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
b700: 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a   first line..*/.
b710: 73 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45  static int wsToE
b720: 6f 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ol(const char *z
b730: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
b740: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
b750: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
b760: 3d 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31  ='\n' ) return 1
b770: 3b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  ;.    if( IsSpac
b780: 65 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e  e(z[i]) ) contin
b790: 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ue;.    if( z[i]
b7a0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
b7b0: 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b  ='-' ) return 1;
b7c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b7d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
b7e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
b7f0: 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45  w entry to the E
b800: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
b810: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
b820: 20 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64   void eqp_append
b830: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
b840: 69 6e 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20  int iEqpId, int 
b850: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
b860: 7a 54 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61  zText){.  EQPGra
b870: 70 68 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69  phRow *pNew;.  i
b880: 6e 74 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65  nt nText = strle
b890: 6e 33 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66  n30(zText);.  if
b8a0: 28 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74  ( p->autoEQPtest
b8b0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
b8c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c  ntf(p->out, "%d,
b8d0: 25 64 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64  %d,%s\n", iEqpId
b8e0: 2c 20 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20  , p2, zText);.  
b8f0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
b900: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
b910: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65  eof(*pNew) + nTe
b920: 78 74 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  xt );.  if( pNew
b930: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
b940: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70  of_memory();.  p
b950: 4e 65 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45  New->iEqpId = iE
b960: 71 70 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50  qpId;.  pNew->iP
b970: 61 72 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20  arentId = p2;.  
b980: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65  memcpy(pNew->zTe
b990: 78 74 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74  xt, zText, nText
b9a0: 2b 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  +1);.  pNew->pNe
b9b0: 78 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  xt = 0;.  if( p-
b9c0: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b  >sGraph.pLast ){
b9d0: 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70  .    p->sGraph.p
b9e0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  Last->pNext = pN
b9f0: 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ew;.  }else{.   
ba00: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20   p->sGraph.pRow 
ba10: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d  = pNew;.  }.  p-
ba20: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20  >sGraph.pLast = 
ba30: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
ba40: 72 65 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  ree and reset th
ba50: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
ba60: 50 4c 41 4e 20 64 61 74 61 20 74 68 61 74 20 68  PLAN data that h
ba70: 61 73 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65  as been collecte
ba80: 64 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70  d.** in p->sGrap
ba90: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
baa0: 64 20 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c  d eqp_reset(Shel
bab0: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51  lState *p){.  EQ
bac0: 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c  PGraphRow *pRow,
bad0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
bae0: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
baf0: 70 52 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77  pRow; pRow; pRow
bb00: 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   = pNext){.    p
bb10: 4e 65 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  Next = pRow->pNe
bb20: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
bb30: 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a  free(pRow);.  }.
bb40: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72    memset(&p->sGr
bb50: 61 70 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  aph, 0, sizeof(p
bb60: 2d 3e 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f  ->sGraph));.}../
bb70: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * Return the nex
bb80: 74 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  t EXPLAIN QUERY 
bb90: 50 4c 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69  PLAN line with i
bba0: 45 71 70 49 64 20 74 68 61 74 20 6f 63 63 75 72  EqpId that occur
bbb0: 73 20 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c  s after.** pOld,
bbc0: 20 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20 66   or return the f
bbd0: 69 72 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69  irst such line i
bbe0: 66 20 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a  f pOld is NULL.*
bbf0: 2f 0a 73 74 61 74 69 63 20 45 51 50 47 72 61 70  /.static EQPGrap
bc00: 68 52 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72  hRow *eqp_next_r
bc10: 6f 77 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ow(ShellState *p
bc20: 2c 20 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51  , int iEqpId, EQ
bc30: 50 47 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29  PGraphRow *pOld)
bc40: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
bc50: 2a 70 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70  *pRow = pOld ? p
bc60: 4f 6c 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e  Old->pNext : p->
bc70: 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77  sGraph.pRow;.  w
bc80: 68 69 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52  hile( pRow && pR
bc90: 6f 77 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69  ow->iParentId!=i
bca0: 45 71 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70  EqpId ) pRow = p
bcb0: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  Row->pNext;.  re
bcc0: 74 75 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a  turn pRow;.}../*
bcd0: 20 52 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65   Render a single
bce0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72   level of the gr
bcf0: 61 70 68 20 74 68 61 74 20 68 61 73 20 69 45 71  aph that has iEq
bd00: 70 49 64 20 61 73 20 69 74 73 20 70 61 72 65 6e  pId as its paren
bd10: 74 2e 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65  t.  Called.** re
bd20: 63 75 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e  cursively to ren
bd30: 64 65 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a  der sublevels..*
bd40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
bd50: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53  p_render_level(S
bd60: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
bd70: 74 20 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50  t iEqpId){.  EQP
bd80: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20  GraphRow *pRow, 
bd90: 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20  *pNext;.  int n 
bda0: 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47  = strlen30(p->sG
bdb0: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20  raph.zPrefix);. 
bdc0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28   char *z;.  for(
bdd0: 70 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f  pRow = eqp_next_
bde0: 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30  row(p, iEqpId, 0
bdf0: 29 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20  ); pRow; pRow = 
be00: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
be10: 74 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77  t = eqp_next_row
be20: 28 70 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77  (p, iEqpId, pRow
be30: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d  );.    z = pRow-
be40: 3e 7a 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38  >zText;.    utf8
be50: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
be60: 22 25 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73  "%s%s%s\n", p->s
be70: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70  Graph.zPrefix, p
be80: 4e 65 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22  Next ? "|--" : "
be90: 60 2d 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66  `--", z);.    if
bea0: 28 20 6e 3c 73 69 7a 65 6f 66 28 70 2d 3e 73 47  ( n<sizeof(p->sG
beb0: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 2d 37 20  raph.zPrefix)-7 
bec0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
bed0: 26 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  &p->sGraph.zPref
bee0: 69 78 5b 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22  ix[n], pNext ? "
bef0: 7c 20 20 22 20 3a 20 22 20 20 20 22 2c 20 34 29  |  " : "   ", 4)
bf00: 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64  ;.      eqp_rend
bf10: 65 72 5f 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77  er_level(p, pRow
bf20: 2d 3e 69 45 71 70 49 64 29 3b 0a 20 20 20 20 20  ->iEqpId);.     
bf30: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
bf40: 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ix[n] = 0;.    }
bf50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
bf60: 73 70 6c 61 79 20 61 6e 64 20 72 65 73 65 74 20  splay and reset 
bf70: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
bf80: 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73  Y PLAN data.*/.s
bf90: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72  tatic void eqp_r
bfa0: 65 6e 64 65 72 28 53 68 65 6c 6c 53 74 61 74 65  ender(ShellState
bfb0: 20 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68   *p){.  EQPGraph
bfc0: 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73  Row *pRow = p->s
bfd0: 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66  Graph.pRow;.  if
bfe0: 28 20 70 52 6f 77 20 29 7b 0a 20 20 20 20 69 66  ( pRow ){.    if
bff0: 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d  ( pRow->zText[0]
c000: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
c010: 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d  f( pRow->pNext==
c020: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70  0 ){.        eqp
c030: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20  _reset(p);.     
c040: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
c050: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
c060: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c070: 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74  \n", pRow->zText
c080: 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  +3);.      p->sG
c090: 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77  raph.pRow = pRow
c0a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
c0b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77  qlite3_free(pRow
c0c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c0d0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c0e0: 70 2d 3e 6f 75 74 2c 20 22 51 55 45 52 59 20 50  p->out, "QUERY P
c0f0: 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  LAN\n");.    }. 
c100: 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72     p->sGraph.zPr
c110: 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  efix[0] = 0;.   
c120: 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65   eqp_render_leve
c130: 6c 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 71 70  l(p, 0);.    eqp
c140: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d  _reset(p);.  }.}
c150: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
c160: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
c170: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
c180: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
c190: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
c1a0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
c1b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
c1c0: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  ll_callback(.  v
c1d0: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
c1e0: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a   nArg,        /*
c1f0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
c200: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63  t columns */.  c
c210: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
c220: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
c230: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
c240: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
c250: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
c260: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  mes */.  int *ai
c270: 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c  Type      /* Col
c280: 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a  umn types */.){.
c290: 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c    int i;.  Shell
c2a0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
c2b0: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20  lState*)pArg;.. 
c2c0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c2d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
c2e0: 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a  ch( p->cMode ){.
c2f0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
c300: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
c310: 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  w = 5;.      if(
c320: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
c330: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
c340: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c350: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
c360: 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  = strlen30(azCol
c370: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
c380: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66   "");.        if
c390: 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65  ( len>w ) w = le
c3a0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
c3b0: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20   if( p->cnt++>0 
c3c0: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
c3d0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
c3e0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
c3f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c400: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
c410: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c420: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25  ->out,"%*s = %s%
c430: 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  s", w, azCol[i],
c440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c450: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
c460: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
c470: 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  lue, p->rowSepar
c480: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
c490: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c4a0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
c4b0: 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73  Explain:.    cas
c4c0: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
c4d0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
c4e0: 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e  nst int aExplain
c4f0: 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31  Widths[] = {4, 1
c500: 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20  3, 4, 4, 4, 13, 
c510: 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f  2, 13};.      co
c520: 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74  nst int *colWidt
c530: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f  h;.      int sho
c540: 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  wHdr;.      char
c550: 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20   *rowSep;.      
c560: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
c570: 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  DE_Column ){.   
c580: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
c590: 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  p->colWidth;.   
c5a0: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70       showHdr = p
c5b0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  ->showHeader;.  
c5c0: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70        rowSep = p
c5d0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a  ->rowSeparator;.
c5e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c5f0: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
c600: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a  aExplainWidths;.
c610: 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20          showHdr 
c620: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77  = 1;.        row
c630: 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20  Sep = SEP_Row;. 
c640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c650: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a   p->cnt++==0 ){.
c660: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
c670: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
c680: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20           int w, 
c690: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  n;.          if(
c6a0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
c6b0: 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  colWidth) ){.   
c6c0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c           w = col
c6d0: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
c6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c6f0: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
c700: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c710: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
c720: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
c730: 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c  strlenChar(azCol
c740: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
c750: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
c760: 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d    if( w<10 ) w =
c770: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
c780: 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   n = strlenChar(
c790: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
c7a0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
c7b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
c7c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
c7d0: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
c7e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
c7f0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
c800: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
c810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c820: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
c830: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
c840: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
c850: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
c860: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
c870: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
c880: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20   w, azCol[i]);. 
c890: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
c8a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c8b0: 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f  %s", i==nArg-1 ?
c8c0: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
c8d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c8e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c8f0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
c900: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
c910: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
c920: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77             int w
c930: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
c940: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
c950: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
c960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c970: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
c980: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
c990: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 20        if( w<0 ) 
c9a0: 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20  w = -w;.        
c9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9c0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
c9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
c9f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ca00: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20  %-*.*s%s",w,w,. 
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
cad0: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
cae0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
caf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cb00: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
cb10: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cb20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
cb30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
cb40: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66  nt w;.        if
cb50: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
cb60: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
cb70: 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20  .           w = 
cb80: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
cb90: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
cba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
cbb0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
cbc0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d         if( p->cM
cbd0: 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
cbe0: 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26  n && azArg[i] &&
cbf0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
cc00: 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20  g[i])>w ){.     
cc10: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
cc20: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  har(azArg[i]);. 
cc30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cc40: 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e   if( i==1 && p->
cc50: 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70  aiIndent && p->p
cc60: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
cc70: 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74    if( p->iIndent
cc80: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20  <p->nIndent ){. 
cc90: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
cca0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ccb0: 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65  %*.s", p->aiInde
ccc0: 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20  nt[p->iIndent], 
ccd0: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "");.          }
cce0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49  .          p->iI
ccf0: 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ndent++;.       
cd00: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
cd10: 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f  width_print(p->o
cd20: 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20  ut, w, azArg[i] 
cd30: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
cd40: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
cd50: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
cd60: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
cd70: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
cd80: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
cd90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
cda0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
cdb0: 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20  DE_Semi: {   /* 
cdc0: 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c  .schema and .ful
cdd0: 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a  lschema output *
cde0: 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68  /.      printSch
cdf0: 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
ce00: 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29  azArg[0], ";\n")
ce10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ce20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
ce30: 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a  DE_Pretty: {  /*
ce40: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
ce50: 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d  llschema with --
ce60: 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  indent */.      
ce70: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
ce80: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt j;.      int 
ce90: 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nParen = 0;.    
cea0: 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b    char cEnd = 0;
ceb0: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
cec0: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d       int nLine =
ced0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
cee0: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
cef0: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d     if( azArg[0]=
cf00: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
cf10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
cf20: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56 49  rlike("CREATE VI
cf30: 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  EW%", azArg[0], 
cf40: 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  0)==0.       || 
cf50: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
cf60: 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c 20  "CREATE TRIG%", 
cf70: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
cf80: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
cf90: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
cfa0: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a  out, "%s;\n", az
cfb0: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
cfc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
cfd0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
cfe0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
cff0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
d000: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   j = 0;.      fo
d010: 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a  r(i=0; IsSpace(z
d020: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
d030: 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b     for(; (c = z[
d040: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
d050: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
d060: 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e(c) ){.        
d070: 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c    if( z[j-1]=='\
d080: 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c  r' ) z[j-1] = '\
d090: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n';.          if
d0a0: 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  ( IsSpace(z[j-1]
d0b0: 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27  ) || z[j-1]=='('
d0c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d0d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
d0e0: 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27  c=='(' || c==')'
d0f0: 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70  ) && j>0 && IsSp
d100: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20  ace(z[j-1]) ){. 
d110: 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20           j--;.  
d120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d130: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  z[j++] = c;.    
d140: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
d150: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
d160: 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20  z[j-1]) ){ j--; 
d170: 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30  }.      z[j] = 0
d180: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  ;.      if( strl
d190: 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20  en30(z)>=79 ){. 
d1a0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30         for(i=j=0
d1b0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
d1c0: 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20   i++){  /* Copy 
d1d0: 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69  changes from z[i
d1e0: 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a  ] back to z[j] *
d1f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
d200: 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20  c==cEnd ){.     
d210: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b         cEnd = 0;
d220: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d230: 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63   if( c=='"' || c
d240: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27  =='\'' || c=='`'
d250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d260: 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20  cEnd = c;.      
d270: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d280: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
d290: 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a      cEnd = ']';.
d2a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
d2b0: 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b  if( c=='-' && z[
d2c0: 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  i+1]=='-' ){.   
d2d0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
d2e0: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
d2f0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27  }else if( c=='('
d300: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d310: 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  nParen++;.      
d320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d330: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
d340: 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20      nParen--;.  
d350: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c            if( nL
d360: 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d  ine>0 && nParen=
d370: 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20  =0 && j>0 ){.   
d380: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
d390: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f  SchemaLineN(p->o
d3a0: 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b  ut, z, j, "\n");
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
d3c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d3d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
d3e0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
d3f0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
d400: 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26  if( nParen==1 &&
d410: 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20   cEnd==0.       
d420: 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c      && (c=='(' |
d430: 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d  | c=='\n' || (c=
d440: 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c  =',' && !wsToEol
d450: 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20  (z+i+1))).      
d460: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
d470: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
d480: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20   j--;.          
d490: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d4a0: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
d4b0: 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20   "\n  ");.      
d4c0: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
d4d0: 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b           nLine++
d4e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
d4f0: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69  ile( IsSpace(z[i
d500: 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20  +1]) ){ i++; }. 
d510: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
d530: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
d540: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
d550: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  Line(p->out, z, 
d560: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  ";\n");.      sq
d570: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
d580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d590: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d5a0: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
d5b0: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
d5c0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
d5d0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d5e0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d5f0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
d600: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
d610: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  s%s",azCol[i],. 
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e   i==nArg-1 ? p->
d640: 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70  rowSeparator : p
d650: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
d660: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d670: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
d680: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
d690: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d6a0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
d6b0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
d6c0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
d6d0: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
d6e0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20  ->nullValue;.   
d6f0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d700: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
d710: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d720: 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20  <nArg-1 ){.     
d730: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d740: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d750: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
d760: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d770: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
d780: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d790: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
d7a0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
d7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d7d0: 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b  ase MODE_Html: {
d7e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
d7f0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
d800: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
d810: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
d820: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
d830: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d840: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
d850: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
d860: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
d870: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
d880: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
d890: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
d8a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
d8b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
d8c0: 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TH>\n");.      
d8d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
d8e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
d8f0: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
d900: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
d910: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
d920: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
d930: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
d940: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d950: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
d960: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
d970: 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20  ->out,"<TD>");. 
d980: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
d990: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
d9a0: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
d9b0: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
d9c0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72  alue);.        r
d9d0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
d9e0: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
d9f0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
da00: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
da10: 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  TR>\n");.      b
da20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
da30: 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b  case MODE_Tcl: {
da40: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
da50: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
da60: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
da70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
da80: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
da90: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
daa0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c  ing(p->out,azCol
dab0: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
dac0: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
dad0: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
dae0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
daf0: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
db00: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
db10: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
db20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
db30: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
db40: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
db50: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
db60: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
db70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
db80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
db90: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
dba0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
dbb0: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
dbc0: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
dbd0: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
dbe0: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
dbf0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
dc00: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
dc10: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
dc20: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
dc30: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
dc40: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
dc50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
dc60: 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a  ase MODE_Csv: {.
dc70: 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
dc80: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
dc90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
dca0: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
dcb0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
dcc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
dcd0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
dce0: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
dcf0: 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f   azCol[i] ? azCo
dd00: 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72  l[i] : "", i<nAr
dd10: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
dd20: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
dd30: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
dd40: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
dd50: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
dd60: 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a    if( nArg>0 ){.
dd70: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
dd80: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
dd90: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
dda0: 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  csv(p, azArg[i],
ddb0: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
ddc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
ddd0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
dde0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
ddf0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
de00: 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74 4d  }.      setTextM
de10: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
de20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
de30: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
de40: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
de50: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
de60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66  break;.      utf
de70: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
de80: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22  "INSERT INTO %s"
de90: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
dea0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
deb0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
dec0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ded0: 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20  ->out,"(");.    
dee0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
def0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
df00: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
df10: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
df20: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
df30: 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72 28    if( quoteChar(
df40: 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20  azCol[i]) ){.   
df50: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
df60: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
df70: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43  tf("\"%w\"", azC
df80: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
df90: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
dfa0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
dfb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
dfc0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
dfd0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
dff0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e000: 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  %s", azCol[i]);.
e010: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e030: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e040: 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
e050: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
e060: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e070: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e080: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e090: 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20  >out, i>0 ? "," 
e0a0: 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20  : " VALUES(");. 
e0b0: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
e0c0: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
e0d0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
e0e0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
e0f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e100: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e110: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
e120: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
e130: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
e140: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
e150: 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65 6c          if( Shel
e160: 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
e170: 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20  G_Newlines) ){. 
e180: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
e190: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
e1a0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e1d0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
e1e0: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
e1f0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e200: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e210: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
e220: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
e230: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
e240: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
e250: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e260: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
e270: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e280: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
e290: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
e2a0: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
e2b0: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
e2c0: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
e2d0: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
e2e0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
e2f0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
e300: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e310: 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67  ntf(50,z,"%!.20g
e320: 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ", r);.         
e330: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e340: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
e350: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e360: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
e370: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
e380: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
e390: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
e3a0: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
e3b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
e3c0: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
e3d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
e3e0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
e3f0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
e400: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
e410: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
e420: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
e430: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
e440: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
e450: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
e460: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
e470: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e480: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
e490: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e4a0: 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61   if( ShellHasFla
e4b0: 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
e4c0: 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nes) ){.        
e4d0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
e4e0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
e4f0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
e500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e510: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
e520: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
e530: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e550: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
e560: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b  rintf(p->out,");
e570: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
e580: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e590: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a  e MODE_Quote: {.
e5a0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
e5b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e5c0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20    if( p->cnt==0 
e5d0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e5f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e610: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
e620: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
e630: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e640: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
e650: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
e660: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e670: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e680: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
e690: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e     }.      p->cn
e6a0: 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t++;.      for(i
e6b0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e6c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
e6d0: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
e6e0: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
e6f0: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
e700: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
e710: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e720: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
e730: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
e740: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
e750: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
e760: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
e770: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
e780: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
e790: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
e7a0: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
e7b0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
e7c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e7d0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
e7e0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
e7f0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
e800: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e810: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
e820: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
e830: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
e840: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
e850: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
e860: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
e870: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
e880: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
e890: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
e8a0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
e8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
e8c0: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
e8d0: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
e8e0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e8f0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
e900: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e910: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
e920: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
e930: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
e940: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
e950: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
e960: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
e970: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
e980: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
e990: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
e9a0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
e9b0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
e9c0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
e9d0: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
e9e0: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
e9f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
ea00: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
ea10: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
ea20: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ea30: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
ea40: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
ea50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  se{.          ou
ea60: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
ea70: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
ea80: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
ea90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
eaa0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
eab0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  "\n");.      bre
eac0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ead0: 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b  se MODE_Ascii: {
eae0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
eaf0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
eb00: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
eb10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
eb20: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
eb30: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
eb40: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eb50: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
eb60: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
eb70: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
eb80: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f  p->out,"%s",azCo
eb90: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
eba0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  : "");.        }
ebb0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
ebc0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ebd0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
ebe0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ebf0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
ec00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
ec10: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
ec20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
ec30: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
ec40: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
ec50: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
ec60: 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  r);.        utf8
ec70: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ec80: 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61  %s",azArg[i] ? a
ec90: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
eca0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d  lValue);.      }
ecb0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
ecc0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
ecd0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
ece0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ecf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
ed00: 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20  ODE_EQP: {.     
ed10: 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20 61   eqp_append(p, a
ed20: 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61  toi(azArg[0]), a
ed30: 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61  toi(azArg[1]), a
ed40: 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20  zArg[3]);.      
ed50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
ed60: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ed70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
ed80: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
ed90: 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69  ne that the SQLi
eda0: 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e  te library.** in
edb0: 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72  vokes for each r
edc0: 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65  ow of a query re
edd0: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
ede0: 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69  int callback(voi
edf0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
ee00: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
ee10: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a   char **azCol){.
ee20: 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f    /* since we do
ee30: 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e  n't have type in
ee40: 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65  fo, call the she
ee50: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ll_callback with
ee60: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f   a NULL value */
ee70: 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f  .  return shell_
ee80: 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  callback(pArg, n
ee90: 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f  Arg, azArg, azCo
eea0: 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  l, NULL);.}../*.
eeb0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
eec0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
eed0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65  from sqlite3_exe
eee0: 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73  c() that appends
eef0: 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f   all.** output o
ef00: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61  nto the end of a
ef10: 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63   ShellText objec
ef20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ef30: 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61   captureOutputCa
ef40: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
ef50: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
ef60: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
ef70: 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65  **az){.  ShellTe
ef80: 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65  xt *p = (ShellTe
ef90: 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20  xt*)pArg;.  int 
efa0: 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  i;.  UNUSED_PARA
efb0: 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28  METER(az);.  if(
efc0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
efd0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  rn 0;.  if( p->n
efe0: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
eff0: 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28   "|", 0);.  for(
f000: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f010: 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61  ){.    if( i ) a
f020: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22  ppendText(p, ","
f030: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
f040: 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54  Arg[i] ) appendT
f050: 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  ext(p, azArg[i],
f060: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
f070: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
f080: 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70  nerate an approp
f090: 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74  riate SELFTEST t
f0a0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
f0b0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
f0c0: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
f0d0: 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68  SelftestTable(Sh
f0e0: 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
f0f0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
f100: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  0;.  sqlite3_exe
f110: 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41  c(p->db,.    "SA
f120: 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74  VEPOINT selftest
f130: 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43  _init;\n".    "C
f140: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
f150: 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65  OT EXISTS selfte
f160: 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e  st(\n".    "  tn
f170: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
f180: 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54  Y KEY,\n"   /* T
f190: 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  est number */.  
f1a0: 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22    "  op TEXT,\n"
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20     /* Operator: 
f1d0: 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20   memo run */.   
f1e0: 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22   "  cmd TEXT,\n"
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78    /* Command tex
f210: 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20  t */.    "  ans 
f220: 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20  TEXT\n"         
f230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
f240: 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20  ired answer */. 
f250: 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45     ");".    "CRE
f260: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b  ATE TEMP TABLE [
f270: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c  _shell$self](op,
f280: 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20  cmd,ans);\n".   
f290: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
f2a0: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69  shell$self](rowi
f2b0: 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20  d,op,cmd)\n".   
f2c0: 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65   "  VALUES(coale
f2d0: 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78  sce((SELECT (max
f2e0: 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52  (tno)+100)/10 FR
f2f0: 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29  OM selftest),10)
f300: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  ,\n".    "      
f310: 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73     'memo','Tests
f320: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d   generated by --
f330: 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22  init');\n".    "
f340: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
f350: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
f360: 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27   "  SELECT 'run'
f370: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53  ,\n".    "    'S
f380: 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71  ELECT hex(sha3_q
f390: 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79  uery(''SELECT ty
f3a0: 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
f3b0: 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20  ,sql ".         
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
f3e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
f3f0: 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c  R BY 2'',224))',
f400: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78  \n".    "    hex
f410: 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c  (sha3_query('SEL
f420: 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
f430: 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20  l_name,sql ".   
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
f460: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
f470: 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22   BY 2',224));\n"
f480: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
f490: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
f4a0: 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  n".    "  SELECT
f4b0: 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20   'run',".    "  
f4c0: 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68    'SELECT hex(sh
f4d0: 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43  a3_query(''SELEC
f4e0: 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22  T * FROM \"' ||"
f4f0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72  .    "        pr
f500: 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20  intf('%w',name) 
f510: 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58  || '\" NOT INDEX
f520: 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a  ED'',224))',\n".
f530: 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61      "    hex(sha
f540: 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27  3_query(printf('
f550: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
f560: 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44  %w\" NOT INDEXED
f570: 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22  ',name),224))\n"
f580: 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e  .    "  FROM (\n
f590: 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
f5a0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
f5b0: 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20  te_master\n".   
f5c0: 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70   "     WHERE typ
f5d0: 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20  e='table'\n".   
f5e0: 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d   "       AND nam
f5f0: 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22  e<>'selftest'\n"
f600: 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44  .    "       AND
f610: 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
f620: 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22  ge,0)>0\n".    "
f630: 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44    )\n".    " ORD
f640: 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20  ER BY name;\n". 
f650: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
f660: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22  [_shell$self]\n"
f670: 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27  .    "  VALUES('
f680: 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74  run','PRAGMA int
f690: 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f  egrity_check','o
f6a0: 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  k');\n".    "INS
f6b0: 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73  ERT INTO selftes
f6c0: 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73  t(tno,op,cmd,ans
f6d0: 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  )".    "  SELECT
f6e0: 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64   rowid*10,op,cmd
f6f0: 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c  ,ans FROM [_shel
f700: 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20  l$self];\n".    
f710: 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68  "DROP TABLE [_sh
f720: 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20  ell$self];".    
f730: 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a  ,0,0,&zErrMsg);.
f740: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
f750: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
f760: 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45  (stderr, "SELFTE
f770: 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ST initializatio
f780: 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22  n failure: %s\n"
f790: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
f7a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
f7b0: 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rMsg);.  }.  sql
f7c0: 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
f7d0: 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65   "RELEASE selfte
f7e0: 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b  st_init",0,0,0);
f7f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
f800: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
f810: 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68  able field of th
f820: 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72  e ShellState str
f830: 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65  ucture to.** the
f840: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
f850: 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70  le given.  Escap
f860: 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72  e any quote char
f870: 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a  acters in the.**
f880: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a   table name..*/.
f890: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f  static void set_
f8a0: 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c  table_name(Shell
f8b0: 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
f8c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
f8d0: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72  int i, n;.  char
f8e0: 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20   cQuote;.  char 
f8f0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44  *z;..  if( p->zD
f900: 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  estTable ){.    
f910: 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62  free(p->zDestTab
f920: 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  le);.    p->zDes
f930: 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  tTable = 0;.  }.
f940: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
f950: 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74   return;.  cQuot
f960: 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e  e = quoteChar(zN
f970: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c  ame);.  n = strl
f980: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  en30(zName);.  i
f990: 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d  f( cQuote ) n +=
f9a0: 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a   n+2;.  z = p->z
f9b0: 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c  DestTable = mall
f9c0: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
f9d0: 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75   z==0 ) shell_ou
f9e0: 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
f9f0: 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51   n = 0;.  if( cQ
fa00: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
fa10: 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d  cQuote;.  for(i=
fa20: 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b  0; zName[i]; i++
fa30: 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20  ){.    z[n++] = 
fa40: 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66  zName[i];.    if
fa50: 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f  ( zName[i]==cQuo
fa60: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
fa70: 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  uote;.  }.  if( 
fa80: 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
fa90: 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d  = cQuote;.  z[n]
faa0: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
fab0: 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20  Execute a query 
fac0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
fad0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c  ill generate SQL
fae0: 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a   output.  Print.
faf0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
fb00: 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70  lumns, comma-sep
fb10: 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e  arated, on a lin
fb20: 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61  e and then add a
fb30: 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  .** semicolon te
fb40: 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20  rminator to the 
fb50: 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65  end of that line
fb60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
fb70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fb80: 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63   is 1 and that c
fb90: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
fba0: 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e  ext "--".** then
fbb0: 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63   write the semic
fbc0: 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61  olon on a separa
fbd0: 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77  te line.  That w
fbe0: 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22  ay, if a.** "--"
fbf0: 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20   comment occurs 
fc00: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
fc10: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
fc20: 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27   comment.** won'
fc30: 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65  t consume the se
fc40: 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
fc50: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
fc60: 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70  t run_table_dump
fc70: 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53  _query(.  ShellS
fc80: 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tate *p,        
fc90: 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74     /* Query cont
fca0: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
fcb0: 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20  har *zSelect,   
fcc0: 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
fcd0: 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74  ement to extract
fce0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f   content */.  co
fcf0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74  nst char *zFirst
fd00: 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20  Row    /* Print 
fd10: 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77  before first row
fd20: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
fd30: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
fd40: 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69  mt *pSelect;.  i
fd50: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65  nt rc;.  int nRe
fd60: 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  sult;.  int i;. 
fd70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
fd80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
fd90: 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
fda0: 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70   zSelect, -1, &p
fdb0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
fdc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fdd0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20  || !pSelect ){. 
fde0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
fdf0: 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
fe00: 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
fe10: 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20  **/\n", rc,.    
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
fe30: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
fe40: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
fe50: 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
fe60: 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
fe70: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  +;.    return rc
fe80: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
fe90: 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
fea0: 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20  t);.  nResult = 
feb0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
fec0: 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  ount(pSelect);. 
fed0: 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
fee0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66  TE_ROW ){.    if
fef0: 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20  ( zFirstRow ){. 
ff00: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ff10: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
ff20: 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20  FirstRow);.     
ff30: 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a   zFirstRow = 0;.
ff40: 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63      }.    z = (c
ff50: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
ff60: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
ff70: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
ff80: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ff90: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
ffa0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65    for(i=1; i<nRe
ffb0: 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sult; i++){.    
ffc0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
ffd0: 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c  >out, ",%s", sql
ffe0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
fff0: 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20  (pSelect, i));. 
10000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d     }.    if( z==
10010 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20  0 ) z = "";.    
10020 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28  while( z[0] && (
10030 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31  z[0]!='-' || z[1
10040 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20  ]!='-') ) z++;. 
10050 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20     if( z[0] ){. 
10060 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
10070 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29  p->out, "\n;\n")
10080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10090 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
100a0 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  >out, ";\n");.  
100b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
100c0 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
100d0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
100e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
100f0 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
10100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10110 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10120 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20  (p->out, "/**** 
10130 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a  ERROR: (%d) %s *
10140 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20  ****/\n", rc,.  
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10160 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
10170 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72  db));.    if( (r
10180 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f  c&0xff)!=SQLITE_
10190 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72  CORRUPT ) p->nEr
101a0 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
101b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
101c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e  llocate space an
101d0 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65  d save off curre
101e0 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e  nt error string.
101f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
10200 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20  *save_err_msg(. 
10210 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20   sqlite3 *db    
10220 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10230 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
10240 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67  ){.  int nErrMsg
10250 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71   = 1+strlen30(sq
10260 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
10270 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  );.  char *zErrM
10280 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  sg = sqlite3_mal
10290 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a  loc64(nErrMsg);.
102a0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
102b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72  .    memcpy(zErr
102c0 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Msg, sqlite3_err
102d0 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67  msg(db), nErrMsg
102e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
102f0 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64  zErrMsg;.}..#ifd
10300 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a  ef __linux__./*.
10310 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69  ** Attempt to di
10320 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20  splay I/O stats 
10330 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f  on Linux using /
10340 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73  proc/PID/io.*/.s
10350 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
10360 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46  ayLinuxIoStats(F
10370 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c  ILE *out){.  FIL
10380 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b  E *in;.  char z[
10390 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  200];.  sqlite3_
103a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
103b0 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64  z), z, "/proc/%d
103c0 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b  /io", getpid());
103d0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c  .  in = fopen(z,
103e0 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e   "rb");.  if( in
103f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10400 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20  while( fgets(z, 
10410 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d  sizeof(z), in)!=
10420 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
10430 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
10440 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10450 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20  *zPattern;.     
10460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
10470 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73  sc;.    } aTrans
10480 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
10490 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  rchar: ",       
104a0 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
104b0 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65  s received by re
104c0 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20  ad():" },.      
104d0 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20  { "wchar: ",    
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
104f0 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69  ytes sent to wri
10500 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20  te():"    },.   
10510 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20     { "syscr: ", 
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20   "Read() system 
10540 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a  calls:"      },.
10550 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20        { "syscw: 
10560 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
10570 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73      "Write() sys
10580 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20  tem calls:"     
10590 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64  },.      { "read
105a0 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20  _bytes: ",      
105b0 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65         "Bytes re
105c0 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a  ad from storage:
105d0 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77  "  },.      { "w
105e0 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
105f0 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
10600 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72   written to stor
10610 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  age:" },.      {
10620 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74   "cancelled_writ
10630 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61  e_bytes: ",  "Ca
10640 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79  ncelled write by
10650 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  tes:"    },.    
10660 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  };.    int i;.  
10670 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
10680 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20  aySize(aTrans); 
10690 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
106a0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72  n = strlen30(aTr
106b0 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29  ans[i].zPattern)
106c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
106d0 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  cmp(aTrans[i].zP
106e0 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30  attern, z, n)==0
106f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
10700 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
10710 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b  36s %s", aTrans[
10720 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29  i].zDesc, &z[n])
10730 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
10740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10750 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
10760 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10770 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c   Display a singl
10780 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73  e line of status
10790 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61   using 64-bit va
107a0 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
107b0 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74  void displayStat
107c0 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61  Line(.  ShellSta
107d0 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
107e0 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63    /* The shell c
107f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72  ontext */.  char
10800 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20   *zLabel,       
10810 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
10820 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65  or this one line
10830 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72   */.  char *zFor
10840 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mat,            
10850 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68  /* Format for th
10860 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e  e result */.  in
10870 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20  t iStatusCtrl,  
10880 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
10890 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c   status to displ
108a0 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73  ay */.  int bRes
108b0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
108c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
108d0 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a  et the stats */.
108e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
108f0 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20  64 iCur = -1;.  
10900 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48  sqlite3_int64 iH
10910 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  iwtr = -1;.  int
10920 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20   i, nPercent;.  
10930 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b  char zLine[200];
10940 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
10950 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c  s64(iStatusCtrl,
10960 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
10970 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28   bReset);.  for(
10980 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b  i=0, nPercent=0;
10990 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b   zFormat[i]; i++
109a0 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d  ){.    if( zForm
109b0 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65  at[i]=='%' ) nPe
109c0 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  rcent++;.  }.  i
109d0 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b  f( nPercent>1 ){
109e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
109f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
10a00 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72  ne), zLine, zFor
10a10 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74  mat, iCur, iHiwt
10a20 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
10a30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10a40 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  f(sizeof(zLine),
10a50 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c   zLine, zFormat,
10a60 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20   iHiwtr);.  }.  
10a70 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10a80 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
10a90 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b   zLabel, zLine);
10aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
10ab0 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a  y memory stats..
10ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
10ad0 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73  splay_stats(.  s
10ae0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
10af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10b00 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
10b10 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
10b20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
10b30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
10b40 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69  hellState */.  i
10b50 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20  nt bReset       
10b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
10b70 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ue to reset the 
10b80 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  stats */.){.  in
10b90 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48  t iCur;.  int iH
10ba0 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75  iwtr;.  FILE *ou
10bb0 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30  t;.  if( pArg==0
10bc0 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30   || pArg->out==0
10bd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f   ) return 0;.  o
10be0 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a  ut = pArg->out;.
10bf0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
10c00 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61  mt && (pArg->sta
10c10 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20  tsOn & 2) ){.   
10c20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b   int nCol, i, x;
10c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
10c40 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d  t *pStmt = pArg-
10c50 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72  >pStmt;.    char
10c60 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f   z[100];.    nCo
10c70 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
10c80 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
10c90 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
10ca0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e  out, "%-36s %d\n
10cb0 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75  ", "Number of ou
10cc0 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20  tput columns:", 
10cd0 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  nCol);.    for(i
10ce0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
10cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
10d00 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10d10 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20  z),z,"Column %d 
10d20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29  %nname:", i, &x)
10d30 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
10d40 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10d50 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
10d60 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
10d70 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66  tmt,i));.#ifndef
10d80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
10d90 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69  LTYPE.      sqli
10da0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
10db0 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20   z+x, "declared 
10dc0 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  type:");.      u
10dd0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
10de0 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
10df0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10e00 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20  decltype(pStmt, 
10e10 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  i));.#endif.#ifd
10e20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10e30 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
10e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
10e50 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
10e60 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a   "database name:
10e70 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
10e80 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
10e90 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
10ea0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
10eb0 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ase_name(pStmt,i
10ec0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10ed0 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
10ee0 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a  +x, "table name:
10ef0 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
10f00 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
10f10 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
10f20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
10f30 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
10f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
10f50 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
10f60 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29   "origin name:")
10f70 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
10f80 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10f90 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
10fa0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
10fb0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
10fc0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
10fd0 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  ..  displayStatL
10fe0 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72  ine(pArg, "Memor
10ff0 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22  y Used:",.     "
11000 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
11010 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11020 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
11030 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  D, bReset);.  di
11040 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11050 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  rg, "Number of O
11060 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
11070 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22  ations:",.     "
11080 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
11090 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
110a0 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52  MALLOC_COUNT, bR
110b0 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72  eset);.  if( pAr
110c0 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
110d0 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29  HFLG_Pagecache )
110e0 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  {.    displaySta
110f0 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
11100 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61  ber of Pcache Pa
11110 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20  ges Used:",.    
11120 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11130 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49  ld) pages", SQLI
11140 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11150 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74  CHE_USED, bReset
11160 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79  );.  }.  display
11170 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11180 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
11190 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
111a0 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
111b0 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c  ax %lld) bytes",
111c0 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
111d0 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f  AGECACHE_OVERFLO
111e0 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  W, bReset);.  di
111f0 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11200 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c  rg, "Largest All
11210 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
11220 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
11230 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
11240 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  OC_SIZE, bReset)
11250 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  ;.  displayStatL
11260 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65  ine(pArg, "Large
11270 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61  st Pcache Alloca
11280 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tion:",.     "%l
11290 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
112a0 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
112b0 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  HE_SIZE, bReset)
112c0 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b  ;.#ifdef YYTRACK
112d0 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20  MAXSTACKDEPTH.  
112e0 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
112f0 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50  pArg, "Deepest P
11300 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20  arser Stack:",. 
11310 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11320 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54  lld)", SQLITE_ST
11330 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43  ATUS_PARSER_STAC
11340 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64  K, bReset);.#end
11350 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  if..  if( db ){.
11360 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
11370 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
11380 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20  Lookaside ){.   
11390 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
113a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
113b0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
113c0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
113d0 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
113e0 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
113f0 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
11400 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
11410 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
11420 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
11440 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55  ookaside Slots U
11450 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
11460 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
11470 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11480 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
11490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
114a0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
114b0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
114c0 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20  KASIDE_HIT,.    
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
114f0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11500 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11510 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73  rg->out, "Succes
11520 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61  sful lookaside a
11530 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25  ttempts:       %
11540 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
11550 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
11560 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
11570 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
11580 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
11590 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20  DE_MISS_SIZE,.  
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
115c0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
115d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
115e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
115f0 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
11600 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
11610 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
11620 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
11630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
11640 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11650 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
11660 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a  SIDE_MISS_FULL,.
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
11690 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
116a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
116b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
116c0 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73  okaside failures
116d0 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20   due to OOM:    
116e0 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
116f0 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
11700 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74  .    }.    iHiwt
11710 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
11720 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
11730 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
11740 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55  DBSTATUS_CACHE_U
11750 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
11760 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
11770 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11780 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48  g->out, "Pager H
11790 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
117b0 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
117c0 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
117d0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
117e0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
117f0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11800 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11810 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72  CACHE_HIT, &iCur
11820 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
11830 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11840 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
11850 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
11870 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
11880 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11890 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
118a0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
118b0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
118c0 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72  ACHE_MISS, &iCur
118d0 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
118e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
118f0 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
11900 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20  ache misses:    
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
11920 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
11930 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11940 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
11950 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11960 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
11970 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75  ACHE_WRITE, &iCu
11980 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
11990 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
119a0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
119b0 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
119e0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
119f0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
11a00 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11a10 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11a20 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43  CACHE_SPILL, &iC
11a30 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
11a40 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
11a50 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
11a60 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20   cache spills:  
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
11a90 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
11aa0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
11ab0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
11ac0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
11ad0 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69  _SCHEMA_USED, &i
11ae0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
11af0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
11b00 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11b10 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73   "Schema Heap Us
11b20 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
11b30 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
11b40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11b50 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
11b60 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
11b70 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
11b80 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
11b90 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53  DBSTATUS_STMT_US
11ba0 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
11bb0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11bc0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11bd0 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e  ->out, "Statemen
11be0 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65  t Heap/Lookaside
11bf0 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20   Usage:      %d 
11c00 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
11c10 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d        iCur);.  }
11c20 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
11c30 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20  tmt ){.    iCur 
11c40 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
11c50 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
11c60 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
11c70 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
11c80 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EP,.            
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20     bReset);.    
11cb0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11cc0 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20  >out, "Fullscan 
11cd0 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11cf0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
11d00 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
11d10 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
11d20 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
11d30 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52  TSTATUS_SORT, bR
11d40 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
11d50 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11d60 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e   "Sort Operation
11d70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
11d80 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
11d90 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
11da0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
11db0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
11dc0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
11dd0 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65  US_AUTOINDEX,bRe
11de0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
11df0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11e00 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72  "Autoindex Inser
11e10 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
11e20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
11e30 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
11e40 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
11e50 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
11e60 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
11e70 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65  S_VM_STEP, bRese
11e80 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11e90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56  tf(pArg->out, "V
11ea0 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53  irtual Machine S
11eb0 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
11ec0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
11ed0 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
11ee0 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
11ef0 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
11f00 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
11f10 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65  REPREPARE, bRese
11f20 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11f30 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52  tf(pArg->out, "R
11f40 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69  eprepare operati
11f50 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  ons:            
11f60 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
11f70 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
11f80 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
11f90 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
11fa0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
11fb0 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  RUN, bReset);.  
11fc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11fd0 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20  g->out, "Number 
11fe0 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20  of times run:   
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12000 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12010 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12020 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
12030 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
12040 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45  TMTSTATUS_MEMUSE
12050 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  D, bReset);.    
12060 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12070 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73  >out, "Memory us
12080 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73  ed by prepared s
12090 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e  tmt:        %d\n
120a0 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23  ", iCur);.  }..#
120b0 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
120c0 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f    displayLinuxIo
120d0 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29  Stats(pArg->out)
120e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
120f0 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69  o not remove thi
12100 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62  s machine readab
12110 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72  le comment: extr
12120 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68  a-stats-output-h
12130 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ere */..  return
12140 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
12150 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e  play scan stats.
12160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12170 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74  display_scanstat
12180 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
12190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
121a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
121b0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
121c0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20  hellState *pArg 
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
121e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
121f0 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69  llState */.){.#i
12200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
12210 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
12220 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  TUS.  UNUSED_PAR
12230 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
12240 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12250 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Arg);.#else.  in
12260 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20  t i, k, n, mx;. 
12270 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12280 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
12290 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d   scanstats -----
122a0 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20  ---\n");.  mx = 
122b0 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  0;.  for(k=0; k<
122c0 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64  =mx; k++){.    d
122d0 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d  ouble rEstLoop =
122e0 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   1.0;.    for(i=
122f0 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20  n=0; 1; i++){.  
12300 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12310 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d   *p = pArg->pStm
12320 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
12330 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56  _int64 nLoop, nV
12340 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62  isit;.      doub
12350 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69  le rEst;.      i
12360 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63  nt iSid;.      c
12370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c  onst char *zExpl
12380 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ain;.      if( s
12390 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
123a0 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
123b0 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f  ITE_SCANSTAT_NLO
123c0 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f  OP, (void*)&nLoo
123d0 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  p) ){.        br
123e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
123f0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
12400 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
12410 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
12420 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64  _SELECTID, (void
12430 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20  *)&iSid);.      
12440 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78  if( iSid>mx ) mx
12450 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69   = iSid;.      i
12460 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e  f( iSid!=k ) con
12470 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
12480 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
12490 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75   rEstLoop = (dou
124a0 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20  ble)nLoop;.     
124b0 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77     if( k>0 ) raw
124c0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
124d0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62  t, "-------- sub
124e0 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d  query %d -------
124f0 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d  \n", k);.      }
12500 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
12510 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
12520 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12530 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12540 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26  NVISIT, (void*)&
12550 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73  nVisit);.      s
12560 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
12570 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
12580 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54  ITE_SCANSTAT_EST
12590 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b  , (void*)&rEst);
125a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
125b0 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
125c0 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
125d0 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76  STAT_EXPLAIN, (v
125e0 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b  oid*)&zExplain);
125f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
12600 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12610 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20  oop %2d: %s\n", 
12620 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  n, zExplain);.  
12630 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20      rEstLoop *= 
12640 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f  rEst;.      raw_
12650 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12660 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ,.          "   
12670 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c        nLoop=%-8l
12680 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65  ld nRow=%-8lld e
12690 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74  stRow=%-8lld est
126a0 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22  Row/Loop=%-8g\n"
126b0 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f  ,.          nLoo
126c0 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69  p, nVisit, (sqli
126d0 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c  te3_int64)(rEstL
126e0 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20  oop+0.5), rEst. 
126f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
12700 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  }.  raw_printf(p
12710 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64  ------\n");.#end
12740 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  if.}../*.** Para
12750 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f  meter azArray po
12760 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74  ints to a zero-t
12770 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20  erminated array 
12780 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72  of strings. zStr
12790 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
127a0 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69  single nul-termi
127b0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65  nated string. Re
127c0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
127d0 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61   zStr.** is equa
127e0 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  l, according to 
127f0 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79  strcmp(), to any
12800 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20   of the strings 
12810 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  in the array..**
12820 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
12830 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
12840 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72  ic int str_in_ar
12850 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ray(const char *
12860 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
12870 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69   **azArray){.  i
12880 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
12890 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b   azArray[i]; i++
128a0 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
128b0 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72  rcmp(zStr, azArr
128c0 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20  ay[i]) ) return 
128d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
128e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  0;.}../*.** If c
128f0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
12900 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74  t pSql appears t
12910 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20  o be an EXPLAIN 
12920 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63  statement, alloc
12930 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  ate.** and popul
12940 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61  ate the ShellSta
12950 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72  te.aiIndent[] ar
12960 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ray with the num
12970 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73  ber of.** spaces
12980 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f   each opcode sho
12990 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20  uld be indented 
129a0 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74  before it is out
129b0 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  put..**.** The i
129c0 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61  ndenting rules a
129d0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  re:.**.**     * 
129e0 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c  For each "Next",
129f0 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22   "Prev", "VNext"
12a00 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74   or "VPrev" inst
12a10 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a  ruction, indent.
12a20 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63  **       all opc
12a30 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  odes that occur 
12a40 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a  between the p2 j
12a50 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
12a60 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a  and the opcode.*
12a70 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62  *       itself b
12a80 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a  y 2 spaces..**.*
12a90 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68  *     * For each
12aa0 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20   "Goto", if the 
12ab0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
12ac0 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74   is earlier in t
12ad0 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20  he program.**   
12ae0 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20      and ends on 
12af0 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20  one of:.**      
12b00 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47      Yield  SeekG
12b10 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65  t  SeekLt  RowSe
12b20 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a  tRead  Rewind.**
12b30 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65         or if the
12b40 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
12b50 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20   one instead of 
12b60 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74  zero,.**       t
12b70 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f  hen indent all o
12b80 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74  pcodes between t
12b90 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72  he earlier instr
12ba0 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  uction.**       
12bb0 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20  and "Goto" by 2 
12bc0 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
12bd0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64  c void explain_d
12be0 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c  ata_prepare(Shel
12bf0 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74  lState *p, sqlit
12c00 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a  e3_stmt *pSql){.
12c10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
12c20 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
12c30 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66    /* The text of
12c40 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
12c50 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
12c60 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
12c70 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
12c80 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  to check if this
12c90 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a   is an EXPLAIN *
12ca0 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64  /.  int *abYield
12cb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12cc0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
12cd0 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64  p is an OP_Yield
12ce0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
12cf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12d00 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
12d10 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69  ed size of p->ai
12d20 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c  Indent[], abYiel
12d30 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20  d */.  int iOp; 
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12d60 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  of operation in 
12d70 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f  p->aiIndent[] */
12d80 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
12d90 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65  azNext[] = { "Ne
12da0 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50  xt", "Prev", "VP
12db0 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22  rev", "VNext", "
12dc0 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20 20 20  SorterNext",.   
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 20 20 22 4e 65 78 74 49 66 4f          "NextIfO
12df0 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f 70 65  pen", "PrevIfOpe
12e00 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74  n", 0 };.  const
12e10 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d   char *azYield[]
12e20 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53   = { "Yield", "S
12e30 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54 22  eekLT", "SeekGT"
12e40 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22 2c 0a  , "RowSetRead",.
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e60 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65 77              "Rew
12e70 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  ind", 0 };.  con
12e80 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b  st char *azGoto[
12e90 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20  ] = { "Goto", 0 
12ea0 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  };..  /* Try to 
12eb0 66 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68  figure out if th
12ec0 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  is is really an 
12ed0 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e  EXPLAIN statemen
12ee0 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a 2a 20  t. If this.  ** 
12ef0 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69 66 69  cannot be verifi
12f00 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  ed, return early
12f10 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
12f20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
12f30 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20  (pSql)!=8 ){.   
12f40 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
12f50 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ode;.    return;
12f60 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71  .  }.  zSql = sq
12f70 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b  lite3_sql(pSql);
12f80 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
12f90 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a   return;.  for(z
12fa0 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c  =zSql; *z==' ' |
12fb0 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a  | *z=='\t' || *z
12fc0 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\n' || *z=='\
12fd0 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20  f' || *z=='\r'; 
12fe0 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  z++);.  if( sqli
12ff0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20  te3_strnicmp(z, 
13000 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b  "explain", 7) ){
13010 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
13020 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74  p->mode;.    ret
13030 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  urn;.  }..  for(
13040 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f  iOp=0; SQLITE_RO
13050 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
13060 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20  pSql); iOp++){. 
13070 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
13080 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
13090 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
130a0 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  l, 0);.    const
130b0 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f   char *zOp = (co
130c0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
130d0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
130e0 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ql, 1);..    /* 
130f0 53 65 74 20 70 32 20 74 6f 20 74 68 65 20 50 32  Set p2 to the P2
13100 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
13110 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68  rrent opcode. Th
13120 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  en, assuming tha
13130 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73 20 61  t.    ** p2 is a
13140 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  n instruction ad
13150 64 72 65 73 73 2c 20 73 65 74 20 76 61 72 69 61  dress, set varia
13160 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68 65 20  ble p2op to the 
13170 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a 20 20  index of that.  
13180 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
13190 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65 6e 74   in the aiIndent
131a0 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61 6e 64  [] array. p2 and
131b0 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64 69 66   p2op may be dif
131c0 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a  ferent if.    **
131d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 73   the current ins
131e0 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61 72 74  truction is part
131f0 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67 72 61   of a sub-progra
13200 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  m generated by a
13210 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74 72 69  n.    ** SQL tri
13220 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67 6e 20  gger or foreign 
13230 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74  key.  */.    int
13240 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   p2 = sqlite3_co
13250 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33  lumn_int(pSql, 3
13260 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f 70 20  );.    int p2op 
13270 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69 41 64  = (p2 + (iOp-iAd
13280 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72  dr));..    /* Gr
13290 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e 64 65  ow the p->aiInde
132a0 6e 74 20 61 72 72 61 79 20 61 73 20 72 65 71 75  nt array as requ
132b0 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ired */.    if( 
132c0 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  iOp>=nAlloc ){. 
132d0 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d 30 20       if( iOp==0 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ){.        /* Do
132f0 20 66 75 72 74 68 65 72 20 76 65 72 66 69 63 61   further verfica
13300 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73 20 69  tion that this i
13310 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70 75 74  s explain output
13320 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20 20 20  .  Abort if.    
13330 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
13340 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74   */.        stat
13350 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65  ic const char *e
13360 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b  xplainCols[] = {
13370 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 64 64  .           "add
13380 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70  r", "opcode", "p
13390 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20  1", "p2", "p3", 
133a0 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d  "p4", "p5", "com
133b0 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20 20  ment" };.       
133c0 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20   int jj;.       
133d0 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72   for(jj=0; jj<Ar
133e0 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69 6e 43  raySize(explainC
133f0 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  ols); jj++){.   
13400 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
13410 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  p(sqlite3_column
13420 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65  _name(pSql,jj),e
13430 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21  xplainCols[jj])!
13440 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13450 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
13460 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
13470 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
13480 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pSql);.         
13490 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
134a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
134b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
134c0 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20  Alloc += 100;.  
134d0 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20      p->aiIndent 
134e0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
134f0 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49  realloc64(p->aiI
13500 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69  ndent, nAlloc*si
13510 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
13520 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74    abYield = (int
13530 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
13540 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c  c64(abYield, nAl
13550 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
13560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69  ;.    }.    abYi
13570 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69  eld[iOp] = str_i
13580 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59  n_array(zOp, azY
13590 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69  ield);.    p->ai
135a0 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b  Indent[iOp] = 0;
135b0 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20  .    p->nIndent 
135c0 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66  = iOp+1;..    if
135d0 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
135e0 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20  Op, azNext) ){. 
135f0 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b       for(i=p2op;
13600 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e   i<iOp; i++) p->
13610 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32  aiIndent[i] += 2
13620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13630 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
13640 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f  , azGoto) && p2o
13650 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20  p<p->nIndent.   
13660 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32    && (abYield[p2
13670 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63  op] || sqlite3_c
13680 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
13690 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  2)).    ){.     
136a0 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69   for(i=p2op; i<i
136b0 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e  Op; i++) p->aiIn
136c0 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20  dent[i] += 2;.  
136d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49    }.  }..  p->iI
136e0 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c  ndent = 0;.  sql
136f0 69 74 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c  ite3_free(abYiel
13700 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  d);.  sqlite3_re
13710 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a  set(pSql);.}../*
13720 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72 72  .** Free the arr
13730 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ay allocated by 
13740 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
13750 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
13760 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64  c void explain_d
13770 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c  ata_delete(Shell
13780 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c  State *p){.  sql
13790 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49  ite3_free(p->aiI
137a0 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49  ndent);.  p->aiI
137b0 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ndent = 0;.  p->
137c0 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  nIndent = 0;.  p
137d0 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d  ->iIndent = 0;.}
137e0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
137f0 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77 68 65  and restore .whe
13800 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73 65 6c  retrace and .sel
13810 65 63 74 74 72 61 63 65 20 73 65 74 74 69 6e 67  ecttrace setting
13820 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
13830 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
13840 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
13850 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
13860 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74  RACE).extern int
13870 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
13880 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ace;.static int 
13890 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
138a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
138b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
138c0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
138d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
138e0 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  ETRACE).extern i
138f0 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  nt sqlite3WhereT
13900 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74  race;.static int
13910 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65   savedWhereTrace
13920 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ;.#endif.static 
13930 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64 65 62  void disable_deb
13940 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76  ug_trace_modes(v
13950 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  oid){.#if define
13960 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
13970 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
13980 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
13990 52 41 43 45 29 0a 20 20 73 61 76 65 64 53 65 6c  RACE).  savedSel
139a0 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c 69 74  ectTrace = sqlit
139b0 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20  e3SelectTrace;. 
139c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
139d0 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
139e0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
139f0 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
13a00 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
13a10 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20  LE_WHERETRACE). 
13a20 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65   savedWhereTrace
13a30 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 54   = sqlite3WhereT
13a40 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  race;.  sqlite3W
13a50 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23  hereTrace = 0;.#
13a60 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 76  endif.}.static v
13a70 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65 62 75  oid restore_debu
13a80 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f  g_trace_modes(vo
13a90 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
13aa0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13ab0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13ac0 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52  _ENABLE_SELECTTR
13ad0 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 53 65  ACE).  sqlite3Se
13ae0 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61 76 65  lectTrace = save
13af0 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65  dSelectTrace;.#e
13b00 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
13b10 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13b20 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13b30 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
13b40 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57 68 65  CE).  sqlite3Whe
13b50 72 65 54 72 61 63 65 20 3d 20 73 61 76 65 64 57  reTrace = savedW
13b60 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
13b70 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  f.}../*.** Run a
13b80 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
13b90 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
13ba0 69 64 20 65 78 65 63 5f 70 72 65 70 61 72 65 64  id exec_prepared
13bb0 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74  _stmt(.  ShellSt
13bc0 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
13bf0 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
13c00 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
13c10 73 74 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20  stmt *pStmt     
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
13c40 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29  ment to run */.)
13c50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
13c60 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69  * perform the fi
13c70 72 73 74 20 73 74 65 70 2e 20 20 74 68 69 73 20  rst step.  this 
13c80 77 69 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20  will tell us if 
13c90 77 65 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72  we.  ** have a r
13ca0 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74  esult set or not
13cb0 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74   and how wide it
13cc0 20 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d   is..  */.  rc =
13cd0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
13ce0 74 6d 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65  tmt);.  /* if we
13cf0 20 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73   have a result s
13d00 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53  et... */.  if( S
13d10 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
13d20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ){.    /* alloca
13d30 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c  te space for col
13d40 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65   name ptr, value
13d50 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a   ptr, and type *
13d60 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  /.    int nCol =
13d70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13d80 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
13d90 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
13da0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
13db0 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63  (3*nCol*sizeof(c
13dc0 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29  onst char*) + 1)
13dd0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 61 74 61  ;.    if( !pData
13de0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13df0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
13e10 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63  ar **azCols = (c
13e20 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20  har **)pData;   
13e30 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72     /* Names of r
13e40 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
13e50 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  .      char **az
13e60 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e  Vals = &azCols[n
13e70 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52  Col];       /* R
13e80 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
13e90 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28  int *aiTypes = (
13ea0 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43  int *)&azVals[nC
13eb0 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74  ol]; /* Result t
13ec0 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ypes */.      in
13ed0 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73  t i, x;.      as
13ee0 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29  sert(sizeof(int)
13ef0 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20   <= sizeof(char 
13f00 2a 29 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61  *));.      /* sa
13f10 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63  ve off ptrs to c
13f20 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
13f30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13f40 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
13f50 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20      azCols[i] = 
13f60 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
13f70 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
13f80 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, i);.      }. 
13f90 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
13fa0 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20   /* extract the 
13fb0 64 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79  data and data ty
13fc0 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  pes */.        f
13fd0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
13fe0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
13ff0 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d  aiTypes[i] = x =
14000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14010 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  type(pStmt, i);.
14020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3d            if( x=
14030 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
14040 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d  pArg && pArg->cM
14050 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74  ode==MODE_Insert
14060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14070 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a  azVals[i] = "";.
14080 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
14090 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56  .            azV
140a0 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29  als[i] = (char*)
140b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
140c0 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ext(pStmt, i);. 
140d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
140e0 20 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73       if( !azVals
140f0 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b  [i] && (aiTypes[
14100 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]!=SQLITE_NULL)
14110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14120 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14130 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  M;.            b
14140 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f  reak; /* from fo
14150 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  r */.          }
14160 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
14170 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  d for */..      
14180 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64    /* if data and
14190 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64   types extracted
141a0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e   successfully...
141b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
141c0 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
141d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
141e0 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69   call the suppli
141f0 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ed callback with
14200 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20   the result row 
14210 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20  data */.        
14220 20 20 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c    if( shell_call
14230 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c  back(pArg, nCol,
14240 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c   azVals, azCols,
14250 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20   aiTypes) ){.   
14260 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
14270 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
14280 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14290 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
142a0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
142b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
142c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
142d0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
142e0 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20  OW == rc );.    
142f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14300 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
14310 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
14320 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14330 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ABLE./*.** This 
14340 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14350 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51  ed to process SQ
14360 4c 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75  L if the previou
14370 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a  s shell command.
14380 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72 74 22  ** was ".expert"
14390 2e 20 49 74 20 70 61 73 73 65 73 20 74 68 65 20  . It passes the 
143a0 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  SQL in the secon
143b0 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63  d argument direc
143c0 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71  tly to.** the sq
143d0 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65  lite3expert obje
143e0 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ct..**.** If suc
143f0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
14400 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
14410 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
14420 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
14430 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
14440 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
14450 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
14460 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
14470 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
14480 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
14490 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
144a0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
144b0 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
144c0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
144d0 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
144e0 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
144f0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
14500 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 48  atic int expertH
14510 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c  andleSQL(.  Shel
14520 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
14530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14540 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  Sql, .  char **p
14550 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74  zErr.){.  assert
14560 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
14570 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73  .pExpert );.  as
14580 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c  sert( pzErr==0 |
14590 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  | *pzErr==0 );. 
145a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
145b0 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74  expert_sql(pStat
145c0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
145d0 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b  t, zSql, pzErr);
145e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
145f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14600 64 20 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65  d either to sile
14610 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68  ntly clean up th
14620 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61  e object.** crea
14630 74 65 64 20 62 79 20 74 68 65 20 22 2e 65 78 70  ted by the ".exp
14640 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66  ert" command (if
14650 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72   bCancel==1), or
14660 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a   to generate a .
14670 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69  ** report from i
14680 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e  t and then clean
14690 20 69 74 20 75 70 20 28 69 66 20 62 43 61 6e 63   it up (if bCanc
146a0 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  el==0)..**.** If
146b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
146c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
146d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
146e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
146f0 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  * code. In this 
14700 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d  case, (*pzErr) m
14710 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
14720 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
14730 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20  ontaining.** an 
14740 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
14750 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
14760 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
14770 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
14780 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
14790 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69  ntually free thi
147a0 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
147b0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
147c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
147d0 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65  ertFinish(.  She
147e0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
147f0 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a  .  int bCancel,.
14800 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
14810 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14820 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
14830 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74  3expert *p = pSt
14840 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
14850 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ert;.  assert( p
14860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43   );.  assert( bC
14870 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d  ancel || pzErr==
14880 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29  0 || *pzErr==0 )
14890 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d  ;.  if( bCancel=
148a0 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
148b0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
148c0 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62  t;.    int bVerb
148d0 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78  ose = pState->ex
148e0 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a  pert.bVerbose;..
148f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14900 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28  _expert_analyze(
14910 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69  p, pzErr);.    i
14920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14930 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51   ){.      int nQ
14940 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65  uery = sqlite3_e
14950 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a  xpert_count(p);.
14960 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
14970 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
14980 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
14990 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20  t char *zCand = 
149a0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
149b0 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54  eport(p,0,EXPERT
149c0 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54  _REPORT_CANDIDAT
149d0 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ES);.        raw
149e0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
149f0 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d   Candidates ----
14a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20  ---------\n");. 
14a20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
14a30 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  f(out, "%s\n", z
14a40 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cand);.      }. 
14a50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14a60 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20  nQuery; i++){.  
14a70 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14a80 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
14a90 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
14aa0 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
14ab0 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20  RT_SQL);.       
14ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
14ad0 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  x = sqlite3_expe
14ae0 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20  rt_report(p, i, 
14af0 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e  EXPERT_REPORT_IN
14b00 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20  DEXES);.        
14b10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50  const char *zEQP
14b20 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
14b30 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45  t_report(p, i, E
14b40 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41  XPERT_REPORT_PLA
14b50 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  N);.        if( 
14b60 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d  zIdx==0 ) zIdx =
14b70 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65   "(no new indexe
14b80 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69  s)\n";.        i
14b90 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
14ba0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
14bb0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65  ntf(out, "-- Que
14bc0 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ry %d ----------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a  ------\n",i+1);.
14bf0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
14c00 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c  intf(out, "%s\n\
14c10 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
14c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
14c30 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
14c40 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20  \n", zIdx);.    
14c50 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
14c60 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50  ut, "%s\n", zEQP
14c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14c80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65  .  }.  sqlite3_e
14c90 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29  xpert_destroy(p)
14ca0 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65  ;.  pState->expe
14cb0 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a  rt.pExpert = 0;.
14cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14cd0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
14ce0 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74  tion of ".expert
14cf0 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
14d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
14d10 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20  ertDotCommand(. 
14d20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
14d30 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
14d40 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
14d50 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
14d60 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
14d90 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
14da0 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
14db0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14de0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
14df0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  [] */.){.  int r
14e00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14e10 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
14e20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
14e30 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20  iSample = 0;..  
14e40 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
14e50 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
14e60 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
14e70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30  State->expert, 0
14e80 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49  , sizeof(ExpertI
14e90 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  nfo));..  for(i=
14ea0 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
14eb0 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29   && i<nArg; i++)
14ec0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
14ed0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e  azArg[i];.    in
14ee0 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  t n;.    if( z[0
14ef0 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='-' && z[1]==
14f00 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e  '-' ) z++;.    n
14f10 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
14f20 20 20 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20      if( n>=2 && 
14f30 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  0==strncmp(z, "-
14f40 76 65 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a  verbose", n) ){.
14f50 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
14f60 70 65 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20  pert.bVerbose = 
14f70 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
14f80 65 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d  e if( n>=2 && 0=
14f90 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61  =strncmp(z, "-sa
14fa0 6d 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  mple", n) ){.   
14fb0 20 20 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d     if( i==(nArg-
14fc0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  1) ){.        ra
14fd0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
14fe0 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "option require
14ff0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
15000 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
15010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15020 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
15030 7b 0a 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c  {.        iSampl
15040 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  e = (int)integer
15050 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d  Value(azArg[++i]
15060 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
15070 53 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d  Sample<0 || iSam
15080 70 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  ple>100 ){.     
15090 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
150a0 73 74 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f  stderr, "value o
150b0 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c  ut of range: %s\
150c0 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n", azArg[i]);. 
150d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
150e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
150f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15100 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
15110 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
15120 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
15130 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a  option: %s\n", z
15140 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
15150 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15160 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
15170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15180 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
15190 2e 70 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74  .pExpert = sqlit
151a0 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53  e3_expert_new(pS
151b0 74 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29  tate->db, &zErr)
151c0 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65  ;.    if( pState
151d0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
151e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
151f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
15200 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f  "sqlite3_expert_
15210 6e 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  new: %s\n", zErr
15220 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
15230 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
15250 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66  ite3_expert_conf
15260 69 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 53  ig(.          pS
15270 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15280 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e  pert, EXPERT_CON
15290 46 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d  FIG_SAMPLE, iSam
152a0 70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ple.      );.   
152b0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
152c0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
152d0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
152e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
152f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75   */../*.** Execu
15300 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  te a statement o
15310 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65  r set of stateme
15320 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61  nts.  Print.** a
15330 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63  ny result rows/c
15340 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67  olumns depending
15350 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
15360 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20  mode.** set via 
15370 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
15380 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
15390 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  s is very simila
153a0 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75  r to SQLite's bu
153b0 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65  ilt-in sqlite3_e
153c0 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  xec().** functio
153d0 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
153e0 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
153f0 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a  ferent callback.
15400 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20  ** and callback 
15410 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  data argument..*
15420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
15430 6c 6c 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c  ll_exec(.  Shell
15440 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
15470 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f  to ShellState */
15480 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15490 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
154b0 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61  SQL to be evalua
154c0 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ted */.  char **
154d0 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
15500 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
15510 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
15520 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
15530 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
15540 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
15550 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15560 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
15570 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
15580 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a  e */.  int rc2;.
15590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
155a0 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20  eftover;        
155b0 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70    /* Tail of unp
155c0 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a  rocessed SQL */.
155d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
155e0 70 41 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  pArg->db;..  if(
155f0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
15600 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c   *pzErrMsg = NUL
15610 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  L;.  }..#ifndef 
15620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15630 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
15640 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  Arg->expert.pExp
15650 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ert ){.    rc = 
15660 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28  expertHandleSQL(
15670 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72  pArg, zSql, pzEr
15680 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
15690 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70  n expertFinish(p
156a0 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45  Arg, (rc!=SQLITE
156b0 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b  _OK), pzErrMsg);
156c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77  .  }.#endif..  w
156d0 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26  hile( zSql[0] &&
156e0 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72   (SQLITE_OK == r
156f0 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  c) ){.    static
15700 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
15710 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20  mtSql;.    rc = 
15720 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
15730 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
15740 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f   &pStmt, &zLefto
15750 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ver);.    if( SQ
15760 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b  LITE_OK != rc ){
15770 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72  .      if( pzErr
15780 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
15790 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
157a0 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
157b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
157c0 20 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74        if( !pStmt
157d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
157e0 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
157f0 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69  a comment or whi
15800 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te-space */.    
15810 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
15820 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68  over;.        wh
15830 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71  ile( IsSpace(zSq
15840 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a  l[0]) ) zSql++;.
15850 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15870 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74  zStmtSql = sqlit
15880 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
15890 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71       if( zStmtSq
158a0 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20  l==0 ) zStmtSql 
158b0 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c  = "";.      whil
158c0 65 28 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74  e( IsSpace(zStmt
158d0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53  Sql[0]) ) zStmtS
158e0 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ql++;..      /* 
158f0 73 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65  save off the pre
15900 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68  pared statment h
15910 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20  andle and reset 
15920 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
15930 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
15940 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74         pArg->pSt
15950 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
15960 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20      pArg->cnt = 
15970 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
15980 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71    /* echo the sq
15990 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65  l statement if e
159a0 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cho on */.      
159b0 69 66 28 20 70 41 72 67 20 26 26 20 53 68 65 6c  if( pArg && Shel
159c0 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53  lHasFlag(pArg, S
159d0 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20  HFLG_Echo) ){.  
159e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
159f0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73  f(pArg->out, "%s
15a00 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20  \n", zStmtSql ? 
15a10 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29  zStmtSql : zSql)
15a20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15a30 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50   /* Show the EXP
15a40 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
15a50 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f  if .eqp is on */
15a60 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
15a70 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  && pArg->autoEQP
15a80 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
15a90 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a  ike("EXPLAIN%",z
15aa0 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b  StmtSql,0)!=0 ){
15ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ac0 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b  _stmt *pExplain;
15ad0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
15ae0 45 51 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EQP;.        int
15af0 20 74 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b   triggerEQP = 0;
15b00 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
15b10 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
15b20 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71  es();.        sq
15b30 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
15b40 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
15b50 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
15b60 20 2d 31 2c 20 26 74 72 69 67 67 65 72 45 51 50   -1, &triggerEQP
15b70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15b80 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
15b90 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b  TOEQP_trigger ){
15ba0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15bb0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
15bc0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
15bd0 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c  _TRIGGER_EQP, 1,
15be0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
15bf0 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
15c00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
15c10 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
15c20 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29  N %s", zStmtSql)
15c30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
15c40 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
15c50 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
15c60 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
15c70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15c90 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
15ca0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
15cb0 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  in)==SQLITE_ROW 
15cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
15cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 4c  onst char *zEQPL
15ce0 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ine = (const cha
15cf0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
15d00 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
15d10 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
15d20 69 6e 74 20 69 45 71 70 49 64 20 3d 20 73 71 6c  int iEqpId = sql
15d30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
15d40 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
15d50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
15d60 61 72 65 6e 74 49 64 20 3d 20 73 71 6c 69 74 65  arentId = sqlite
15d70 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
15d80 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20  plain, 1);.     
15d90 20 20 20 20 20 20 20 69 66 28 20 7a 45 51 50 4c         if( zEQPL
15da0 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71  ine[0]=='-' ) eq
15db0 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 65 71 70 5f              eqp_
15dd0 61 70 70 65 6e 64 28 70 41 72 67 2c 20 69 45 71  append(pArg, iEq
15de0 70 49 64 2c 20 69 50 61 72 65 6e 74 49 64 2c 20  pId, iParentId, 
15df0 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20  zEQPLine);.     
15e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15e10 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
15e20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15e30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
15e40 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
15e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15e60 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
15e70 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
15e80 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f  utoEQP>=AUTOEQP_
15e90 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  full ){.        
15ea0 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20    /* Also do an 
15eb0 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71  EXPLAIN for ".eq
15ec0 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a  p full" mode */.
15ed0 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d            zEQP =
15ee0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15ef0 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a  ("EXPLAIN %s", z
15f00 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
15f10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15f20 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
15f30 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
15f40 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ain, 0);.       
15f50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15f60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15f70 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
15f80 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
15f90 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
15fa0 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
15fb0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
15fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
15fd0 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
15fe0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
15ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
16000 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74  plain_data_delet
16010 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  e(pArg);.       
16020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
16030 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
16040 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
16050 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16060 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
16070 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
16080 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
16090 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 26 26  TOEQP_trigger &&
160a0 20 74 72 69 67 67 65 72 45 51 50 3d 3d 30 20 29   triggerEQP==0 )
160b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
160c0 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
160d0 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
160e0 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 30  G_TRIGGER_EQP, 0
160f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
16100 2f 2a 20 52 65 70 72 65 70 61 72 65 20 70 53 74  /* Reprepare pSt
16110 6d 74 20 62 65 66 6f 72 65 20 72 65 61 63 74 69  mt before reacti
16120 76 69 6e 67 20 74 72 61 63 65 20 6d 6f 64 65 73  ving trace modes
16130 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
16140 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
16150 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
16160 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
16170 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
16180 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
16190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161a0 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
161b0 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
161c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
161d0 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
161e0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41  pArg->cMode = pA
161f0 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rg->mode;.      
16200 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
16210 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
16220 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16230 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
16240 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20  tmt)==8.        
16250 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
16260 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
16270 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30  , zStmtSql,0)==0
16280 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
16290 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
162a0 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
162b0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
162c0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
162d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
162e0 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20  ount(pStmt)==4. 
162f0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
16300 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58  ite3_strlike("EX
16310 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
16320 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
16330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16340 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16350 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20  MODE_EQP;.      
16360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16370 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16380 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72  he shell is curr
16390 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61  ently in ".expla
163a0 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72  in" mode, gather
163b0 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20   the extra.     
163c0 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
163d0 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
163e0 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
163f0 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  .*/.        if( 
16400 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
16410 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  E_Explain ){.   
16420 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
16430 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67  ata_prepare(pArg
16440 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
16450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
16460 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
16470 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d  _stmt(pArg, pStm
16480 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  t);.      explai
16490 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
164a0 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72  rg);.      eqp_r
164b0 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20  ender(pArg);..  
164c0 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61      /* print usa
164d0 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74  ge stats if stat
164e0 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
164f0 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
16500 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
16510 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
16520 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20  (db, pArg, 0);. 
16530 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16540 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e   print loop-coun
16550 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64  ters if required
16560 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
16570 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e  rg && pArg->scan
16580 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
16590 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73     display_scans
165a0 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a  tats(db, pArg);.
165b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
165c0 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73  * Finalize the s
165d0 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78  tatement just ex
165e0 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20  ecuted. If this 
165f0 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20  fails, save a.  
16600 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
16610 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
16620 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
16630 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74   zSql to point t
16640 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  o the.      ** n
16650 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
16660 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20   execute. */.   
16670 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16680 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
166a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72  SQLITE_NOMEM ) r
166b0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
166c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
166d0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
166e0 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
166f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
16700 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
16710 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  zSql++;.      }e
16720 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67  lse if( pzErrMsg
16730 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16740 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
16750 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
16760 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  }..      /* clea
16770 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e  r saved stmt han
16780 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dle */.      if(
16790 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
167a0 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e   pArg->pStmt = N
167b0 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
167c0 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68   }.  } /* end wh
167d0 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ile */..  return
167e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
167f0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65  lease memory pre
16800 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
16810 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e  d by tableColumn
16820 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  List()..*/.stati
16830 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d  c void freeColum
16840 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43  nList(char **azC
16850 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
16860 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
16870 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
16880 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b  ite3_free(azCol[
16890 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a  i]);.  }.  /* az
168a0 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74  Col[0] is a stat
168b0 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73  ic string */.  s
168c0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
168d0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  l);.}../*.** Ret
168e0 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f  urn a list of po
168f0 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  inters to string
16900 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
16910 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20  names of all.** 
16920 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
16930 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d   zTab.   The mem
16940 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
16950 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63  names is dynamic
16960 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
16970 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  d and must be re
16980 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61  leased by the ca
16990 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62  ller using a sub
169a0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
169b0 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  to freeColumnLis
169c0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t()..**.** The a
169d0 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73  zCol[0] entry is
169e0 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20   usually NULL.  
169f0 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62  However, if zTab
16a00 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69   contains a rowi
16a10 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20  d.** value that 
16a20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73  needs to be pres
16a30 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f  erved, then azCo
16a40 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69  l[0] is filled i
16a50 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61  n with the.** na
16a60 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  me of the rowid 
16a70 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  column..**.** Th
16a80 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20  e first regular 
16a90 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
16aa0 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e  ble is azCol[1].
16ab0 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65    The list is te
16ac0 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61  rminated.** by a
16ad0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43  n entry with azC
16ae0 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61  ol[i]==0..*/.sta
16af0 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65  tic char **table
16b00 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c  ColumnList(Shell
16b10 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
16b20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63  char *zTab){.  c
16b30 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b  har **azCol = 0;
16b40 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16b50 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *pStmt;.  char *
16b60 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  zSql;.  int nCol
16b70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c   = 0;.  int nAll
16b80 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  oc = 0;.  int nP
16b90 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  K = 0;       /* 
16ba0 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52  Number of PRIMAR
16bb0 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65  Y KEY columns se
16bc0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50  en */.  int isIP
16bd0 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  K = 0;     /* Tr
16be0 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52  ue if one PRIMAR
16bf0 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20  Y KEY column of 
16c00 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a  type INTEGER */.
16c10 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f    int preserveRo
16c20 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c  wid = ShellHasFl
16c30 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
16c40 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e  erveRowid);.  in
16c50 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  t rc;..  zSql = 
16c60 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16c70 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
16c80 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20  fo=%Q", zTab);. 
16c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
16ca0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
16cb0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
16cc0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
16cd0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
16ce0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
16cf0 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
16d00 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
16d10 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
16d20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f   if( nCol>=nAllo
16d30 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  c-2 ){.      nAl
16d40 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b  loc = nAlloc*2 +
16d50 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20   nCol + 10;.    
16d60 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65    azCol = sqlite
16d70 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c  3_realloc(azCol,
16d80 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61   nAlloc*sizeof(a
16d90 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20  zCol[0]));.     
16da0 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
16db0 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
16dc0 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
16dd0 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d   azCol[++nCol] =
16de0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16df0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
16e00 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
16e10 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73  , 1));.    if( s
16e20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16e30 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20  t(pStmt, 5) ){. 
16e40 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20       nPK++;.    
16e50 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20    if( nPK==1.   
16e60 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
16e70 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  tricmp((const ch
16e80 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
16e90 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
16ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54              "INT
16ec0 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
16ed0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  ){.        isIPK
16ee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
16ef0 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  e{.        isIPK
16f00 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16f10 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
16f20 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
16f30 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  );.  if( azCol==
16f40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16f50 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  azCol[0] = 0;.  
16f60 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20  azCol[nCol+1] = 
16f70 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63  0;..  /* The dec
16f80 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72  ision of whether
16f90 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20   or not a rowid 
16fa0 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20  really needs to 
16fb0 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a  be preserved.  *
16fc0 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65  * is tricky.  We
16fd0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70   never need to p
16fe0 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20  reserve a rowid 
16ff0 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
17000 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  WID table.  ** o
17010 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  r a table with a
17020 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
17030 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75  Y KEY.  We are u
17040 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76  nable to preserv
17050 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e  e.  ** rowids on
17060 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68   tables where th
17070 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63  e rowid is inacc
17080 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20  essible because 
17090 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
170a0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
170b0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
170c0 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
170d0 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20  _", and "oid".. 
170e0 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72   */.  if( preser
170f0 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b  veRowid && isIPK
17100 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
17110 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b  single PRIMARY K
17120 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74  EY column with t
17130 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20  ype INTEGER was 
17140 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20  seen, then it.  
17150 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e    ** might be an
17160 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52   alise for the R
17170 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69  OWID.  But it mi
17180 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49  ght also be a WI
17190 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20  THOUT ROWID.    
171a0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e  ** table or a IN
171b0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
171c0 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e  Y DESC column, n
171d0 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
171e0 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44  are.    ** ROWID
171f0 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69   aliases.  To di
17200 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20  stinguish these 
17210 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20  cases, check to 
17220 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  see if.    ** th
17230 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e  ere is a "pk" en
17240 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69  try in "PRAGMA i
17250 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65  ndex_list".  The
17260 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  re will be.    *
17270 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20  * no "pk" index 
17280 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  if the PRIMARY K
17290 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  EY really is an 
172a0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f  alias for the RO
172b0 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  WID..    */.    
172c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
172d0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31  printf("SELECT 1
172e0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64   FROM pragma_ind
172f0 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20  ex_list(%Q)".   
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
17320 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54  origin='pk'", zT
17330 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ab);.    rc = sq
17340 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17350 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
17360 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
17370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17380 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
17390 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f   ){.      freeCo
173a0 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
173b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
173c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
173d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
173e0 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
173f0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
17400 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f  ;.    preserveRo
17410 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  wid = rc==SQLITE
17420 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _ROW;.  }.  if( 
17430 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b  preserveRowid ){
17440 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65  .    /* Only pre
17450 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20  serve the rowid 
17460 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61  if we can find a
17470 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72   name to use for
17480 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69   the.    ** rowi
17490 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  d */.    static 
174a0 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20  char *azRowid[] 
174b0 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72  = { "rowid", "_r
174c0 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b  owid_", "oid" };
174d0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
174e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
174f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
17500 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69  (i=1; i<=nCol; i
17510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17520 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
17530 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f  (azRowid[j],azCo
17540 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  l[i])==0 ) break
17550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17560 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20  if( i>nCol ){.  
17570 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
17580 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
17590 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20  that azRowid[j] 
175a0 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
175b0 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  of any.        *
175c0 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  * ordinary colum
175d0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  n in the table. 
175e0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52   Verify that azR
175f0 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c  owid[j] is a val
17600 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61  id.        ** na
17610 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  me for the rowid
17620 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69   before adding i
17630 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20  t to azCol[0].  
17640 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
17650 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
17660 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c  will fail this l
17670 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ast check */.   
17680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17690 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
176a0 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c  etadata(p->db,0,
176b0 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c  zTab,azRowid[j],
176c0 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  0,0,0,0,0);.    
176d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
176e0 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d  TE_OK ) azCol[0]
176f0 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20   = azRowid[j];. 
17700 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17720 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a    return azCol;.
17730 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20  }../*.** Toggle 
17740 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  the reverse_unor
17750 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65  dered_selects se
17760 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tting..*/.static
17770 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65   void toggleSele
17780 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20  ctOrder(sqlite3 
17790 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *db){.  sqlite3_
177a0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
177b0 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20  .  int iSetting 
177c0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d  = 0;.  char zStm
177d0 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  t[100];.  sqlite
177e0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
177f0 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65   "PRAGMA reverse
17800 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
17810 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ts", -1, &pStmt,
17820 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
17830 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
17840 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
17850 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c    iSetting = sql
17860 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17870 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
17880 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
17890 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  e(pStmt);.  sqli
178a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
178b0 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d  eof(zStmt), zStm
178c0 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d  t,.       "PRAGM
178d0 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65  A reverse_unorde
178e0 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22  red_selects(%d)"
178f0 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20  , !iSetting);.  
17900 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
17910 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29   zStmt, 0, 0, 0)
17920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17930 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  is a different c
17940 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
17950 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67  used for dumping
17960 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17970 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69  * Each row recei
17980 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ved by this call
17990 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
179a0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
179b0 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65  * the table type
179c0 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61   ("index" or "ta
179d0 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f  ble") and SQL to
179e0 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
179f0 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
17a00 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20  ne should print 
17a10 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20  text sufficient 
17a20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
17a30 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
17a40 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61   int dump_callba
17a50 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
17a60 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
17a70 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
17a80 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
17a90 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
17aa0 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *zTable;.  cons
17ab0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
17ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
17ad0 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  l;.  ShellState 
17ae0 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
17af0 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53   *)pArg;..  UNUS
17b00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e  ED_PARAMETER(azN
17b10 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e  otUsed);.  if( n
17b20 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d  Arg!=3 || azArg=
17b30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17b40 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
17b50 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a  0];.  zType = az
17b60 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d  Arg[1];.  zSql =
17b70 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66   azArg[2];..  if
17b80 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c  ( strcmp(zTable,
17b90 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
17ba0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  e")==0 ){.    ra
17bb0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
17bc0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
17bd0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
17be0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
17bf0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
17c00 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20  "sqlite_stat?", 
17c10 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20  zTable)==0 ){.  
17c20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
17c30 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
17c40 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
17c50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
17c60 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
17c70 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
17c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
17c90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
17ca0 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
17cb0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
17cc0 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
17cd0 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
17ce0 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
17cf0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
17d00 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
17d10 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
17d20 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e  ble_schema=ON;\n
17d30 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
17d40 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b  tableSchema = 1;
17d50 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20  .    }.    zIns 
17d60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17d70 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  f(.       "INSER
17d80 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
17d90 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74  ster(type,name,t
17da0 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65  bl_name,rootpage
17db0 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56  ,sql)".       "V
17dc0 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25  ALUES('table','%
17dd0 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b  q','%q',0,'%q');
17de0 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65  ",.       zTable
17df0 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b  , zTable, zSql);
17e00 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
17e10 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
17e20 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69   zIns);.    sqli
17e30 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a  te3_free(zIns);.
17e40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17e50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
17e60 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
17e70 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b  t, zSql, ";\n");
17e80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63  .  }..  if( strc
17e90 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65  mp(zType, "table
17ea0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  ")==0 ){.    She
17eb0 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a  llText sSelect;.
17ec0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54      ShellText sT
17ed0 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  able;.    char *
17ee0 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  *azCol;.    int 
17ef0 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76  i;.    char *sav
17f00 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
17f10 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a   int savedMode;.
17f20 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62  .    azCol = tab
17f30 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20  leColumnList(p, 
17f40 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
17f50 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
17f60 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20     p->nErr++;.  
17f70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17f80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61    }..    /* Alwa
17f90 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62  ys quote the tab
17fa0 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66  le name, even if
17fb0 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62   it appears to b
17fc0 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20  e pure ascii,.  
17fd0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20    ** in case it 
17fe0 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78  is a keyword. Ex
17ff0 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  :  INSERT INTO "
18000 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20  table" ... */.  
18010 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62    initText(&sTab
18020 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  le);.    appendT
18030 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61  ext(&sTable, zTa
18040 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
18050 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20  Table));.    /* 
18060 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68  If preserving th
18070 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63  e rowid, add a c
18080 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72  olumn list after
18090 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
180a0 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
180b0 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54   words:  "INSERT
180c0 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c   INTO tab(rowid,
180d0 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45  a,b,c,...) VALUE
180e0 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69  S(...)".    ** i
180f0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
18100 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ual "INSERT INTO
18110 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29   tab VALUES(...)
18120 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
18130 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18140 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18150 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b  sTable, "(", 0);
18160 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18170 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
18180 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  [0], 0);.      f
18190 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
181a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
181b0 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
181c0 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  le, ",", 0);.   
181d0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
181e0 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69  &sTable, azCol[i
181f0 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
18200 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d  ol[i]));.      }
18210 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18220 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20  t(&sTable, ")", 
18230 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
18240 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f  * Build an appro
18250 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74  priate SELECT st
18260 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
18270 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
18280 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
18290 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
182a0 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69  ECT ", 0);.    i
182b0 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
182c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
182d0 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
182e0 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  0], 0);.      ap
182f0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
18300 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  t, ",", 0);.    
18310 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  }.    for(i=1; a
18320 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
18330 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18340 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18350 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
18360 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
18370 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29  if( azCol[i+1] )
18380 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18390 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
183a0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ,", 0);.      }.
183b0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f      }.    freeCo
183c0 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
183d0 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
183e0 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d  &sSelect, " FROM
183f0 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65   ", 0);.    appe
18400 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
18410 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68   zTable, quoteCh
18420 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20  ar(zTable));..  
18430 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65    savedDestTable
18440 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
18450 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20  ;.    savedMode 
18460 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70  = p->mode;.    p
18470 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73  ->zDestTable = s
18480 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e  Table.z;.    p->
18490 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20  mode = p->cMode 
184a0 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
184b0 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
184c0 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ec(p, sSelect.z,
184d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63   0);.    if( (rc
184e0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
184f0 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ORRUPT ){.      
18500 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18510 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18520 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18530 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20  ****/\n");.     
18540 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18550 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  er(p->db);.     
18560 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73   shell_exec(p, s
18570 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20  Select.z, 0);.  
18580 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
18590 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
185a0 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
185b0 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
185c0 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
185d0 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
185e0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
185f0 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
18600 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
18610 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
18620 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
18630 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18640 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
18650 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
18660 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
18670 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
18680 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
18690 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
186a0 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
186b0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
186c0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
186d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
186e0 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
186f0 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
18700 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
18710 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
18720 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
18730 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
18740 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
18750 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
18760 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
18770 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
18780 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
18790 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
187a0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
187b0 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
187c0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
187d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
187e0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
187f0 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
18800 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
18810 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
18820 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18830 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18840 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18850 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
18860 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
18870 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
18880 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
18890 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
188a0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
188b0 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
188c0 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
188d0 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
188e0 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
188f0 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
18900 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
18910 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18920 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
18930 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
18940 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
18950 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18960 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
18970 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
18980 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
18990 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
189a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
189b0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
189c0 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
189d0 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
189e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
189f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18a00 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
18a10 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
18a20 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
18a30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
18a50 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
18a60 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
18a70 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20 64 65  zHelp[] =.#if de
18a80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
18a90 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69  E_ZLIB) && !defi
18aa0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
18ab0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
18ac0 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20  ".archive ...   
18ad0 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
18ae0 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c 22 2e  QL archives: \".
18af0 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22  archive --help\"
18b00 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e 22 0a   for details\n".
18b10 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
18b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
18b30 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74  RIZATION.  ".aut
18b40 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  h ON|OFF        
18b50 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a     Show authoriz
18b60 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a  er callbacks\n".
18b70 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b 75  #endif.  ".backu
18b80 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20  p ?DB? FILE     
18b90 20 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61   Backup DB (defa
18ba0 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f  ult \"main\") to
18bb0 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62 61 69   FILE\n".  ".bai
18bc0 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  l on|off        
18bd0 20 20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69     Stop after hi
18be0 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20  tting an error. 
18bf0 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a   Default OFF\n".
18c00 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66    ".binary on|of
18c10 66 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 62  f         Turn b
18c20 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20  inary output on 
18c30 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74  or off.  Default
18c40 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64 20 44   OFF\n".  ".cd D
18c50 49 52 45 43 54 4f 52 59 20 20 20 20 20 20 20 20  IRECTORY        
18c60 20 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72    Change the wor
18c70 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74  king directory t
18c80 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 0a 20  o DIRECTORY\n". 
18c90 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66   ".changes on|of
18ca0 66 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75  f        Show nu
18cb0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61  mber of rows cha
18cc0 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22 0a 20  nged by SQL\n". 
18cd0 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20   ".check GLOB   
18ce0 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66           Fail if
18cf0 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74   output since .t
18d00 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  estcase does not
18d10 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e 63 6c   match\n".  ".cl
18d20 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20  one NEWDB       
18d30 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69      Clone data i
18d40 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74  nto NEWDB from t
18d50 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
18d60 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61  base\n".  ".data
18d70 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
18d80 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64    List names and
18d90 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68   files of attach
18da0 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a  ed databases\n".
18db0 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f 70    ".dbconfig ?op
18dc0 3f 20 3f 76 61 6c 3f 20 20 20 4c 69 73 74 20 6f  ? ?val?   List o
18dd0 72 20 63 68 61 6e 67 65 20 73 71 6c 69 74 65 33  r change sqlite3
18de0 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74  _db_config() opt
18df0 69 6f 6e 73 5c 6e 22 0a 20 20 22 2e 64 62 69 6e  ions\n".  ".dbin
18e00 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20 20  fo ?DB?         
18e10 20 20 53 68 6f 77 20 73 74 61 74 75 73 20 69 6e    Show status in
18e20 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
18e30 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e 22 0a  the database\n".
18e40 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f    ".dump ?TABLE?
18e50 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74   ...      Dump t
18e60 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 61  he database in a
18e70 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61  n SQL text forma
18e80 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  t\n".  "        
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66   If TABLE specif
18eb0 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74  ied, only dump t
18ec0 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e  ables matching\n
18ed0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49                LI
18ef0 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
18f00 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 6f 6e  .\n".  ".echo on
18f10 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54  |off           T
18f20 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f  urn command echo
18f30 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
18f40 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c  ".eqp on|off|ful
18f50 6c 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 6f  l       Enable o
18f60 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61  r disable automa
18f70 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52  tic EXPLAIN QUER
18f80 59 20 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e 65 78  Y PLAN\n".  ".ex
18f90 63 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  cel             
18fa0 20 20 20 20 44 69 73 70 6c 61 79 20 74 68 65 20      Display the 
18fb0 6f 75 74 70 75 74 20 6f 66 20 6e 65 78 74 20 63  output of next c
18fc0 6f 6d 6d 61 6e 64 20 69 6e 20 61 20 73 70 72 65  ommand in a spre
18fd0 61 64 73 68 65 65 74 5c 6e 22 0a 20 20 22 2e 65  adsheet\n".  ".e
18fe0 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  xit             
18ff0 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
19000 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78  rogram\n".  ".ex
19010 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20  pert            
19020 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c      EXPERIMENTAL
19030 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78 65  . Suggest indexe
19040 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64 20  s for specified 
19050 71 75 65 72 69 65 73 5c 6e 22 0a 2f 2a 20 42 65  queries\n"./* Be
19060 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f  cause explain mo
19070 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f  de comes on auto
19080 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74  matically now, t
19090 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  he ".explain" mo
190a0 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64  de.** is removed
190b0 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73   from the help s
190c0 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74  creen.  It is st
190d0 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f  ill supported fo
190e0 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65  r legacy, howeve
190f0 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e  r */./*".explain
19100 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 54   ?on|off|auto? T
19110 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70  urn EXPLAIN outp
19120 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66  ut mode on or of
19130 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69  f or to automati
19140 63 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73  c\n"*/.  ".fulls
19150 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
19160 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64   Show schema and
19170 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19180 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c  sqlite_stat tabl
19190 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72  es\n".  ".header
191a0 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  s on|off        
191b0 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20  Turn display of 
191c0 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
191d0 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20  f\n".  ".help   
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
191f0 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67 65  how this message
19200 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46  \n".  ".import F
19210 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d  ILE TABLE     Im
19220 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46  port data from F
19230 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e  ILE into TABLE\n
19240 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
19250 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
19260 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20  OL.  ".imposter 
19270 49 4e 44 45 58 20 54 41 42 4c 45 20 20 43 72 65  INDEX TABLE  Cre
19280 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  ate imposter tab
19290 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65  le TABLE on inde
192a0 78 20 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64 69  x INDEX\n".#endi
192b0 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54  f.  ".indexes ?T
192c0 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f 77  ABLE?       Show
192d0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e   names of all in
192e0 64 65 78 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  dexes\n".  "    
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70       If TABLE sp
19310 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
19320 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74  ow indexes for t
19330 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  ables\n".  "    
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c 49       matching LI
19360 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
19370 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49  .\n".#ifdef SQLI
19380 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
19390 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49  E.  ".iotrace FI
193a0 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e 61 62  LE          Enab
193b0 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69  le I/O diagnosti
193c0 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c  c logging to FIL
193d0 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  E\n".#endif.  ".
193e0 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56  limit ?LIMIT? ?V
193f0 41 4c 3f 20 20 20 44 69 73 70 6c 61 79 20 6f 72  AL?   Display or
19400 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
19410 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c  e of an SQLITE_L
19420 49 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e 74  IMIT\n".  ".lint
19430 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20   OPTIONS        
19440 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69    Report potenti
19450 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73  al schema issues
19460 2e 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20  . Options:\n".  
19470 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19480 20 20 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69            fkey-i
19490 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20  ndexes     Find 
194a0 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20  missing foreign 
194b0 6b 65 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a 23  key indexes\n".#
194c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
194d0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
194e0 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20  N.  ".load FILE 
194f0 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64  ?ENTRY?     Load
19500 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69   an extension li
19510 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a  brary\n".#endif.
19520 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66    ".log FILE|off
19530 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c            Turn l
19540 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  ogging on or off
19550 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73  .  FILE can be s
19560 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a  tderr/stdout\n".
19570 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54    ".mode MODE ?T
19580 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75  ABLE?     Set ou
19590 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20  tput mode where 
195a0 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c  MODE is one of:\
195b0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
195d0 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f  scii    Columns/
195e0 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62  rows delimited b
195f0 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 5c  y 0x1F and 0x1E\
19600 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
19620 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65  sv      Comma-se
19630 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e  parated values\n
19640 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
19660 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67  lumn   Left-alig
19670 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53  ned columns.  (S
19680 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20  ee .width)\n".  
19690 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
196a0 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20            html  
196b0 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20     HTML <table> 
196c0 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20  code\n".  "     
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c      insert   SQL
196f0 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e   insert statemen
19700 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a  ts for TABLE\n".
19710 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19720 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
19730 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70       One value p
19740 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20  er line\n".  "  
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 20 20 20 20 20 6c 69 73 74 20 20 20 20 20         list     
19770 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64  Values delimited
19780 20 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20 22   by \"|\"\n".  "
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 20 20           quote  
197b0 20 20 45 73 63 61 70 65 20 61 6e 73 77 65 72 73    Escape answers
197c0 20 61 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a 20   as for SQL\n". 
197d0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
197e0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73 20             tabs 
197f0 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65      Tab-separate
19800 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20 20          tcl     
19830 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e   TCL list elemen
19840 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61  ts\n".  ".nullva
19850 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20 20  lue STRING      
19860 55 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c  Use STRING in pl
19870 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75  ace of NULL valu
19880 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20 28  es\n".  ".once (
19890 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20 20 20 20  -e|-x|FILE)     
198a0 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e  Output for the n
198b0 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  ext SQL command 
198c0 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 5c 6e 22 0a  only to FILE\n".
198d0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
198e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 69              or i
198f0 6e 76 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78  nvoke system tex
19900 74 20 65 64 69 74 6f 72 20 28 2d 65 29 20 6f 72  t editor (-e) or
19910 20 73 70 72 65 61 64 73 68 65 65 74 20 28 2d 78   spreadsheet (-x
19920 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  )\n".  "        
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 5c   on the output.\
19950 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54  n".  ".open ?OPT
19960 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 43 6c 6f  IONS? ?FILE? Clo
19970 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  se existing data
19980 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20  base and reopen 
19990 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  FILE\n".  "     
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 20 20 54 68 65 20 2d 2d 6e 65 77 20 6f 70      The --new op
199c0 74 69 6f 6e 20 73 74 61 72 74 73 20 77 69 74 68  tion starts with
199d0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e   an empty file\n
199e0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 74                Ot
19a00 68 65 72 20 6f 70 74 69 6f 6e 73 3a 20 2d 2d 72  her options: --r
19a10 65 61 64 6f 6e 6c 79 20 2d 2d 61 70 70 65 6e 64  eadonly --append
19a20 20 2d 2d 7a 69 70 5c 6e 22 0a 20 20 22 2e 6f 75   --zip\n".  ".ou
19a30 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20  tput ?FILE?     
19a40 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
19a50 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75  to FILE or stdou
19a60 74 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53  t\n".  ".print S
19a70 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50  TRING...       P
19a80 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52  rint literal STR
19a90 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70  ING\n".  ".promp
19aa0 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20  t MAIN CONTINUE 
19ab0 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61   Replace the sta
19ac0 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22  ndard prompts\n"
19ad0 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20  .  ".quit       
19ae0 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
19af0 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a  this program\n".
19b00 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d    ".read FILENAM
19b10 45 20 20 20 20 20 20 20 20 20 45 78 65 63 75 74  E         Execut
19b20 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d  e SQL in FILENAM
19b30 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65  E\n".  ".restore
19b40 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52   ?DB? FILE     R
19b50 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f  estore content o
19b60 66 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22  f DB (default \"
19b70 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c  main\") from FIL
19b80 45 5c 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49  E\n".  ".save FI
19b90 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 57  LE             W
19ba0 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  rite in-memory d
19bb0 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c  atabase into FIL
19bc0 45 5c 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74 61  E\n".  ".scansta
19bd0 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54  ts on|off      T
19be0 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  urn sqlite3_stmt
19bf0 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65  _scanstatus() me
19c00 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  trics on or off\
19c10 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50  n".  ".schema ?P
19c20 41 54 54 45 52 4e 3f 20 20 20 20 20 20 53 68 6f  ATTERN?      Sho
19c30 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
19c40 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67  tements matching
19c50 20 50 41 54 54 45 52 4e 5c 6e 22 0a 20 20 22 20   PATTERN\n".  " 
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 20 20 20 20 20 20 20 20 41 64 64 20 2d 2d 69           Add --i
19c80 6e 64 65 6e 74 20 66 6f 72 20 70 72 65 74 74 79  ndent for pretty
19c90 2d 70 72 69 6e 74 69 6e 67 5c 6e 22 0a 20 20 22  -printing\n".  "
19ca0 2e 73 65 6c 66 74 65 73 74 20 3f 2d 2d 69 6e 69  .selftest ?--ini
19cb0 74 3f 20 20 20 20 20 52 75 6e 20 74 65 73 74 73  t?     Run tests
19cc0 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
19cd0 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 5c 6e  SELFTEST table\n
19ce0 22 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20  ".  ".separator 
19cf0 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 43 68 61 6e  COL ?ROW?   Chan
19d00 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  ge the column se
19d10 70 61 72 61 74 6f 72 20 61 6e 64 20 6f 70 74 69  parator and opti
19d20 6f 6e 61 6c 6c 79 20 74 68 65 20 72 6f 77 5c 6e  onally the row\n
19d30 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
19d50 70 61 72 61 74 6f 72 20 66 6f 72 20 62 6f 74 68  parator for both
19d60 20 74 68 65 20 6f 75 74 70 75 74 20 6d 6f 64 65   the output mode
19d70 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a   and .import\n".
19d80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19d90 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
19da0 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 43  N).  ".session C
19db0 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 43 72 65  MD ...       Cre
19dc0 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73  ate or control s
19dd0 65 73 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69  essions\n".#endi
19de0 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 3f 4f  f.  ".sha3sum ?O
19df0 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70  PTIONS...?  Comp
19e00 75 74 65 20 61 20 53 48 41 33 20 68 61 73 68 20  ute a SHA3 hash 
19e10 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
19e20 65 6e 74 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53  ent\n".#ifndef S
19e30 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
19e40 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d  TEM.  ".shell CM
19e50 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 52 75  D ARGS...     Ru
19e60 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
19e70 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c   a system shell\
19e80 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  n".#endif.  ".sh
19e90 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
19ea0 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72      Show the cur
19eb0 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
19ec0 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73  various settings
19ed0 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f  \n".  ".stats ?o
19ee0 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 53 68  n|off?        Sh
19ef0 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e  ow stats or turn
19f00 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66   stats on or off
19f10 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  \n".#ifndef SQLI
19f20 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
19f30 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20  .  ".system CMD 
19f40 41 52 47 53 2e 2e 2e 20 20 20 20 52 75 6e 20 43  ARGS...    Run C
19f50 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20  MD ARGS... in a 
19f60 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a  system shell\n".
19f70 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c 65  #endif.  ".table
19f80 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  s ?TABLE?       
19f90 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74   List names of t
19fa0 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  ables\n".  "    
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70       If TABLE sp
19fd0 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69  ecified, only li
19fe0 73 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  st tables matchi
19ff0 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  ng\n".  "       
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54    LIKE pattern T
1a020 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 65 73  ABLE.\n".  ".tes
1a030 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20  tcase NAME      
1a040 20 20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63     Begin redirec
1a050 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27  ting output to '
1a060 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
1a070 27 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74  '\n".  ".timeout
1a080 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54   MS            T
1a090 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
1a0a0 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
1a0b0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a  milliseconds\n".
1a0c0 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66    ".timer on|off
1a0d0 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 53            Turn S
1a0e0 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f  QL timer on or o
1a0f0 66 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20  ff\n".  ".trace 
1a100 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
1a110 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20  Output each SQL 
1a120 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20  statement as it 
1a130 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66  is run\n".  ".vf
1a140 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20  sinfo ?AUX?     
1a150 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20      Information 
1a160 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65  about the top-le
1a170 76 65 6c 20 56 46 53 5c 6e 22 0a 20 20 22 2e 76  vel VFS\n".  ".v
1a180 66 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  fslist          
1a190 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76       List all av
1a1a0 61 69 6c 61 62 6c 65 20 56 46 53 65 73 5c 6e 22  ailable VFSes\n"
1a1b0 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55  .  ".vfsname ?AU
1a1c0 58 3f 20 20 20 20 20 20 20 20 20 50 72 69 6e 74  X?         Print
1a1d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1a1e0 20 56 46 53 20 73 74 61 63 6b 5c 6e 22 0a 20 20   VFS stack\n".  
1a1f0 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d  ".width NUM1 NUM
1a200 32 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f 6c 75  2 ...   Set colu
1a210 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22  mn widths for \"
1a220 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22  column\" mode\n"
1a230 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 65 67               Neg
1a250 61 74 69 76 65 20 76 61 6c 75 65 73 20 72 69 67  ative values rig
1a260 68 74 2d 6a 75 73 74 69 66 79 5c 6e 22 0a 3b 0a  ht-justify\n".;.
1a270 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a280 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1a290 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  ON)./*.** Print 
1a2a0 68 65 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  help information
1a2b0 20 66 6f 72 20 74 68 65 20 22 2e 73 65 73 73 69   for the ".sessi
1a2c0 6f 6e 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a  ons" command.*/.
1a2d0 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 68 65 6c  void session_hel
1a2e0 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  p(ShellState *p)
1a2f0 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  {.  raw_printf(p
1a300 2d 3e 6f 75 74 2c 0a 20 20 20 20 22 2e 73 65 73  ->out,.    ".ses
1a310 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55 42 43  sion ?NAME? SUBC
1a320 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f  OMMAND ?ARGS...?
1a330 5c 6e 22 0a 20 20 20 20 22 49 66 20 3f 4e 41 4d  \n".    "If ?NAM
1a340 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74  E? is omitted, t
1a350 68 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64  he first defined
1a360 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64   session is used
1a370 2e 5c 6e 22 0a 20 20 20 20 22 53 75 62 63 6f 6d  .\n".    "Subcom
1a380 6d 61 6e 64 73 3a 5c 6e 22 0a 20 20 20 20 22 20  mands:\n".    " 
1a390 20 20 61 74 74 61 63 68 20 54 41 42 4c 45 20 20    attach TABLE  
1a3a0 20 20 20 20 20 20 20 20 20 20 20 41 74 74 61 63             Attac
1a3b0 68 20 54 41 42 4c 45 5c 6e 22 0a 20 20 20 20 22  h TABLE\n".    "
1a3c0 20 20 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c     changeset FIL
1a3d0 45 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74  E           Writ
1a3e0 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e  e a changeset in
1a3f0 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 20 20 22  to FILE\n".    "
1a400 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20     close        
1a410 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73              Clos
1a420 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 5c 6e 22  e one session\n"
1a430 0a 20 20 20 20 22 20 20 20 65 6e 61 62 6c 65 20  .    "   enable 
1a440 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20  ?BOOLEAN?       
1a450 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74    Set or query t
1a460 68 65 20 65 6e 61 62 6c 65 20 62 69 74 5c 6e 22  he enable bit\n"
1a470 0a 20 20 20 20 22 20 20 20 66 69 6c 74 65 72 20  .    "   filter 
1a480 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20  GLOB...         
1a490 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20    Reject tables 
1a4a0 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 5c 6e  matching GLOBs\n
1a4b0 22 0a 20 20 20 20 22 20 20 20 69 6e 64 69 72 65  ".    "   indire
1a4c0 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20  ct ?BOOLEAN?    
1a4d0 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79     Mark or query
1a4e0 20 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74   the indirect st
1a4f0 61 74 75 73 5c 6e 22 0a 20 20 20 20 22 20 20 20  atus\n".    "   
1a500 69 73 65 6d 70 74 79 20 20 20 20 20 20 20 20 20  isempty         
1a510 20 20 20 20 20 20 20 20 20 51 75 65 72 79 20 77           Query w
1a520 68 65 74 68 65 72 20 74 68 65 20 73 65 73 73 69  hether the sessi
1a530 6f 6e 20 69 73 20 65 6d 70 74 79 5c 6e 22 0a 20  on is empty\n". 
1a540 20 20 20 22 20 20 20 6c 69 73 74 20 20 20 20 20     "   list     
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 4c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f  List currently o
1a570 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65  pen session name
1a580 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 6f 70 65  s\n".    "   ope
1a590 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20 20 20  n DB NAME       
1a5a0 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e 65 77        Open a new
1a5b0 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e   session on DB\n
1a5c0 22 0a 20 20 20 20 22 20 20 20 70 61 74 63 68 73  ".    "   patchs
1a5d0 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  et FILE         
1a5e0 20 20 20 57 72 69 74 65 20 61 20 70 61 74 63 68     Write a patch
1a5f0 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22  set into FILE\n"
1a600 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  .  );.}.#endif..
1a610 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1a620 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
1a630 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  int process_inpu
1a640 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  t(ShellState *p,
1a650 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a   FILE *in);../*.
1a660 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1a670 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d  ent of file zNam
1a680 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
1a690 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1a6a0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a  te3_malloc64().*
1a6b0 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  * and return a p
1a6c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75  ointer to the bu
1a6d0 66 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72  ffer. The caller
1a6e0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1a6f0 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74  for freeing.** t
1a700 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  he memory..**.**
1a710 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e   If parameter pn
1a720 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Byte is not NULL
1a730 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73  , (*pnByte) is s
1a740 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1a750 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
1a760 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e  d..**.** For con
1a770 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d  venience, a nul-
1a780 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
1a790 69 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64  is always append
1a7a0 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72  ed to the data r
1a7b0 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ead.** from the 
1a7c0 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
1a7d0 62 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e  buffer is return
1a7e0 65 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73  ed. This byte is
1a7f0 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e   not included in
1a800 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61  .** the final va
1a810 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29  lue of (*pnByte)
1a820 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e  , if applicable.
1a830 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  .**.** NULL is r
1a840 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65  eturned if any e
1a850 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1a860 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76  red. The final v
1a870 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a  alue of *pnByte.
1a880 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
1a890 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
1a8a0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
1a8b0 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61  adFile(const cha
1a8c0 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70  r *zName, int *p
1a8d0 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a  nByte){.  FILE *
1a8e0 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65  in = fopen(zName
1a8f0 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20  , "rb");.  long 
1a900 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52  nIn;.  size_t nR
1a910 65 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75  ead;.  char *pBu
1a920 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  f;.  if( in==0 )
1a930 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65   return 0;.  fse
1a940 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45  ek(in, 0, SEEK_E
1a950 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65  ND);.  nIn = fte
1a960 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64  ll(in);.  rewind
1a970 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73  (in);.  pBuf = s
1a980 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1a990 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20   nIn+1 );.  if( 
1a9a0 70 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  pBuf==0 ) return
1a9b0 20 30 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72   0;.  nRead = fr
1a9c0 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31  ead(pBuf, nIn, 1
1a9d0 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  , in);.  fclose(
1a9e0 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  in);.  if( nRead
1a9f0 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
1aa00 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20  e3_free(pBuf);. 
1aa10 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1aa20 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30  .  pBuf[nIn] = 0
1aa30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20 29  ;.  if( pnByte )
1aa40 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a   *pnByte = nIn;.
1aa50 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
1aa60 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1aa70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1aa80 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ION)./*.** Close
1aa90 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65   a single OpenSe
1aaa0 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64  ssion object and
1aab0 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   release all of 
1aac0 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  its associated.*
1aad0 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  * resources..*/.
1aae0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
1aaf0 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65  ion_close(OpenSe
1ab00 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29  ssion *pSession)
1ab10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
1ab20 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65  ite3session_dele
1ab30 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b  te(pSession->p);
1ab40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1ab50 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29  pSession->zName)
1ab60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1ab70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
1ab80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1ab90 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
1aba0 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b  n->azFilter[i]);
1abb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1abc0 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
1abd0 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65  Filter);.  memse
1abe0 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73  t(pSession, 0, s
1abf0 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f  izeof(OpenSessio
1ac00 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n));.}.#endif../
1ac10 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f  *.** Close all O
1ac20 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63  penSession objec
1ac30 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ts and release a
1ac40 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72 65  ll associated re
1ac50 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20  sources..*/.#if 
1ac60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1ac70 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
1ac80 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
1ac90 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65  on_close_all(She
1aca0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
1acb0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1acc0 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20   i<p->nSession; 
1acd0 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f  i++){.    sessio
1ace0 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73  n_close(&p->aSes
1acf0 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  sion[i]);.  }.  
1ad00 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b  p->nSession = 0;
1ad10 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1ad20 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f  e session_close_
1ad30 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  all(X).#endif../
1ad40 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1ad50 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74  ion of the xFilt
1ad60 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
1ad70 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e  an open session.
1ad80 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61    Omit.** any ta
1ad90 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e  bles named by ".
1ada0 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20  session filter" 
1adb0 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65  but let all othe
1adc0 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e  r table through.
1add0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1ade0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1adf0 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e  SSION).static in
1ae00 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72  t session_filter
1ae10 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e  (void *pCtx, con
1ae20 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
1ae30 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70    OpenSession *p
1ae40 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53  Session = (OpenS
1ae50 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20  ession*)pCtx;.  
1ae60 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1ae70 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46  ; i<pSession->nF
1ae80 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ilter; i++){.   
1ae90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1aea0 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61  glob(pSession->a
1aeb0 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62  zFilter[i], zTab
1aec0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1aed0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1aee0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1aef0 20 54 72 79 20 74 6f 20 64 65 64 75 63 65 20 74   Try to deduce t
1af00 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20  he type of file 
1af10 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20  for zName based 
1af20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20  on its content. 
1af30 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f   Return.** one o
1af40 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  f the SHELL_OPEN
1af50 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a  _* constants..**
1af60 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1af70 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
1af80 72 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 69  r is empty but i
1af90 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69  ts name looks li
1afa0 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68  ke a ZIP.** arch
1afb0 69 76 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74  ive and the dflt
1afc0 5a 69 70 20 66 6c 61 67 20 69 73 20 74 72 75 65  Zip flag is true
1afd0 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74  , then assume it
1afe0 20 69 73 20 61 20 5a 49 50 20 61 72 63 68 69 76   is a ZIP archiv
1aff0 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
1b000 20 61 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e   assume an ordin
1b010 61 72 79 20 64 61 74 61 62 61 73 65 20 72 65 67  ary database reg
1b020 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66  ardless of the f
1b030 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68  ilename if.** th
1b040 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65  e type cannot be
1b050 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d   determined from
1b060 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61   content..*/.sta
1b070 74 69 63 20 69 6e 74 20 64 65 64 75 63 65 44 61  tic int deduceDa
1b080 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74  tabaseType(const
1b090 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
1b0a0 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49  t dfltZip){.  FI
1b0b0 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e  LE *f = fopen(zN
1b0c0 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69  ame, "rb");.  si
1b0d0 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63  ze_t n;.  int rc
1b0e0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
1b0f0 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75  SPEC;.  char zBu
1b100 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d  f[100];.  if( f=
1b110 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66  =0 ){.    if( df
1b120 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33  ltZip && sqlite3
1b130 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22  _strlike("%.zip"
1b140 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 20 72  ,zName,0)==0 ) r
1b150 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1b160 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 72 65  _ZIPFILE;.    re
1b170 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1b180 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73  NORMAL;.  }.  fs
1b190 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b  eek(f, -25, SEEK
1b1a0 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65  _END);.  n = fre
1b1b0 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20  ad(zBuf, 25, 1, 
1b1c0 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
1b1d0 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
1b1e0 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33  Start-Of-SQLite3
1b1f0 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  -", 17)==0 ){.  
1b200 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
1b210 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d  N_APPENDVFS;.  }
1b220 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28  else{.    fseek(
1b230 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44  f, -22, SEEK_END
1b240 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64  );.    n = fread
1b250 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29  (zBuf, 22, 1, f)
1b260 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26  ;.    if( n==1 &
1b270 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20  & zBuf[0]==0x50 
1b280 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62  && zBuf[1]==0x4b
1b290 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30   && zBuf[2]==0x0
1b2a0 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66  5.       && zBuf
1b2b0 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20  [3]==0x06 ){.   
1b2c0 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1b2d0 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1b2e0 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26  }else if( n==0 &
1b2f0 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c  & dfltZip && sql
1b300 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e  ite3_strlike("%.
1b310 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30  zip",zName,0)==0
1b320 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b330 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1b340 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ILE;.    }.  }. 
1b350 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65   fclose(f);.  re
1b360 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a  turn rc;  .}../*
1b370 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1b380 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  e database is op
1b390 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  en.  If it is no
1b3a0 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e  t, then open it.
1b3b0 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61    If.** the data
1b3c0 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70  base fails to op
1b3d0 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72  en, print an err
1b3e0 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65  or message and e
1b3f0 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  xit..*/.static v
1b400 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c  oid open_db(Shel
1b410 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6b  lState *p, int k
1b420 65 65 70 41 6c 69 76 65 29 7b 0a 20 20 69 66 28  eepAlive){.  if(
1b430 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
1b440 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
1b450 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  ==SHELL_OPEN_UNS
1b460 50 45 43 20 26 26 20 61 63 63 65 73 73 28 70 2d  PEC && access(p-
1b470 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 30 29 3d  >zDbFilename,0)=
1b480 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  =0 ){.      p->o
1b490 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65  penMode = (u8)de
1b4a0 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65  duceDatabaseType
1b4b0 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1b4c0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
1b4d0 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d 6f  witch( p->openMo
1b4e0 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
1b4f0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
1b500 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20 20  NDVFS: {.       
1b510 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1b520 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1b530 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20   &p->db, .      
1b540 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b550 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1b560 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 22  E_OPEN_CREATE, "
1b570 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20 20  apndvfs");.     
1b580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b590 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1b5a0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a  LL_OPEN_ZIPFILE:
1b5b0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1b5c0 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
1b5d0 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  :", &p->db);.   
1b5e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b5f0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1b600 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
1b610 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  LY: {.        sq
1b620 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d  lite3_open_v2(p-
1b630 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
1b640 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ->db, SQLITE_OPE
1b650 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a  N_READONLY, 0);.
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 63 61 73       }.      cas
1b680 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  e SHELL_OPEN_UNS
1b690 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  PEC:.      case 
1b6a0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1b6b0 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L: {.        sql
1b6c0 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62  ite3_open(p->zDb
1b6d0 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
1b6e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1b6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b700 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70      globalDb = p
1b710 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d  ->db;.    if( p-
1b720 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  >db==0 || SQLITE
1b730 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
1b740 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
1b750 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1b760 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
1b770 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
1b780 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
1b790 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1b7a0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c   p->zDbFilename,
1b7b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1b7c0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
1b7d0 66 28 20 6b 65 65 70 41 6c 69 76 65 20 29 20 72  f( keepAlive ) r
1b7e0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69  eturn;.      exi
1b7f0 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  t(1);.    }.#ifn
1b800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b810 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
1b820 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c     sqlite3_enabl
1b830 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
1b840 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64  (p->db, 1);.#end
1b850 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  if.    sqlite3_f
1b860 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62  ileio_init(p->db
1b870 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1b880 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e  ite3_shathree_in
1b890 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1b8a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d  .    sqlite3_com
1b8b0 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e  pletion_init(p->
1b8c0 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64 65  db, 0, 0);.#ifde
1b8d0 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  f SQLITE_HAVE_ZL
1b8e0 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 7a  IB.    sqlite3_z
1b8f0 69 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64  ipfile_init(p->d
1b900 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
1b910 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74  lite3_sqlar_init
1b920 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  (p->db, 0, 0);.#
1b930 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
1b940 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1b950 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
1b960 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20  add_schema", 3, 
1b970 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
1b9a0 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20  lAddSchemaName, 
1b9b0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1b9c0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1b9d0 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
1b9e0 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c  _module_schema",
1b9f0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1ba00 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d  shellModuleSchem
1ba30 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  a, 0, 0);.    sq
1ba40 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1ba50 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
1ba60 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20  ell_putsnl", 1, 
1ba70 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a  SQLITE_UTF8, p,.
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
1baa0 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29  lPutsFunc, 0, 0)
1bab0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1bac0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
1bad0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1bae0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1baf0 2c 20 22 65 64 69 74 22 2c 20 31 2c 20 53 51 4c  , "edit", 1, SQL
1bb00 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e           editFun
1bb30 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  c, 0, 0);.    sq
1bb40 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1bb50 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64  ction(p->db, "ed
1bb60 69 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  it", 2, SQLITE_U
1bb70 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30 2c      editFunc, 0,
1bba0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1bbb0 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d  if( p->openMode=
1bbc0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46  =SHELL_OPEN_ZIPF
1bbd0 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ILE ){.      cha
1bbe0 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
1bbf0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1bc00 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52 54      "CREATE VIRT
1bc10 55 41 4c 20 54 41 42 4c 45 20 7a 69 70 20 55 53  UAL TABLE zip US
1bc20 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 3b  ING zipfile(%Q);
1bc30 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  ", p->zDbFilenam
1bc40 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1bc50 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53  3_exec(p->db, zS
1bc60 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
1bc70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1bc80 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
1bc90 7d 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  }.}..#if HAVE_RE
1bca0 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45  ADLINE || HAVE_E
1bcb0 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65  DITLINE./*.** Re
1bcc0 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f  adline completio
1bcd0 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73  n callbacks.*/.s
1bce0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1bcf0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
1bd00 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20  generator(const 
1bd10 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20  char *text, int 
1bd20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63  state){.  static
1bd30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bd40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1bd50 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74   *zRet;.  if( st
1bd60 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ate==0 ){.    ch
1bd70 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71  ar *zSql;.    sq
1bd80 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1bd90 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
1bda0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1bdb0 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
1bdc0 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c  CT candidate COL
1bdd0 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20  LATE nocase".   
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
1be00 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f  completion(%Q) O
1be10 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74  RDER BY 1", text
1be20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
1be30 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
1be40 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
1be50 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
1be60 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1be70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1be80 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1be90 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1bea0 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70     zRet = strdup
1beb0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
1bec0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1bed0 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
1bee0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1bef0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1bf00 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
1bf10 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  0;.    zRet = 0;
1bf20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
1bf30 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61  et;.}.static cha
1bf40 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  r **readline_com
1bf50 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  pletion(const ch
1bf60 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69  ar *zText, int i
1bf70 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29  Start, int iEnd)
1bf80 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64  {.  rl_attempted
1bf90 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72  _completion_over
1bfa0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
1bfb0 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74  l_completion_mat
1bfc0 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64  ches(zText, read
1bfd0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
1bfe0 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23  generator);.}..#
1bff0 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f  elif HAVE_LINENO
1c000 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f  ISE./*.** Lineno
1c010 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ise completion c
1c020 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69  allback.*/.stati
1c030 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65  c void linenoise
1c040 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
1c050 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c  t char *zLine, l
1c060 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69  inenoiseCompleti
1c070 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20  ons *lc){.  int 
1c080 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30  nLine = strlen30
1c090 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69  (zLine);.  int i
1c0a0 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69  , iStart;.  sqli
1c0b0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1c0c0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
1c0d0 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  l;.  char zBuf[1
1c0e0 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69  000];..  if( nLi
1c0f0 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d  ne>sizeof(zBuf)-
1c100 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  30 ) return;.  i
1c110 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  f( zLine[0]=='.'
1c120 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1c130 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30  (i=nLine-1; i>=0
1c140 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69   && (isalnum(zLi
1c150 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b  ne[i]) || zLine[
1c160 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d  i]=='_'); i--){}
1c170 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d  .  if( i==nLine-
1c180 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53  1 ) return;.  iS
1c190 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65  tart = i+1;.  me
1c1a0 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65  mcpy(zBuf, zLine
1c1b0 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71  , iStart);.  zSq
1c1c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1c1d0 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
1c1e0 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
1c1f0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
1c220 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51  completion(%Q,%Q
1c230 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20  ) ORDER BY 1",. 
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69          &zLine[i
1c260 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a  Start], zLine);.
1c270 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1c280 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
1c290 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1c2a0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
1c2b0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c  ree(zSql);.  sql
1c2c0 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
1c2d0 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Db, "PRAGMA page
1c2e0 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30  _count", 0, 0, 0
1c2f0 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73  ); /* Load the s
1c300 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65  chema */.  while
1c310 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1c320 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
1c330 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
1c340 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e  har *zCompletion
1c350 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1c360 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1c370 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
1c380 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69     int nCompleti
1c390 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  on = sqlite3_col
1c3a0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1c3b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74   0);.    if( iSt
1c3c0 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  art+nCompletion 
1c3d0 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  < sizeof(zBuf)-1
1c3e0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1c3f0 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43  (zBuf+iStart, zC
1c400 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70  ompletion, nComp
1c410 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20  letion+1);.     
1c420 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d   linenoiseAddCom
1c430 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66  pletion(lc, zBuf
1c440 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
1c450 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1c460 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pStmt);.}.#endif
1c470 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e  ../*.** Do C-lan
1c480 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75  guage style dequ
1c490 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  oting..**.**    
1c4a0 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a  \a    -> alarm.*
1c4b0 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61  *    \b    -> ba
1c4c0 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74  ckspace.**    \t
1c4d0 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20      -> tab.**   
1c4e0 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e   \n    -> newlin
1c4f0 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e  e.**    \v    ->
1c500 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a   vertical tab.**
1c510 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72      \f    -> for
1c520 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20  m feed.**    \r 
1c530 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72     -> carriage r
1c540 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20  eturn.**    \s  
1c550 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20    -> space.**   
1c560 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
1c570 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20    \'    -> '.** 
1c580 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b     \\    -> back
1c590 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e  slash.**    \NNN
1c5a0 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
1c5b0 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
1c5c0 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l.*/.static void
1c5d0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
1c5e0 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20  shes(char *z){. 
1c5f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
1c600 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  r c;.  while( *z
1c610 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a   && *z!='\\' ) z
1c620 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
1c630 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
1c640 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
1c650 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  f( c=='\\' && z[
1c660 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]!=0 ){.     
1c670 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20   c = z[++i];.   
1c680 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b     if( c=='a' ){
1c690 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61  .        c = '\a
1c6a0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1c6b0 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20  f( c=='b' ){.   
1c6c0 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20       c = '\b';. 
1c6d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1c6e0 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
1c6f0 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
1c700 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e   }else if( c=='n
1c710 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1c720 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\n';.      }el
1c730 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b  se if( c=='v' ){
1c740 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76  .        c = '\v
1c750 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1c760 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20  f( c=='f' ){.   
1c770 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20       c = '\f';. 
1c780 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1c790 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20  =='r' ){.       
1c7a0 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20   c = '\r';.     
1c7b0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
1c7c0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1c7d0 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '"';.      }els
1c7e0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b  e if( c=='\'' ){
1c7f0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27  .        c = '\'
1c800 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1c810 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
1c820 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a        c = '\\';.
1c830 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c840 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27  c>='0' && c<='7'
1c850 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d   ){.        c -=
1c860 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '0';.        if
1c870 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
1c880 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
1c890 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
1c8a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
1c8b0 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
1c8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1c8d0 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
1c8e0 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
1c8f0 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
1c900 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28             c = (
1c910 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
1c920 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0';.          }.
1c930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c940 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
1c950 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
1c960 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  j<i ) z[j] = 0;.
1c970 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
1c980 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
1c990 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
1c9a0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
1c9b0 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
1c9c0 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
1c9d0 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
1c9e0 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
1c9f0 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
1ca00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1ca10 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73  ooleanValue(cons
1ca20 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
1ca30 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
1ca40 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
1ca50 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
1ca60 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69    for(i=2; hexDi
1ca70 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d  gitValue(zArg[i]
1ca80 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  )>=0; i++){}.  }
1ca90 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
1caa0 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20  0; zArg[i]>='0' 
1cab0 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b  && zArg[i]<='9';
1cac0 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66   i++){}.  }.  if
1cad0 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
1cae0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e  ==0 ) return (in
1caf0 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28  t)(integerValue(
1cb00 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66  zArg) & 0xffffff
1cb10 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ff);.  if( sqlit
1cb20 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1cb30 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c   "on")==0 || sql
1cb40 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
1cb50 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20  g,"yes")==0 ){. 
1cb60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1cb70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
1cb80 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66  tricmp(zArg, "of
1cb90 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  f")==0 || sqlite
1cba0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
1cbb0 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  no")==0 ){.    r
1cbc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75  eturn 0;.  }.  u
1cbd0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1cbe0 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61  r, "ERROR: Not a
1cbf0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
1cc00 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67  \"%s\". Assuming
1cc10 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"no\".\n",.   
1cc20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20         zArg);.  
1cc30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1cc40 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
1cc50 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63  a shell flag acc
1cc60 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c  ording to a bool
1cc70 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
1cc80 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43  atic void setOrC
1cc90 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74  learFlag(ShellSt
1cca0 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  ate *p, unsigned
1ccb0 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68   mFlag, const ch
1ccc0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28  ar *zArg){.  if(
1ccd0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41   booleanValue(zA
1cce0 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  rg) ){.    Shell
1ccf0 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  SetFlag(p, mFlag
1cd00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cd10 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
1cd20 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a  , mFlag);.  }.}.
1cd30 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
1cd40 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
1cd50 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
1cd60 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
1cd70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cd80 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
1cd90 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
1cda0 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
1cdb0 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
1cdc0 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
1cdd0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
1cde0 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
1cdf0 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
1ce00 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
1ce10 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
1ce20 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
1ce30 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
1ce40 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
1ce50 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66   the output.** f
1ce60 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
1ce70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
1ce80 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
1ce90 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
1cea0 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d  File, int bTextM
1ceb0 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ode){.  FILE *f;
1cec0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
1ced0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
1cee0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
1cef0 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
1cf00 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
1cf10 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
1cf20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
1cf30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1cf40 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
1cf50 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
1cf60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
1cf70 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54   fopen(zFile, bT
1cf80 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20  extMode ? "w" : 
1cf90 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66  "wb");.    if( f
1cfa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
1cfb0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1cfc0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
1cfd0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
1cfe0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
1cff0 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a  }.  return f;.}.
1d000 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1d010 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
1d020 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1d030 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1d040 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41  G_POINT)./*.** A
1d050 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e   routine for han
1d060 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f  dling output fro
1d070 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  m sqlite3_trace(
1d080 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1d090 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62   sql_trace_callb
1d0a0 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  ack(.  unsigned 
1d0b0 6d 54 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a 70  mType,.  void *p
1d0c0 41 72 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50 2c  Arg,.  void *pP,
1d0d0 0a 20 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a 20  .  void *pX.){. 
1d0e0 20 46 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c 45   FILE *f = (FILE
1d0f0 2a 29 70 41 72 67 3b 0a 20 20 55 4e 55 53 45 44  *)pArg;.  UNUSED
1d100 5f 50 41 52 41 4d 45 54 45 52 28 6d 54 79 70 65  _PARAMETER(mType
1d110 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1d120 4d 45 54 45 52 28 70 50 29 3b 0a 20 20 69 66 28  METER(pP);.  if(
1d130 20 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   f ){.    const 
1d140 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
1d150 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 20 20 69   char*)pX;.    i
1d160 6e 74 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt i = strlen30(
1d170 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  z);.    while( i
1d180 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 3b  >0 && z[i-1]==';
1d190 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ i--; }.    
1d1a0 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20 22  utf8_printf(f, "
1d1b0 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29 3b  %.*s;\n", i, z);
1d1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d1d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d1e0 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65   A no-op routine
1d1f0 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68 20   that runs with 
1d200 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74  the ".breakpoint
1d210 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20  " doc-command.  
1d220 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65  This is.** a use
1d230 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20  ful spot to set 
1d240 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61 6b  a debugger break
1d250 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1d260 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b   void test_break
1d270 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73  point(void){.  s
1d280 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20  tatic int nCall 
1d290 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a  = 0;.  nCall++;.
1d2a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  }../*.** An obje
1d2b0 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  ct used to read 
1d2c0 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20  a CSV and other 
1d2d0 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74  files for import
1d2e0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1d2f0 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d  uct ImportCtx Im
1d300 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20  portCtx;.struct 
1d310 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f  ImportCtx {.  co
1d320 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
1d330 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1d340 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
1d350 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
1d360 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
1d370 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74   CSV text from t
1d380 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d  his input stream
1d390 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1d3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
1d3b0 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f  umulated text fo
1d3c0 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  r a field */.  i
1d3d0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
1d3e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d3f0 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20  bytes in z */.  
1d400 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
1d410 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
1d420 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a  ocated for z[] *
1d430 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
1d440 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1d450 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  nt line number *
1d460 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73  /.  int bNotFirs
1d470 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1d480 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62  if one or more b
1d490 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65 61  ytes already rea
1d4a0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d  d */.  int cTerm
1d4b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;          /* Ch
1d4c0 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
1d4d0 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74  minated the most
1d4e0 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f   recent field */
1d4f0 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20  .  int cColSep; 
1d500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1d510 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63  lumn separator c
1d520 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
1d530 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e  lly ",") */.  in
1d540 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20  t cRowSep;      
1d550 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70    /* The row sep
1d560 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
1d570 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22  .  (Usually "\n"
1d580 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65  ) */.};../* Appe
1d590 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  nd a single byte
1d5a0 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69   to z[] */.stati
1d5b0 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70  c void import_ap
1d5c0 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74  pend_char(Import
1d5d0 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a  Ctx *p, int c){.
1d5e0 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d    if( p->n+1>=p-
1d5f0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70  >nAlloc ){.    p
1d600 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e  ->nAlloc += p->n
1d610 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20  Alloc + 100;.   
1d620 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f   p->z = sqlite3_
1d630 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20  realloc64(p->z, 
1d640 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
1d650 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
1d660 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
1d670 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b  y();.  }.  p->z[
1d680 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29  p->n++] = (char)
1d690 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  c;.}../* Read a 
1d6a0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
1d6b0 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61  CSV text.  Compa
1d6c0 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34 31  tible with rfc41
1d6d0 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a  80 and extended.
1d6e0 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74 69  ** with the opti
1d6f0 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73  on of having a s
1d700 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74  eparator other t
1d710 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20  han ","..**.**  
1d720 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
1d730 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
1d740 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
1d750 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
1d760 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
1d770 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
1d780 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
1d790 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1d7a0 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
1d7b0 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
1d7c0 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
1d7d0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1d7e0 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  s ","..**   +  U
1d7f0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
1d800 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
1d810 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
1d820 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b   "\n"..**   +  K
1d830 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
1d840 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20   line number in 
1d850 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
1d860 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
1d870 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
1d880 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
1d890 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
1d8a0 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
1d8b0 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
1d8c0 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
1d8d0 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
1d8e0 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
1d8f0 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
1d900 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  ECL csv_read_one
1d910 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
1d920 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
1d930 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
1d940 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
1d950 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
1d960 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
1d970 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1d980 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
1d990 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
1d9a0 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
1d9b0 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
1d9c0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d   0;.  }.  if( c=
1d9d0 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='"' ){.    int 
1d9e0 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74  pc, ppc;.    int
1d9f0 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e   startLine = p->
1da00 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63  nLine;.    int c
1da10 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70  Quote = c;.    p
1da20 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20  c = ppc = 0;.   
1da30 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1da40 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1da50 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  in);.      if( c
1da60 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e  ==rSep ) p->nLin
1da70 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  e++;.      if( c
1da80 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
1da90 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
1daa0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
1dab0 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
1dac0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1dad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1dae0 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70      if( (c==cSep
1daf0 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
1db00 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
1db10 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
1db20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1db30 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27  rSep && pc=='\r'
1db40 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29   && ppc==cQuote)
1db50 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45  .       || (c==E
1db60 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  OF && pc==cQuote
1db70 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1db80 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d     do{ p->n--; }
1db90 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e  while( p->z[p->n
1dba0 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20  ]!=cQuote );.   
1dbb0 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
1dbc0 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
1dbd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dbe0 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26  if( pc==cQuote &
1dbf0 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20  & c!='\r' ){.   
1dc00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1dc10 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
1dc20 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63 68   unescaped %c ch
1dc30 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20  aracter\n",.    
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
1dc50 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20  File, p->nLine, 
1dc60 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d  cQuote);.      }
1dc70 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f  .      if( c==EO
1dc80 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  F ){.        utf
1dc90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1dca0 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69   "%s:%d: untermi
1dcb0 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20  nated %c-quoted 
1dcc0 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  field\n",.      
1dcd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
1dce0 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63  le, startLine, c
1dcf0 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
1dd00 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1dd10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72     }.      impor
1dd30 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
1dd40 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d   c);.      ppc =
1dd50 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20   pc;.      pc = 
1dd60 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1dd70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
1dd80 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
1dd90 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65 64  eld being parsed
1dda0 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77   and it begins w
1ddb0 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55  ith the.    ** U
1ddc0 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20  TF-8 BOM  (0xEF 
1ddd0 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70  BB BF) then skip
1dde0 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20   the BOM */.    
1ddf0 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
1de00 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72  ef && p->bNotFir
1de10 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st==0 ){.      i
1de20 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1de30 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
1de40 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1de50 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78  .      if( (c&0x
1de60 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20  ff)==0xbb ){.   
1de70 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
1de80 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
1de90 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63         c = fgetc
1dea0 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  (p->in);.       
1deb0 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1dec0 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xbf ){.         
1ded0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
1dee0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
1def0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1df00 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64   return csv_read
1df10 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20  _one_field(p);. 
1df20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1df30 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1df40 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63  ( c!=EOF && c!=c
1df50 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29  Sep && c!=rSep )
1df60 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
1df70 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1df80 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
1df90 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a  c(p->in);.    }.
1dfa0 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
1dfb0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e  ){.      p->nLin
1dfc0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
1dfd0 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d  ->n>0 && p->z[p-
1dfe0 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d  >n-1]=='\r' ) p-
1dff0 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >n--;.    }.    
1e000 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1e010 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  }.  if( p->z ) p
1e020 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
1e030 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
1e040 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a  1;.  return p->z
1e050 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73  ;.}../* Read a s
1e060 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41  ingle field of A
1e070 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74  SCII delimited t
1e080 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20  ext..**.**   +  
1e090 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d  Input comes from
1e0a0 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20   p->in..**   +  
1e0b0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
1e0c0 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20   p->z of length 
1e0d0 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  p->n.  Space to 
1e0e0 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a  hold p->z comes.
1e0f0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c  **      from sql
1e100 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e  ite3_malloc64().
1e110 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1e120 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75  cSep as the colu
1e130 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  mn separator.  T
1e140 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
1e150 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  x1F"..**   +  Us
1e160 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65  e p->rSep as the
1e170 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
1e180 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
1e190 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1E"..**   +  
1e1a0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1e1b0 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20  e row number in 
1e1c0 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
1e1d0 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
1e1e0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
1e1f0 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
1e200 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
1e210 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
1e220 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
1e230 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
1e240 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
1e250 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
1e260 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
1e270 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  ECL ascii_read_o
1e280 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
1e290 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
1e2a0 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
1e2b0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
1e2c0 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
1e2d0 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
1e2e0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1e2f0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
1e300 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
1e310 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
1e320 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
1e330 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rn 0;.  }.  whil
1e340 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
1e350 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
1e360 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  ){.    import_ap
1e370 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
1e380 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70  .    c = fgetc(p
1e390 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->in);.  }.  if(
1e3a0 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
1e3b0 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a  p->nLine++;.  }.
1e3c0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
1e3d0 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
1e3e0 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72  z[p->n] = 0;.  r
1e3f0 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
1e400 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e  *.** Try to tran
1e410 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74 61  sfer data for ta
1e420 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20  ble zTable.  If 
1e430 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
1e440 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67   while.** moving
1e450 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f   forward, try to
1e460 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20   go backwards.  
1e470 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f  The backwards mo
1e480 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20  vement won't.** 
1e490 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54  work for WITHOUT
1e4a0 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a   ROWID tables..*
1e4b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
1e4c0 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20  yToCloneData(.  
1e4d0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1e4e0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1e4f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e500 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74  Table.){.  sqlit
1e510 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20  e3_stmt *pQuery 
1e520 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1e530 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
1e540 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
1e550 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49   = 0;.  char *zI
1e560 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nsert = 0;.  int
1e570 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c   rc;.  int i, j,
1e580 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65   n;.  int nTable
1e590 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62   = strlen30(zTab
1e5a0 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
1e5b0 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
1e5c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
1e5d0 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
1e5e0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1e5f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1e600 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
1e610 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
1e620 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1e630 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1e640 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1e650 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1e660 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1e670 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1e680 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1e690 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e6a0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1e6b0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1e6c0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1e6d0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1e6e0 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1e6f0 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1e700 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
1e710 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1e720 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
1e730 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
1e740 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20  _malloc64(200 + 
1e750 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20  nTable + n*3);. 
1e760 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20   if( zInsert==0 
1e770 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
1e780 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74  emory();.  sqlit
1e790 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b  e3_snprintf(200+
1e7a0 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a  nTable,zInsert,.
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
1e7d0 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22  NORE INTO \"%s\"
1e7e0 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62   VALUES(?", zTab
1e7f0 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65  le);.  i = strle
1e800 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20  n30(zInsert);.  
1e810 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=1; j<n; j+
1e820 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  +){.    memcpy(z
1e830 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20  Insert+i, ",?", 
1e840 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a  2);.    i += 2;.
1e850 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e    }.  memcpy(zIn
1e860 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29  sert+i, ");", 3)
1e870 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e880 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44  _prepare_v2(newD
1e890 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20  b, zInsert, -1, 
1e8a0 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20  &pInsert, 0);.  
1e8b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
1e8c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1e8d0 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
1e8e0 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1e8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1e900 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1e910 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33  (newDb), sqlite3
1e920 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a  _errmsg(newDb),.
1e930 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1e940 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
1e950 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1e960 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b  .  for(k=0; k<2;
1e970 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65   k++){.    while
1e980 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
1e990 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
1e9a0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1e9b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
1e9c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
1e9d0 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
1e9e0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72  olumn_type(pQuer
1e9f0 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  y, i) ){.       
1ea00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
1ea10 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
1ea20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1ea30 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b  null(pInsert, i+
1ea40 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
1ea50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1ea60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
1ea70 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
1ea80 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
1ea90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1eaa0 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  64(pInsert, i+1,
1eab0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1eac0 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29 29  int64(pQuery,i))
1ead0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1eae0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1eaf0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1eb00 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1eb20 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
1eb30 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
1eb40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
1eb50 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  ble(pQuery,i));.
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1eb70 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1eb80 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
1eb90 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
1eba0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ebb0 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65  _bind_text(pInse
1ebc0 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20  rt, i+1,.       
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
1ebf0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
1ec00 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69 29  n_text(pQuery,i)
1ec10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
1ec30 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
1ec40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1ec50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1ec60 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
1ec70 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ec90 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
1eca0 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
1ecb0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1ecc0 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1ed00 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65  olumn_bytes(pQue
1ed10 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20  ry,i),.         
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43     SQLITE_STATIC
1ed50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1ed60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1ed70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ed80 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a    } /* End for *
1ed90 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1eda0 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72  ite3_step(pInser
1edb0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1edc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1edd0 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26  c!=SQLITE_ROW &&
1ede0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1edf0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1ee00 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1ee10 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22  "Error %d: %s\n"
1ee20 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  , sqlite3_extend
1ee30 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62  ed_errcode(newDb
1ee40 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1ee50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ee60 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
1ee70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ee80 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1ee90 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63  Insert);.      c
1eea0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
1eeb0 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d  (cnt%spinRate)==
1eec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
1eed0 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d  ntf("%c\b", "|/-
1eee0 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74  \\"[(cnt/spinRat
1eef0 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  e)%4]);.        
1ef00 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
1ef10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
1ef20 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20   End while */.  
1ef30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ef40 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20  _DONE ) break;. 
1ef50 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1ef60 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
1ef70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
1ef80 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
1ef90 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1efa0 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
1efb0 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20  OM \"%w\" ORDER 
1efc0 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c  BY rowid DESC;",
1efd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1eff0 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  able);.    rc = 
1f000 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1f010 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
1f020 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
1f030 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1f040 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1f050 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e  tf(stderr, "Warn
1f060 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70  ing: cannot step
1f070 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64   \"%s\" backward
1f080 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
1f090 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f0a0 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b    } /* End for(k
1f0b0 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64  =0...) */..end_d
1f0c0 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69  ata_xfer:.  sqli
1f0d0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
1f0e0 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
1f0f0 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74  finalize(pInsert
1f100 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1f110 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c  e(zQuery);.  sql
1f120 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72  ite3_free(zInser
1f130 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  t);.}.../*.** Tr
1f140 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c  y to transfer al
1f150 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63  l rows of the sc
1f160 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20  hema that match 
1f170 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20  zWhere.  For.** 
1f180 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65  each row, invoke
1f190 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74   xForEach() on t
1f1a0 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65  he object define
1f1b0 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a  d by that row..*
1f1c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
1f1d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
1f1e0 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72  le moving forwar
1f1f0 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a  d through the.**
1f200 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1f210 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20  able, try again 
1f220 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73  moving backwards
1f230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f240 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
1f250 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  a(.  ShellState 
1f260 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e  *p,.  sqlite3 *n
1f270 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  ewDb,.  const ch
1f280 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f  ar *zWhere,.  vo
1f290 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53  id (*xForEach)(S
1f2a0 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74  hellState*,sqlit
1f2b0 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  e3*,const char*)
1f2c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1f2d0 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
1f2e0 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
1f2f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1f300 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1f310 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f  har *zName;.  co
1f320 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1f330 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
1f340 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  *zErrMsg = 0;.. 
1f350 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   zQuery = sqlite
1f360 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
1f370 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d  T name, sql FROM
1f380 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
1f3b0 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b  RE %s", zWhere);
1f3c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1f3d0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1f3e0 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
1f3f0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28  Query, 0);.  if(
1f400 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
1f410 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1f420 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
1f430 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f450 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1f460 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20  errcode(p->db), 
1f470 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1f480 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ->db),.         
1f490 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
1f4a0 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
1f4b0 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20  _schema_xfer;.  
1f4c0 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d  }.  while( (rc =
1f4d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
1f4e0 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
1f4f0 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  OW ){.    zName 
1f500 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1f510 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
1f520 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
1f530 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1f540 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20  (pQuery, 1);.   
1f550 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
1f560 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
1f570 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71  (stdout);.    sq
1f580 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
1f590 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
1f5a0 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
1f5b0 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
1f5c0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
1f5d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1f5e0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53  r, "Error: %s\nS
1f5f0 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72  QL: [%s]\n", zEr
1f600 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  rMsg, zSql);.   
1f610 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f620 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
1f630 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
1f640 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45   }.    if( xForE
1f650 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f  ach ){.      xFo
1f660 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
1f670 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
1f680 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
1f690 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b  rintf("done\n");
1f6a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1f6b0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1f6c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1f6d0 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20  ze(pQuery);.    
1f6e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
1f6f0 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79  ery);.    zQuery
1f700 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1f710 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  tf("SELECT name,
1f720 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
1f730 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
1f760 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
1f770 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a  DESC", zWhere);.
1f780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f790 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
1f7a0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
1f7b0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1f7c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1f7d0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1f7e0 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29  rr, "Error: (%d)
1f7f0 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1f820 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70  tended_errcode(p
1f830 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ->db), sqlite3_e
1f840 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20  rrmsg(p->db),.  
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1f870 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
1f880 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20  ma_xfer;.    }. 
1f890 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
1f8a0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
1f8b0 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
1f8c0 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  W ){.      zName
1f8d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1f8e0 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
1f8f0 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
1f900 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1f910 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a  ext(pQuery, 1);.
1f920 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
1f930 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66  ... ", zName); f
1f940 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
1f950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
1f960 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  c(newDb, (const 
1f970 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30  char*)zSql, 0, 0
1f980 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
1f990 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
1f9a0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1f9b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1f9c0 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
1f9d0 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
1f9e0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
1f9f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
1fa00 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a  rMsg);.        z
1fa10 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
1fa20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46    }.      if( xF
1fa30 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20  orEach ){.      
1fa40 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65    xForEach(p, ne
1fa50 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
1fa60 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  *)zName);.      
1fa70 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
1fa80 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  done\n");.    }.
1fa90 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78    }.end_schema_x
1faa0 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
1fab0 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1fac0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1fad0 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zQuery);.}../*.*
1fae0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1faf0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64  abase file named
1fb00 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20   "zNewDb".  Try 
1fb10 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75  to recover as mu
1fb20 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ch information.*
1fb30 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75  * as possible ou
1fb40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61  t of the main da
1fb50 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d 69  tabase (which mi
1fb60 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29 20  ght be corrupt) 
1fb70 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  and write it.** 
1fb80 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a  into zNewDb..*/.
1fb90 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
1fba0 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74  oClone(ShellStat
1fbb0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1fbc0 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74   *zNewDb){.  int
1fbd0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1fbe0 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28  newDb = 0;.  if(
1fbf0 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30   access(zNewDb,0
1fc00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
1fc10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1fc20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72  "File \"%s\" alr
1fc30 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c  eady exists.\n",
1fc40 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65   zNewDb);.    re
1fc50 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
1fc60 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e   sqlite3_open(zN
1fc70 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20  ewDb, &newDb);. 
1fc80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1fc90 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1fca0 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74  r, "Cannot creat
1fcb0 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61 73  e output databas
1fcc0 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  e: %s\n",.      
1fcd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
1fce0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
1fcf0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1fd00 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
1fd10 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
1fd20 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20  schema=ON;", 0, 
1fd30 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1fd40 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22  e3_exec(newDb, "
1fd50 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
1fd60 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
1fd70 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
1fd80 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70  a(p, newDb, "typ
1fd90 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54  e='table'", tryT
1fda0 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20  oCloneData);.   
1fdb0 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
1fdc0 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70  a(p, newDb, "typ
1fdd0 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b  e!='table'", 0);
1fde0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
1fdf0 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54  c(newDb, "COMMIT
1fe00 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
1fe10 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
1fe20 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72  ->db, "PRAGMA wr
1fe30 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
1fe40 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
1fe50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f   }.  sqlite3_clo
1fe60 73 65 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a  se(newDb);.}../*
1fe70 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
1fe80 75 74 70 75 74 20 66 69 6c 65 20 62 61 63 6b 20  utput file back 
1fe90 74 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a  to stdout..**.**
1fea0 20 49 66 20 74 68 65 20 70 2d 3e 64 6f 58 64 67   If the p->doXdg
1feb0 4f 70 65 6e 20 66 6c 61 67 20 69 73 20 73 65 74  Open flag is set
1fec0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
1fed0 20 6f 75 74 70 75 74 20 77 61 73 20 62 65 69 6e   output was bein
1fee0 67 0a 2a 2a 20 72 65 64 69 72 65 63 74 65 64 20  g.** redirected 
1fef0 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  to a temporary f
1ff00 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 70 2d 3e  ile named by p->
1ff10 7a 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20 74  zTempFile.  In t
1ff20 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61 75  hat case,.** lau
1ff30 6e 63 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f 78  nch start/open/x
1ff40 64 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  dg-open on that 
1ff50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
1ff60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
1ff70 75 74 70 75 74 5f 72 65 73 65 74 28 53 68 65 6c  utput_reset(Shel
1ff80 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66  lState *p){.  if
1ff90 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d  ( p->outfile[0]=
1ffa0 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66 20  ='|' ){.#ifndef 
1ffb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
1ffc0 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e  N.    pclose(p->
1ffd0 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  out);.#endif.  }
1ffe0 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70 75 74  else{.    output
1fff0 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f  _file_close(p->o
20000 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ut);.#ifndef SQL
20010 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
20020 4d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f 58  M.    if( p->doX
20030 64 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  dgOpen ){.      
20040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64 67  const char *zXdg
20050 4f 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64 65  OpenCmd =.#if de
20060 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
20070 20 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65 6c      "start";.#el
20080 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
20090 4c 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70 65  LE__).      "ope
200a0 6e 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  n";.#else.      
200b0 22 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64  "xdg-open";.#end
200c0 69 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  if.      char *z
200d0 43 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64 20  Cmd;.      zCmd 
200e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
200f0 66 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67 4f  f("%s %s", zXdgO
20100 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70  penCmd, p->zTemp
20110 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
20120 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29 7b   system(zCmd) ){
20130 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
20140 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 61  intf(stderr, "Fa
20150 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  iled: [%s]\n", z
20160 43 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cmd);.      }.  
20170 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20180 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f 75  (zCmd);.      ou
20190 74 70 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b 0a  tputModePop(p);.
201a0 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70        p->doXdgOp
201b0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  en = 0;.    }.#e
201c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
201d0 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53  (SQLITE_NOHAVE_S
201e0 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20  YSTEM) */.  }.  
201f0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20  p->outfile[0] = 
20200 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74  0;.  p->out = st
20210 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dout;.}../*.** R
20220 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  un an SQL comman
20230 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
20240 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
20250 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
20260 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65  c int db_int(She
20270 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
20280 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
20290 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
202a0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20  Stmt;.  int res 
202b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  = 0;.  sqlite3_p
202c0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
202d0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
202e0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  t, 0);.  if( pSt
202f0 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  mt && sqlite3_st
20300 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
20310 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73  E_ROW ){.    res
20320 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
20330 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a  n_int(pStmt,0);.
20340 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
20350 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
20360 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
20370 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
20380 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65  2-byte or 4-byte
20390 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
203a0 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76  ger into a nativ
203b0 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61  e integer.*/.sta
203c0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
203d0 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73   get2byteInt(uns
203e0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
203f0 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
20400 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + a[1];.}.sta
20410 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
20420 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73   get4byteInt(uns
20430 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
20440 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
20450 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29  24) + (a[1]<<16)
20460 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
20470 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  [3];.}../*.** Im
20480 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20490 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d  the ".info" comm
204a0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
204b0 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
204c0 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
204d0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
204e0 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62  tic int shell_db
204f0 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65  info_command(She
20500 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
20510 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
20520 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rg){.  static co
20530 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
20540 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
20550 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65  int ofst; } aFie
20560 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ld[] = {.     { 
20570 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75  "file change cou
20580 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a  nter:",  24  },.
20590 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
205a0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
205b0 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  28  },.     { "f
205c0 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75  reelist page cou
205d0 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20  nt:",  36  },.  
205e0 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f     { "schema coo
205f0 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30  kie:",        40
20600 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
20610 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20  ema format:",   
20620 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20       44  },.    
20630 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68   { "default cach
20640 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20  e size:",   48  
20650 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76  },.     { "autov
20660 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22  acuum top root:"
20670 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  52  },.     {
20680 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61   "incremental va
20690 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c  cuum:",   64  },
206a0 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e  .     { "text en
206b0 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20  coding:",       
206c0 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   56  },.     { "
206d0 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20  user version:", 
206e0 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20          60  },. 
206f0 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69      { "applicati
20700 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36  on id:",       6
20710 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  8  },.     { "so
20720 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22  ftware version:"
20730 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d  ,     96  },.  }
20740 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
20750 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
20760 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e  char *zName; con
20770 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d  st char *zSql; }
20780 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20   aQuery[] = {.  
20790 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
207a0 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20  tables:",.      
207b0 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
207c0 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
207d0 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c  type='table'" },
207e0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
207f0 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20  of indexes:",.  
20800 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
20810 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
20820 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
20830 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
20840 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a  ber of triggers:
20850 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
20860 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
20870 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
20880 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20  rigger'" },.    
20890 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69   { "number of vi
208a0 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ews:",.       "S
208b0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
208c0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
208d0 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20  e='view'" },.   
208e0 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65    { "schema size
208f0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
20900 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28  CT total(length(
20910 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d  sql)) FROM %s" }
20920 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
20930 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54    char *zSchemaT
20940 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  ab;.  char *zDb 
20950 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
20960 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
20970 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20980 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69  Stmt = 0;.  unsi
20990 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
209a0 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70  00];.  open_db(p
209b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  , 0);.  if( p->d
209c0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
209d0 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
209e0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c  re_v2(p->db,"SEL
209f0 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71  ECT data FROM sq
20a00 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20  lite_dbpage(?1) 
20a10 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20  WHERE pgno=1",. 
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
20a40 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  0);.  sqlite3_bi
20a50 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
20a60 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54  , zDb, -1, SQLIT
20a70 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
20a80 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
20a90 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
20aa0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63  .   && sqlite3_c
20ab0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
20ac0 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20  t,0)>100.  ){.  
20ad0 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73    memcpy(aHdr, s
20ae0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
20af0 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30  ob(pStmt,0), 100
20b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20b10 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
20b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
20b30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20b40 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "unable to read 
20b50 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c  database header\
20b60 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
20b70 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
20b80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
20b90 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79    }.  i = get2by
20ba0 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a  teInt(aHdr+16);.
20bb0 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d    if( i==1 ) i =
20bc0 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70   65536;.  utf8_p
20bd0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
20be0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74  -20s %d\n", "dat
20bf0 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a  abase page size:
20c00 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72  ", i);.  utf8_pr
20c10 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
20c20 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74  20s %d\n", "writ
20c30 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  e format:", aHdr
20c40 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [18]);.  utf8_pr
20c50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
20c60 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64  20s %d\n", "read
20c70 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
20c80 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  19]);.  utf8_pri
20c90 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
20ca0 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72  0s %d\n", "reser
20cb0 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64  ved bytes:", aHd
20cc0 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  r[20]);.  for(i=
20cd0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
20ce0 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20  Field); i++){.  
20cf0 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69    int ofst = aFi
20d00 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20  eld[i].ofst;.   
20d10 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61   unsigned int va
20d20 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28  l = get4byteInt(
20d30 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20  aHdr + ofst);.  
20d40 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
20d50 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22  >out, "%-20s %u"
20d60 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d  , aField[i].zNam
20d70 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69  e, val);.    swi
20d80 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20  tch( ofst ){.   
20d90 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20     case 56: {.  
20da0 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31        if( val==1
20db0 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
20dc0 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29  >out, " (utf8)")
20dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61  ;.        if( va
20de0 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74  l==2 ) raw_print
20df0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
20e00 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20  16le)");.       
20e10 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61   if( val==3 ) ra
20e20 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
20e30 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a   " (utf16be)");.
20e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20e50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
20e60 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  out, "\n");.  }.
20e70 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a    if( zDb==0 ){.
20e80 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
20e90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20ea0 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  ("main.sqlite_ma
20eb0 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ster");.  }else 
20ec0 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22  if( strcmp(zDb,"
20ed0 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  temp")==0 ){.   
20ee0 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
20ef0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
20f00 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  s", "sqlite_temp
20f10 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c  _master");.  }el
20f20 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54  se{.    zSchemaT
20f30 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
20f40 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c  intf("\"%w\".sql
20f50 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62  ite_master", zDb
20f60 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
20f70 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51  ; i<ArraySize(aQ
20f80 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  uery); i++){.   
20f90 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
20fa0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51  lite3_mprintf(aQ
20fb0 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53  uery[i].zSql, zS
20fc0 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69  chemaTab);.    i
20fd0 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28  nt val = db_int(
20fe0 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71  p, zSql);.    sq
20ff0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
21000 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
21010 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
21020 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69   %d\n", aQuery[i
21030 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20  ].zName, val);. 
21040 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
21050 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20  e(zSchemaTab);. 
21060 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21070 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75  .** Print the cu
21080 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  rrent sqlite3_er
21090 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20  rmsg() value to 
210a0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
210b0 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
210c0 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  nt shellDatabase
210d0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64  Error(sqlite3 *d
210e0 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
210f0 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
21100 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75  _errmsg(db);.  u
21110 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21120 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
21130 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  , zErr);.  retur
21140 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
21150 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72  mpare the patter
21160 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61  n in zGlob[] aga
21170 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e  inst the text in
21180 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52   z[].  Return TR
21190 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61  UE.** if they ma
211a0 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30  tch and FALSE (0
211b0 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  ) if they do not
211c0 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c   match..**.** Gl
211d0 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
211e0 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
211f0 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
21200 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
21210 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
21220 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
21230 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
21240 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
21250 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
21260 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
21270 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
21280 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
21290 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
212b0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
212c0 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
212d0 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
212e0 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
212f0 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
21300 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20  **.**      '#'  
21310 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
21320 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65   sequence of one
21330 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20   or more digits 
21340 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20  with an.**      
21350 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e            option
21360 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69  al + or - sign i
21370 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20  n front.**.**   
21380 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79     ' '       Any
21390 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70   span of whitesp
213a0 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20  ace matches any 
213b0 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a  other span of.**
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a  whitespace..**.*
213e0 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61  * Extra whitespa
213f0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
21400 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e   z[] is ignored.
21410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
21420 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e  estcase_glob(con
21430 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20  st char *zGlob, 
21440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
21450 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69    int c, c2;.  i
21460 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74  nt invert;.  int
21470 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28   seen;..  while(
21480 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b   (c = (*(zGlob++
21490 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  )))!=0 ){.    if
214a0 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a  ( IsSpace(c) ){.
214b0 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61        if( !IsSpa
214c0 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  ce(*z) ) return 
214d0 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
214e0 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20  IsSpace(*zGlob) 
214f0 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20  ) zGlob++;.     
21500 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
21510 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
21520 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20  else if( c=='*' 
21530 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
21540 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29  (c=(*(zGlob++)))
21550 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f   == '*' || c=='?
21560 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
21570 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b   c=='?' && (*(z+
21580 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
21590 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
215a0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
215b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
215c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
215d0 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
215e0 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65   while( *z && te
215f0 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
21600 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  b-1,z)==0 ){.   
21610 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
21620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
21630 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20  turn (*z)!=0;.  
21640 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
21650 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29  e( (c2 = (*(z++)
21660 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
21670 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b   while( c2!=c ){
21680 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
21690 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  *(z++);.        
216a0 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
216b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
216c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  }.        if( te
216d0 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
216e0 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b  b,z) ) return 1;
216f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21700 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
21710 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b  se if( c=='?' ){
21720 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b  .      if( (*(z+
21730 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
21740 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
21750 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
21760 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30   int prior_c = 0
21770 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30  ;.      seen = 0
21780 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d  ;.      invert =
21790 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28   0;.      c = *(
217a0 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  z++);.      if( 
217b0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
217c0 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47  .      c2 = *(zG
217d0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  lob++);.      if
217e0 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20  ( c2=='^' ){.   
217f0 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b       invert = 1;
21800 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
21810 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
21820 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
21830 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
21840 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e  f( c==']' ) seen
21850 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
21860 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
21870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
21880 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
21890 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
218a0 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f   c2=='-' && zGlo
218b0 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c  b[0]!=']' && zGl
218c0 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f  ob[0]!=0 && prio
218d0 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  r_c>0 ){.       
218e0 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
218f0 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
21900 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20  ( c>=prior_c && 
21910 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31  c<=c2 ) seen = 1
21920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  ;.          prio
21930 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r_c = 0;.       
21940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21950 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20    if( c==c2 ){. 
21960 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20             seen 
21970 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
21980 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
21990 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20  _c = c2;.       
219a0 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20   }.        c2 = 
219b0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
219c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
219d0 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
219e0 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
219f0 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
21a00 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20  if( c=='#' ){.  
21a10 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27      if( (z[0]=='
21a20 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29  -' || z[0]=='+')
21a30 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d   && IsDigit(z[1]
21a40 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69  ) ) z++;.      i
21a50 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d  f( !IsDigit(z[0]
21a60 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
21a70 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77      z++;.      w
21a80 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b  hile( IsDigit(z[
21a90 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  0]) ){ z++; }.  
21aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
21ab0 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29  f( c!=(*(z++)) )
21ac0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21ad0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73  .  }.  while( Is
21ae0 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b  Space(*z) ){ z++
21af0 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d  ; }.  return *z=
21b00 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  =0;.}.../*.** Co
21b10 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67  mpare the string
21b20 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69   as a command-li
21b30 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65  ne option with e
21b40 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f  ither one or two
21b50 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20  .** initial "-" 
21b60 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
21b70 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e  tatic int option
21b80 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
21b90 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
21ba0 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28  ar *zOpt){.  if(
21bb0 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20   zStr[0]!='-' ) 
21bc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72  return 0;.  zStr
21bd0 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30  ++;.  if( zStr[0
21be0 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b  ]=='-' ) zStr++;
21bf0 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
21c00 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b  (zStr, zOpt)==0;
21c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
21c20 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   a file..*/.int 
21c30 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28  shellDeleteFile(
21c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21c50 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63  ename){.  int rc
21c60 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ;.#ifdef _WIN32.
21c70 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
21c80 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
21c90 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69  8_to_unicode(zFi
21ca0 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
21cb0 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73  _wunlink(z);.  s
21cc0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
21cd0 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c  #else.  rc = unl
21ce0 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
21cf0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
21d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  rc;.}../*.** Try
21d10 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
21d20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69  emporary file (i
21d30 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20  f there is one) 
21d40 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20  and free the.** 
21d50 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68  memory used to h
21d60 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  old the name of 
21d70 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a  the temp file..*
21d80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
21d90 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c  earTempFile(Shel
21da0 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66  lState *p){.  if
21db0 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
21dc0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
21dd0 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
21de0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
21df0 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70  hellDeleteFile(p
21e00 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72  ->zTempFile) ) r
21e10 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
21e20 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69  _free(p->zTempFi
21e30 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46  le);.  p->zTempF
21e40 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ile = 0;.}../*.*
21e50 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74  * Create a new t
21e60 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69  emp file name wi
21e70 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66  th the given suf
21e80 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fix..*/.static v
21e90 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28  oid newTempFile(
21ea0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
21eb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66  onst char *zSuff
21ec0 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70  ix){.  clearTemp
21ed0 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  File(p);.  sqlit
21ee0 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
21ef0 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
21f00 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28  pFile = 0;.  if(
21f10 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
21f20 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
21f30 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c  ol(p->db, 0, SQL
21f40 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
21f50 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d  LENAME, &p->zTem
21f60 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
21f70 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
21f80 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
21f90 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73  _uint64 r;.    s
21fa0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
21fb0 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
21fc0 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69  ;.    p->zTempFi
21fd0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
21fe0 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25  intf("temp%llx.%
21ff0 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b  s", r, zSuffix);
22000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
22010 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c  >zTempFile = sql
22020 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
22030 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69  .%s", p->zTempFi
22040 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20  le, zSuffix);.  
22050 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
22060 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  File==0 ){.    r
22070 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
22080 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
22090 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
220a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
220b0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
220c0 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61  ion of SQL scala
220d0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f  r function fkey_
220e0 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29  collate_clause()
220f0 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  , used.** by the
22100 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64   ".lint fkey-ind
22110 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  exes" command. T
22120 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74  his scalar funct
22130 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ion is always.**
22140 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75   called with fou
22150 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68  r arguments - th
22160 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  e parent table n
22170 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  ame, the parent 
22180 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20  column name,.** 
22190 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
221a0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69  name and the chi
221b0 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  ld column name..
221c0 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c  **.**   fkey_col
221d0 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72  late_clause('par
221e0 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e  ent-tab', 'paren
221f0 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74  t-col', 'child-t
22200 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27  ab', 'child-col'
22210 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ).**.** If eithe
22220 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  r of the named t
22230 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73  ables or columns
22240 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74   do not exist, t
22250 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
22260 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79  returns an empty
22270 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74   string. An empt
22280 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f  y string is also
22290 20 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74   returned if bot
222a0 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20  h tables.** and 
222b0 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75  columns exist bu
222c0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
222d0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
222e0 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a  n sequence. Or,.
222f0 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74  ** if both exist
22300 20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74   but the default
22310 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
22320 6e 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65  nces are differe
22330 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  nt, this.** func
22340 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
22350 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54   string " COLLAT
22360 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  E <parent-collat
22370 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20  ion>", where.** 
22380 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
22390 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  n> is the defaul
223a0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
223b0 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65  ence of the pare
223c0 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  nt column..*/.st
223d0 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46  atic void shellF
223e0 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
223f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
22400 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  ext *pCtx,.  int
22410 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
22420 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
22430 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22440 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
22450 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
22460 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
22470 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73  *zParent;.  cons
22480 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43  t char *zParentC
22490 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
224a0 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20   *zParentSeq;.  
224b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
224c0 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ld;.  const char
224d0 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63   *zChildCol;.  c
224e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
224f0 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  dSeq = 0;  /* In
22500 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69  itialize to avoi
22510 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  d false-positive
22520 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   warning */.  in
22530 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
22540 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50   nVal==4 );.  zP
22550 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63  arent = (const c
22560 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
22570 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
22580 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20  );.  zParentCol 
22590 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
225a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
225b0 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a  t(apVal[1]);.  z
225c0 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63  Child = (const c
225d0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
225e0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
225f0 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d  );.  zChildCol =
22600 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
22610 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
22620 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73  (apVal[3]);..  s
22630 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
22640 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c  xt(pCtx, "", -1,
22650 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
22660 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22670 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
22680 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c  adata(.      db,
22690 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74   "main", zParent
226a0 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c  , zParentCol, 0,
226b0 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c   &zParentSeq, 0,
226c0 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
226d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
226e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
226f0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
22700 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20  metadata(.      
22710 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43    db, "main", zC
22720 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c  hild, zChildCol,
22730 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20   0, &zChildSeq, 
22740 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  0, 0, 0.    );. 
22750 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
22760 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
22770 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65  e3_stricmp(zPare
22780 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71  ntSeq, zChildSeq
22790 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
227a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
227b0 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22  tf(" COLLATE %s"
227c0 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20  , zParentSeq);. 
227d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
227e0 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
227f0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
22800 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
22810 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
22820 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
22830 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
22840 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69  dot-command ".li
22850 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
22860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22870 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
22880 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
22890 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
228a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
228b0 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
228c0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
228d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
228e0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
228f0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
22900 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
22910 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22940 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
22950 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  rg[] */.){.  sql
22960 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74  ite3 *db = pStat
22970 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
22980 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
22990 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20  to query "main" 
229a0 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20  db of */.  FILE 
229b0 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
229c0 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ut;        /* St
229d0 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f  ream to write no
229e0 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74  n-error output t
229f0 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62  o */.  int bVerb
22a00 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ose = 0;        
22a10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65         /* If -ve
22a20 72 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74  rbose is present
22a30 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70   */.  int bGroup
22a40 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20  ByParent = 0;   
22a50 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f        /* If -gro
22a60 75 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72  upbyparent is pr
22a70 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esent */.  int i
22a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
22aa0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
22ab0 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f   azArg[] */.  co
22ac0 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e  nst char *zInden
22ad0 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a  t = "";       /*
22ae0 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64   How much to ind
22af0 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  ent CREATE INDEX
22b00 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   by */.  int rc;
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22b30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
22b40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20  ite3_stmt *pSql 
22b50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
22b60 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e  Compiled version
22b70 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   of SQL statemen
22b80 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a  t below */..  /*
22b90 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43  .  ** This SELEC
22ba0 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  T statement retu
22bb0 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20  rns one row for 
22bc0 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79  each foreign key
22bd0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a   constraint.  **
22be0 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f   in the schema o
22bf0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
22c00 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ase. The column 
22c10 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a  values are:.  **
22c20 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78  .  ** 0. The tex
22c30 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
22c40 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f  ement similar to
22c50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22c60 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
22c70 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52  PLAN SELECT 1 FR
22c80 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57  OM child_table W
22c90 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f  HERE child_key=?
22ca0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54  ".  **.  **    T
22cb0 68 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69  his SELECT is si
22cc0 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65  milar to the one
22cd0 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
22ce0 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74  n keys implement
22cf0 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65  ation.  **    ne
22d00 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72  eds to run inter
22d10 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74  nally on child t
22d20 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20  ables. If there 
22d30 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
22d40 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20   can.  **    be 
22d50 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
22d60 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
22d70 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65  n it can also be
22d80 20 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a   used by the FK.
22d90 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e    **    implemen
22da0 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69  tation to optimi
22db0 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44  ze DELETE or UPD
22dc0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ATE statements o
22dd0 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a  n the parent.  *
22de0 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  *    table..  **
22df0 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20  .  ** 1. A GLOB 
22e00 70 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65  pattern suitable
22e10 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72   for sqlite3_str
22e20 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70  glob(). If the p
22e30 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20  lan output by.  
22e40 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49  **    the EXPLAI
22e50 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
22e60 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69  mand matches thi
22e70 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
22e80 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  the schema.  ** 
22e90 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69     contains an i
22ea0 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
22eb0 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
22ec0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
22ed0 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20  *.  ** 2. Human 
22ee0 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68  readable text th
22ef0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
22f00 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64   child table and
22f10 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20   columns. e.g.. 
22f20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
22f30 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c  child_table(chil
22f40 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65  d_key1, child_ke
22f50 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33  y2)".  **.  ** 3
22f60 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  . Human readable
22f70 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72   text that descr
22f80 69 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  ibes the parent 
22f90 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
22fa0 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  s. e.g..  **.  *
22fb0 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f  *       "parent_
22fc0 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79  table(parent_key
22fd0 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22  1, parent_key2)"
22fe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20  .  **.  ** 4. A 
22ff0 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45  full CREATE INDE
23000 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  X statement for 
23010 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
23020 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20  uld be used to. 
23030 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20   **    optimize 
23040 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
23050 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74   statements on t
23060 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
23070 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
23080 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
23090 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f  DEX child_table_
230a0 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69  child_key ON chi
230b0 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b  ld_table(child_k
230c0 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35  ey)".  **.  ** 5
230d0 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  . The name of th
230e0 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a  e parent table..
230f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20    **.  ** These 
23100 73 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75  six values are u
23110 73 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67  sed by the C log
23120 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65  ic below to gene
23130 72 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e  rate the report.
23140 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  .  */.  const ch
23150 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45  ar *zSql =.  "SE
23160 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20  LECT ".    "    
23170 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   'EXPLAIN QUERY 
23180 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52  PLAN SELECT 1 FR
23190 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  OM ' || quote(s.
231a0 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45  name) || ' WHERE
231b0 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72   '".    "  || gr
231c0 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65  oup_concat(quote
231d0 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20  (s.name) || '.' 
231e0 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d  || quote(f.[from
231f0 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20  ]) || '=?' ".   
23200 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c   "  || fkey_coll
23210 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20  ate_clause(".   
23220 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c   "       f.[tabl
23230 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b  e], COALESCE(f.[
23240 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20  to], p.[name]), 
23250 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d  s.name, f.[from]
23260 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20  ),' AND ')".    
23270 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  ", ".    "     '
23280 53 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c  SEARCH TABLE ' |
23290 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53  | s.name || ' US
232a0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
232b0 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  EX*('".    "  ||
232c0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a   group_concat('*
232d0 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c  =?', ' AND ') ||
232e0 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20   ')'".    ", ". 
232f0 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20     "     s.name 
23300 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70   || '(' || group
23310 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d  _concat(f.[from]
23320 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22  ,  ', ') || ')'"
23330 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
23340 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c      f.[table] ||
23350 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f   '(' || group_co
23360 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e  ncat(COALESCE(f.
23370 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29  [to], p.[name]))
23380 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
23390 22 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45  ".    "     'CRE
233a0 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71  ATE INDEX ' || q
233b0 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f  uote(s.name ||'_
233c0 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  '|| group_concat
233d0 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29  (f.[from], '_'))
233e0 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e  ".    "  || ' ON
233f0 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
23400 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20  me) || '('".    
23410 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  "  || group_conc
23420 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d  at(quote(f.[from
23430 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20  ]) ||".    "    
23440 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65      fkey_collate
23450 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20  _clause(".    " 
23460 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c           f.[tabl
23470 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b  e], COALESCE(f.[
23480 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20  to], p.[name]), 
23490 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d  s.name, f.[from]
234a0 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20  ), ', ')".    " 
234b0 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c   || ');'".    ",
234c0 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b   ".    "     f.[
234d0 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52  table] ".    "FR
234e0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
234f0 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f   AS s, pragma_fo
23500 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73  reign_key_list(s
23510 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20  .name) AS f ".  
23520 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61    "LEFT JOIN pra
23530 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41  gma_table_info A
23540 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71  S p ON (pk-1=seq
23550 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61   AND p.arg=f.[ta
23560 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f  ble]) ".    "GRO
23570 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e  UP BY s.name, f.
23580 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20  id ".    "ORDER 
23590 42 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20  BY (CASE WHEN ? 
235a0 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45  THEN f.[table] E
235b0 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22  LSE s.name END)"
235c0 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  .  ;.  const cha
235d0 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53  r *zGlobIPK = "S
235e0 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53  EARCH TABLE * US
235f0 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
23600 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
23610 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20  )";..  for(i=2; 
23620 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
23630 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
23640 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  30(azArg[i]);.  
23650 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c    if( n>1 && sql
23660 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
23670 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b  verbose", azArg[
23680 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  i], n)==0 ){.   
23690 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b     bVerbose = 1;
236a0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
236b0 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74  if( n>1 && sqlit
236c0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72  e3_strnicmp("-gr
236d0 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a  oupbyparent", az
236e0 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b  Arg[i], n)==0 ){
236f0 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50  .      bGroupByP
23700 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  arent = 1;.     
23710 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20   zIndent = "    
23720 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ";.    }.    els
23730 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
23740 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
23750 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62  ge: %s %s ?-verb
23760 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61  ose? ?-groupbypa
23770 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20  rent?\n",.      
23780 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a      azArg[0], az
23790 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a  Arg[1].      );.
237a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
237b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
237c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
237d0 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c  ter the fkey_col
237e0 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51  late_clause() SQ
237f0 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  L function */.  
23800 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
23810 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
23820 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63   "fkey_collate_c
23830 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54  lause", 4, SQLIT
23840 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c  E_UTF8,.      0,
23850 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74   shellFkeyCollat
23860 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20  eClause, 0, 0.  
23870 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  );...  if( rc==S
23880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23890 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
238a0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
238b0 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b  , -1, &pSql, 0);
238c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
238d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
238e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
238f0 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70  (pSql, 1, bGroup
23900 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a  ByParent);.  }..
23910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23920 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
23930 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  c2;.    char *zP
23940 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  rev = 0;.    whi
23950 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
23960 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
23970 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l) ){.      int 
23980 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  res = -1;.      
23990 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
239a0 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  xplain = 0;.    
239b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
239c0 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  QP = (const char
239d0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
239e0 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a  _text(pSql, 0);.
239f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
23a00 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74   *zGlob = (const
23a10 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
23a20 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
23a30 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   1);.      const
23a40 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28   char *zFrom = (
23a50 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
23a60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
23a70 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20  pSql, 2);.      
23a80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
23a90 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  get = (const cha
23aa0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
23ab0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b  n_text(pSql, 3);
23ac0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
23ad0 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20  r *zCI = (const 
23ae0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
23af0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
23b00 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  4);.      const 
23b10 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20  char *zParent = 
23b20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
23b30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
23b40 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20  (pSql, 5);..    
23b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
23b60 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
23b70 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
23b80 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
23b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
23bb0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
23bc0 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
23bd0 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ain) ){.        
23be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61  const char *zPla
23bf0 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
23c00 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
23c10 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
23c20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  );.        res =
23c30 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
23c40 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
23c50 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e  lob(zGlob, zPlan
23c60 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
23c70 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
23c80 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c  ob(zGlobIPK, zPl
23c90 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  an).        );. 
23ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
23cb0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
23cc0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
23cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23ce0 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a  TE_OK ) break;..
23cf0 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
23d00 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
23d10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
23d20 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65  rror: internal e
23d30 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20  rror");.        
23d40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
23d50 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
23d60 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20  bGroupByParent. 
23d70 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62         && (bVerb
23d80 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20  ose || res==0). 
23d90 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76         && (zPrev
23da0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
23db0 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20  tricmp(zParent, 
23dc0 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20  zPrev)).        
23dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
23de0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
23df0 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73   Parent table %s
23e00 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  \n", zParent);. 
23e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23e20 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20  _free(zPrev);.  
23e30 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20          zPrev = 
23e40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
23e50 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  "%s", zParent);.
23e60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23e70 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
23e80 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
23e90 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73  rintf(out, "%s%s
23ea0 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64   --> %s\n", zInd
23eb0 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65  ent, zCI, zTarge
23ec0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
23ed0 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29  e if( bVerbose )
23ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
23ef0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f  printf(out, "%s/
23f00 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78  * no extra index
23f10 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
23f20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a  %s -> %s */\n",.
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49                zI
23f40 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54  ndent, zFrom, zT
23f50 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20  arget.          
23f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
23f80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
23f90 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21  v);..    if( rc!
23fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23fb0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
23fc0 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
23fd0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
23fe0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ));.    }..    r
23ff0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
24000 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20  alize(pSql);.   
24010 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24020 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54  OK && rc2!=SQLIT
24030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
24040 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61   = rc2;.      ra
24050 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24060 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
24070 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
24080 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
24090 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
240a0 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  rr, "%s\n", sqli
240b0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
240c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
240d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
240e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
240f0 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e  lint" dot comman
24100 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24110 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28   lintDotCommand(
24120 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
24130 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
24140 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
24150 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
24160 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
24170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24180 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
24190 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
241a0 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
241b0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
241e0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
241f0 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rg[] */.){.  int
24200 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e   n;.  n = (nArg>
24210 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a  =2 ? strlen30(az
24220 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20  Arg[1]) : 0);.  
24230 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74  if( n<1 || sqlit
24240 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72  e3_strnicmp(azAr
24250 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65  g[1], "fkey-inde
24260 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20  xes", n) ) goto 
24270 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  usage;.  return 
24280 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
24290 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e  pState, azArg, n
242a0 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20  Arg);.. usage:. 
242b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
242c0 72 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75  rr, "Usage %s su
242d0 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63  b-command ?switc
242e0 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72  hes...?\n", azAr
242f0 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69  g[0]);.  raw_pri
24300 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65  ntf(stderr, "Whe
24310 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20  re sub-commands 
24320 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f  are:\n");.  raw_
24330 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24340 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
24350 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  \n");.  return S
24360 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
24370 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
24380 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
24390 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
243a0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
243b0 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  IB)./***********
243c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24400 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e  ******.** The ".
24410 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72  archive" or ".ar
24420 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  " command..*/.st
24430 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
24440 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  repare(.  sqlite
24450 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
24460 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rc, .  const cha
24470 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69  r *zSql, .  sqli
24480 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
24490 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  t.){.  *ppStmt =
244a0 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
244b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
244c0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
244d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
244e0 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
244f0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
24500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24510 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
24520 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72  (stderr, "sql er
24530 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c  ror: %s (%d)\n",
24540 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
24550 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
24560 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
24570 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  db).      );.   
24580 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
24590 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
245a0 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70  c void shellPrep
245b0 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c  arePrintf(.  sql
245c0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
245d0 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
245e0 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
245f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24600 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  Fmt, .  ....){. 
24610 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
24620 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
24630 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69  _OK ){.    va_li
24640 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20  st ap;.    char 
24650 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  *z;.    va_start
24660 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20  (ap, zFmt);.    
24670 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
24680 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
24690 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
246a0 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
246b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
246c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c  else{.      shel
246d0 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70 52 63  lPrepare(db, pRc
246e0 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20  , z, ppStmt);.  
246f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24700 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  (z);.    }.  }.}
24710 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
24720 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69  ellFinalize(.  i
24730 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
24740 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
24750 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ){.  if( pStmt )
24760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
24770 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  b = sqlite3_db_h
24780 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20  andle(pStmt);.  
24790 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
247a0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
247b0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  t);.    if( *pRc
247c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
247d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
247e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
247f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
24800 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
24810 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
24820 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
24830 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20     }.      *pRc 
24840 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = rc;.    }.  }.
24850 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
24860 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74  hellReset(.  int
24870 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
24880 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
24890 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
248a0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
248b0 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
248c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
248d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
248e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
248f0 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
24900 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
24910 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
24920 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
24930 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
24940 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
24950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  );.    }.    *pR
24960 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a  c = rc;.  }.}./*
24970 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65  .** Structure re
24980 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e  presenting a sin
24990 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e  gle ".ar" comman
249a0 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  d..*/.typedef st
249b0 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41  ruct ArCommand A
249c0 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74  rCommand;.struct
249d0 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75   ArCommand {.  u
249e0 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  8 eCmd;         
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a00 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61  * An AR_CMD_* va
24a10 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72  lue */.  u8 bVer
24a20 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
24a30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24a40 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f   if --verbose */
24a50 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20  .  u8 bZip;     
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
24a80 65 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a  e archive is a Z
24a90 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52  IP */.  u8 bDryR
24aa0 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  un;             
24ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24ac0 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a  if --dry-run */.
24ad0 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20    u8 bAppend;   
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61    /* True if --a
24b00 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ppend */.  int n
24b10 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
24b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24b30 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  mber of command 
24b40 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
24b50 68 61 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20  har *zSrcTable; 
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b70 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66  * "sqlar", "zipf
24b80 69 6c 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22  ile($file)" or "
24b90 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zip" */.  const 
24ba0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
24bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66            /* --f
24bc0 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72  ile argument, or
24bd0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
24be0 20 63 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20   char *zDir;    
24bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d             /* --
24c00 64 69 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65  directory argume
24c10 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  nt, or NULL */. 
24c20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20   char **azArg;  
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d   /* Array of com
24c50 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
24c60 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
24c70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
24c80 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61      /* Shell sta
24c90 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
24ca0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
24cb0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
24cc0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
24cd0 68 65 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b  he archive */.};
24ce0 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
24cf0 75 73 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f  usage message fo
24d00 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e  r the .ar comman
24d10 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20  d to stderr and 
24d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24d30 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
24d40 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c 45 20  nt arUsage(FILE 
24d50 2a 66 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  *f){.  raw_print
24d60 66 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61 67 65  f(f,."\n"."Usage
24d70 3a 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e 2e 2e  : .ar [OPTION...
24d80 5d 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22  ] [FILE...]\n"."
24d90 54 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  The .ar command 
24da0 6d 61 6e 61 67 65 73 20 73 71 6c 61 72 20 61 72  manages sqlar ar
24db0 63 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e 22 0a  chives.\n"."\n".
24dc0 22 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a 22 20  "Examples:\n"." 
24dd0 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65   .ar -cf archive
24de0 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 20 20  .sar foo bar    
24df0 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65  # Create archive
24e00 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20  .sar from files 
24e10 66 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22 0a 22  foo and bar\n"."
24e20 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69 76    .ar -tf archiv
24e30 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 20 20  e.sar           
24e40 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20   # List members 
24e50 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e  of archive.sar\n
24e60 22 0a 22 20 20 2e 61 72 20 2d 78 76 66 20 61 72  "."  .ar -xvf ar
24e70 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20  chive.sar       
24e80 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79 20      # Verbosely 
24e90 65 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72  extract files fr
24ea0 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e  om archive.sar\n
24eb0 22 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63 6f 6d  "."\n"."Each com
24ec0 6d 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74 20 66  mand line must f
24ed0 65 61 74 75 72 65 20 65 78 61 63 74 6c 79 20 6f  eature exactly o
24ee0 6e 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f  ne command optio
24ef0 6e 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d 2d 63  n:\n"."  -c, --c
24f00 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20  reate           
24f10 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
24f20 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d   archive\n"."  -
24f30 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20  u, --update     
24f40 20 20 20 20 20 20 20 20 20 20 55 70 64 61 74 65            Update
24f50 20 6f 72 20 61 64 64 20 66 69 6c 65 73 20 74 6f   or add files to
24f60 20 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72 63   an existing arc
24f70 68 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c 20 2d  hive\n"."  -t, -
24f80 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  -list           
24f90 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65        List conte
24fa0 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 5c 6e  nts of archive\n
24fb0 22 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61  "."  -x, --extra
24fc0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
24fd0 45 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72  Extract files fr
24fe0 6f 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 5c  om archive\n"."\
24ff0 6e 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f 72 20  n"."And zero or 
25000 6d 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20 6f 70  more optional op
25010 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 76 2c  tions:\n"."  -v,
25020 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20   --verbose      
25030 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65 61          Print ea
25040 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69  ch filename as i
25050 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 5c 6e  t is processed\n
25060 22 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d  "."  -f FILE, --
25070 66 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20  file FILE       
25080 4f 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69  Operate on archi
25090 76 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74  ve FILE (default
250a0 20 69 73 20 63 75 72 72 65 6e 74 20 64 62 29 5c   is current db)\
250b0 6e 22 0a 22 20 20 2d 61 20 46 49 4c 45 2c 20 2d  n"."  -a FILE, -
250c0 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20 20  -append FILE    
250d0 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c 45   Operate on FILE
250e0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
250f0 65 20 61 70 6e 64 76 66 73 20 56 46 53 5c 6e 22  e apndvfs VFS\n"
25100 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69  ."  -C DIR, --di
25110 72 65 63 74 6f 72 79 20 44 49 52 20 20 20 20 43  rectory DIR    C
25120 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f  hange to directo
25130 72 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65  ry DIR to read/e
25140 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e 22 0a  xtract files\n".
25150 22 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e 20  "  -n, --dryrun 
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
25170 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  ow the SQL that 
25180 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75 72  would have occur
25190 72 65 64 5c 6e 22 0a 22 5c 6e 22 0a 22 53 65 65  red\n"."\n"."See
251a0 20 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f 73 71   also: http://sq
251b0 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d  lite.org/cli.htm
251c0 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f  l#sqlar_archive_
251d0 73 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e 22 0a  support\n"."\n".
251e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
251f0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
25200 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
25210 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68  r message for th
25220 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f  e .ar command to
25230 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
25240 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
25250 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
25260 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 63 6f  nt arErrorMsg(co
25270 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
25280 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
25290 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
252a0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
252b0 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  mt);.  z = sqlit
252c0 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
252d0 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
252e0 61 70 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  ap);.  raw_print
252f0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
25300 3a 20 25 73 20 28 74 72 79 20 5c 22 2e 61 72 20  : %s (try \".ar 
25310 2d 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20 7a 29  --help\")\n", z)
25320 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
25330 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (z);.  return SQ
25340 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
25350 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20  *.** Values for 
25360 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a  ArCommand.eCmd..
25370 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d  */.#define AR_CM
25380 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31  D_CREATE       1
25390 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
253a0 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a 23  EXTRACT      2.#
253b0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49  define AR_CMD_LI
253c0 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64 65  ST         3.#de
253d0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44 41  fine AR_CMD_UPDA
253e0 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69  TE       4.#defi
253f0 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20  ne AR_CMD_HELP  
25400 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20         5../*.** 
25410 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61  Other (non-comma
25420 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f  nd) switches..*/
25430 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
25440 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20 36  CH_VERBOSE     6
25450 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
25460 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20 37  CH_FILE        7
25470 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
25480 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20 38  CH_DIRECTORY   8
25490 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
254a0 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 20 39  CH_APPEND      9
254b0 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
254c0 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31 30  CH_DRYRUN     10
254d0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  ..static int arP
254e0 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72 43  rocessSwitch(ArC
254f0 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74  ommand *pAr, int
25500 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20   eSwitch, const 
25510 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
25520 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20 29  witch( eSwitch )
25530 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  {.    case AR_CM
25540 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61  D_CREATE:.    ca
25550 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  se AR_CMD_EXTRAC
25560 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  T:.    case AR_C
25570 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73  MD_LIST:.    cas
25580 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a  e AR_CMD_UPDATE:
25590 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
255a0 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66 28  _HELP:.      if(
255b0 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20 20   pAr->eCmd ){.  
255c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
255d0 72 72 6f 72 4d 73 67 28 22 6d 75 6c 74 69 70 6c  rrorMsg("multipl
255e0 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e  e command option
255f0 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
25600 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65     pAr->eCmd = e
25610 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62 72  Switch;.      br
25620 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41  eak;..    case A
25630 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 3a  R_SWITCH_DRYRUN:
25640 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72 79  .      pAr->bDry
25650 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  Run = 1;.      b
25660 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
25670 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45  R_SWITCH_VERBOSE
25680 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65  :.      pAr->bVe
25690 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20  rbose = 1;.     
256a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
256b0 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e   AR_SWITCH_APPEN
256c0 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 41  D:.      pAr->bA
256d0 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20  ppend = 1;.     
256e0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
256f0 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20  to --file */.   
25700 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
25710 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d  FILE:.      pAr-
25720 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20  >zFile = zArg;. 
25730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25740 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44  case AR_SWITCH_D
25750 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20  IRECTORY:.      
25760 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67  pAr->zDir = zArg
25770 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25780 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
25790 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
257a0 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61   Parse the comma
257b0 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22  nd line for an "
257c0 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  .ar" command. Th
257d0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72  e results are wr
257e0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74  itten into.** st
257f0 72 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20  ructure (*pAr). 
25800 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25810 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d  urned if the com
25820 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72  mand line is par
25830 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  sed.** successfu
25840 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61  lly, otherwise a
25850 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25860 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74  is written to st
25870 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  derr and .** SQL
25880 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e  ITE_ERROR return
25890 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
258a0 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64  t arParseCommand
258b0 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  (.  char **azArg
258c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
258d0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
258e0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
258f0 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
25900 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25930 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
25940 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d  rg[] */.  ArComm
25950 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20  and *pAr        
25960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70            /* Pop
25970 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63  ulate this objec
25980 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
25990 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20   ArSwitch {.    
259a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e  const char *zLon
259b0 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f  g;.    char cSho
259c0 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74  rt;.    u8 eSwit
259d0 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b  ch;.    u8 bArg;
259e0 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d  .  } aSwitch[] =
259f0 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65   {.    { "create
25a00 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d  ",    'c', AR_CM
25a10 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20 20  D_CREATE,       
25a20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72  0 },.    { "extr
25a30 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f  act",   'x', AR_
25a40 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20  CMD_EXTRACT,    
25a50 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69    0 },.    { "li
25a60 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20 41  st",      't', A
25a70 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20  R_CMD_LIST,     
25a80 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
25a90 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27 2c  update",    'u',
25aa0 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20   AR_CMD_UPDATE, 
25ab0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
25ac0 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27 68   "help",      'h
25ad0 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20  ', AR_CMD_HELP, 
25ae0 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
25af0 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20   { "verbose",   
25b00 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 56  'v', AR_SWITCH_V
25b10 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20  ERBOSE,   0 },. 
25b20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20 20     { "file",    
25b30 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43 48    'f', AR_SWITCH
25b40 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c  _FILE,      1 },
25b50 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22 2c  .    { "append",
25b60 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49 54      'a', AR_SWIT
25b70 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31 20  CH_APPEND,    1 
25b80 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63 74  },.    { "direct
25b90 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53 57  ory", 'C', AR_SW
25ba0 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20  ITCH_DIRECTORY, 
25bb0 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79 72  1 },.    { "dryr
25bc0 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f  un",    'n', AR_
25bd0 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20 20  SWITCH_DRYRUN,  
25be0 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e    0 },.  };.  in
25bf0 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65  t nSwitch = size
25c00 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73 69  of(aSwitch) / si
25c10 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53 77  zeof(struct ArSw
25c20 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20  itch);.  struct 
25c30 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d  ArSwitch *pEnd =
25c40 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63   &aSwitch[nSwitc
25c50 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c  h];..  if( nArg<
25c60 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =1 ){.    return
25c70 20 61 72 55 73 61 67 65 28 73 74 64 65 72 72 29   arUsage(stderr)
25c80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
25c90 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31  har *z = azArg[1
25ca0 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 41  ];.    memset(pA
25cb0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 72 43  r, 0, sizeof(ArC
25cc0 6f 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20 20 69  ommand));..    i
25cd0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
25ce0 20 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69        /* Traditi
25cf0 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d  onal style [tar]
25d00 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
25d10 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
25d20 20 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a    int iArg = 2;.
25d30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
25d40 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
25d50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25d60 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
25d70 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
25d80 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20   *pOpt;.        
25d90 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63  for(pOpt=&aSwitc
25da0 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b  h[0]; pOpt<pEnd;
25db0 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20   pOpt++){.      
25dc0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
25dd0 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
25de0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
25df0 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d        if( pOpt==
25e00 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
25e10 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
25e20 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Msg("unrecognize
25e30 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a  d option: %c", z
25e40 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
25e50 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
25e60 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
25e70 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41      if( iArg>=nA
25e80 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
25e90 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
25ea0 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75  Msg("option requ
25eb0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
25ec0 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20  : %c",z[i]);.   
25ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25ee0 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
25ef0 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  iArg++];.       
25f00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
25f10 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
25f20 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
25f30 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
25f40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
25f60 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
25f70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Arg;.      if( p
25f80 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20  Ar->nArg>0 ){.  
25f90 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
25fa0 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
25fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
25fc0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e  se{.      /* Non
25fd0 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76  -traditional inv
25fe0 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
25ff0 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20   int iArg;.     
26000 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72   for(iArg=1; iAr
26010 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b  g<nArg; iArg++){
26020 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
26030 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72          z = azAr
26040 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  g[iArg];.       
26050 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
26060 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
26070 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
26080 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20  mand line words 
26090 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
260a0 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ments. */.      
260b0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
260c0 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
260d0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
260e0 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
260f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
26100 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26110 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
26120 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  z);..        if(
26130 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[1]!='-' ){.  
26140 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
26150 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
26160 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70  or more short op
26170 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  tions */.       
26180 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b     for(i=1; i<n;
26190 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
261a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
261b0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
261c0 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
261d0 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
261e0 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
261f0 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
26200 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
26210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26220 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e  if( z[i]==pOpt->
26230 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a  cShort ) break;.
26240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
26260 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
26270 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26280 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72   arErrorMsg("unr
26290 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e  ecognized option
262a0 3a 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29 3b 0a  : %c\n", z[i]);.
262b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
262c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
262d0 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
262e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
262f0 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  (n-1) ){.       
26300 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
26310 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20  &z[i+1];.       
26320 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a           i = n;.
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
26340 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26350 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28       if( iArg>=(
26360 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
26380 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
26390 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
263a0 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 5c  an argument: %c\
263b0 6e 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  n",z[i]);.      
263c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
263d0 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67              zArg
263e0 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d   = azArg[++iArg]
263f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26400 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
26410 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26420 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
26430 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74  pAr, pOpt->eSwit
26440 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
26450 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
26460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26470 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
26480 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20  [2]=='\0' ){.   
26490 20 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f         /* A -- o
264a0 70 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e  ption, indicatin
264b0 67 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69  g that all remai
264c0 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  ning command lin
264d0 65 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20  e words.        
264e0 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64    ** are command
264f0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a   arguments.  */.
26500 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61            pAr->a
26510 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
26520 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rg+1];.         
26530 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
26540 67 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20  g-iArg-1;.      
26550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26570 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70      /* A long op
26580 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
26590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
265a0 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rg = 0;         
265b0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
265c0 66 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61  for option, if a
265d0 6e 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ny */.          
265e0 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
265f0 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20  *pMatch = 0;    
26600 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70    /* Matching op
26610 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
26620 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
26630 68 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20  h *pOpt;        
26640 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
26650 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
26660 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30  (pOpt=&aSwitch[0
26670 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f  ]; pOpt<pEnd; pO
26680 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pt++){.         
26690 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
266a0 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f  Long = pOpt->zLo
266b0 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
266c0 69 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65  if( (n-2)<=strle
266d0 6e 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d  n30(zLong) && 0=
266e0 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a  =memcmp(&z[2], z
266f0 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20  Long, n-2) ){.  
26700 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26710 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  pMatch ){.      
26720 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26730 20 61 72 45 72 72 6f 72 4d 73 67 28 22 61 6d 62   arErrorMsg("amb
26740 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25  iguous option: %
26750 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  s",z);.         
26760 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26770 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74              pMat
26780 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20  ch = pOpt;.     
26790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
267a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
267b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
267c0 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b  if( pMatch==0 ){
267d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
267e0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
267f0 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
26800 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ion: %s", z);.  
26810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26820 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e      if( pMatch->
26830 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
26840 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
26850 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
26860 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
26870 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f  rErrorMsg("optio
26880 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
26890 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b  gument: %s", z);
268a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
268b0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
268c0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
268d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
268e0 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f         if( arPro
268f0 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20  cessSwitch(pAr, 
26900 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c  pMatch->eSwitch,
26910 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
26920 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26940 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
26950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26960 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26970 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
26980 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73  at all arguments
26990 20 77 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f   within the ArCo
269a0 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a  mmand.azArg[].**
269b0 20 61 72 72 61 79 20 72 65 66 65 72 20 74 6f 20   array refer to 
269c0 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c  archive members,
269d0 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78   as for the --ex
269e0 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20  tract or --list 
269f0 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74  commands. .** It
26a00 20 63 68 65 63 6b 73 20 74 68 61 74 20 65 61 63   checks that eac
26a10 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72  h of them are pr
26a20 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70  esent. If any sp
26a30 65 63 69 66 69 65 64 20 66 69 6c 65 20 69 73 20  ecified file is 
26a40 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69  not.** present i
26a50 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61  n the archive, a
26a60 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74  n error is print
26a70 65 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ed to stderr and
26a80 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   an error.** cod
26a90 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  e returned. Othe
26aa0 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70  rwise, if all sp
26ab0 65 63 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74  ecified argument
26ac0 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  s are present in
26ad0 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c  .** the archive,
26ae0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26af0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
26b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69  is function stri
26b10 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ps any trailing 
26b20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73 20 66  '/' characters f
26b30 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e  rom each argumen
26b40 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  t..** This is co
26b50 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
26b60 65 20 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20  e way the [tar] 
26b70 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f  command seems to
26b80 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75   work on.** Linu
26b90 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
26ba0 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28   arCheckEntries(
26bb0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
26bc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26bd0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72  TE_OK;.  if( pAr
26be0 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e  ->nArg ){.    in
26bf0 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69  t i, j;.    sqli
26c00 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20  te3_stmt *pTest 
26c10 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50  = 0;..    shellP
26c20 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72  reparePrintf(pAr
26c30 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73  ->db, &rc, &pTes
26c40 74 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  t,.        "SELE
26c50 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20  CT name FROM %s 
26c60 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65  WHERE name=$name
26c70 22 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72 2d  ", .        pAr-
26c80 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20 20 20 29  >zSrcTable.    )
26c90 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
26ca0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
26cb0 5f 69 6e 64 65 78 28 70 54 65 73 74 2c 20 22 24  _index(pTest, "$
26cc0 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66 6f 72 28  name");.    for(
26cd0 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
26ce0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
26cf0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  K; i++){.      c
26d00 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a  har *z = pAr->az
26d10 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 6e  Arg[i];.      in
26d20 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  t n = strlen30(z
26d30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  );.      int bOk
26d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
26d50 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
26d60 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  =='/' ) n--;.   
26d70 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a     z[n] = '\0';.
26d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
26d90 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20 6a  nd_text(pTest, j
26da0 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
26db0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 69  STATIC);.      i
26dc0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
26dd0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54 65 73  qlite3_step(pTes
26de0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f  t) ){.        bO
26df0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
26e00 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
26e10 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20  &rc, pTest);.   
26e20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26e30 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29  E_OK && bOk==0 )
26e40 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
26e50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e  rintf(stderr, "n
26e60 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72 63 68  ot found in arch
26e70 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ive: %s\n", z);.
26e80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26e90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
26ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65   }.    }.    she
26eb0 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
26ec0 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65  pTest);.  }.  re
26ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26ee0 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45 52 45  * Format a WHERE
26ef0 20 63 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e   clause that can
26f00 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 73 74   be used against
26f10 20 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62   the "sqlar" tab
26f20 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69 66  le to.** identif
26f30 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d 65  y all archive me
26f40 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74 63 68  mbers that match
26f50 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67   the command arg
26f60 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a 20 69  uments held.** i
26f70 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76 65 20  n (*pAr). Leave 
26f80 74 68 69 73 20 57 48 45 52 45 20 63 6c 61 75 73  this WHERE claus
26f90 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65 29 20  e in (*pzWhere) 
26fa0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
26fb0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  ..** The caller 
26fc0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
26fd0 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  or eventually ca
26fe0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
26ff0 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e  ee() on.** any n
27000 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68 65 72  on-NULL (*pzWher
27010 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  e) value..*/.sta
27020 74 69 63 20 76 6f 69 64 20 61 72 57 68 65 72 65  tic void arWhere
27030 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20 2a 70  Clause(.  int *p
27040 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61 6e 64  Rc, .  ArCommand
27050 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72 20 2a   *pAr, .  char *
27060 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20 20 20  *pzWhere        
27070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27080 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c 61 75  : New WHERE clau
27090 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  se */.){.  char 
270a0 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69  *zWhere = 0;.  i
270b0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
270c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  OK ){.    if( pA
270d0 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20  r->nArg==0 ){.  
270e0 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c      zWhere = sql
270f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 31 22  ite3_mprintf("1"
27100 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27110 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
27120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
27130 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f  p = "";.      fo
27140 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41  r(i=0; i<pAr->nA
27150 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
27160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
27170 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
27180 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 20  .        zWhere 
27190 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
271a0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 7a  f(.          "%z
271b0 25 73 20 6e 61 6d 65 20 3d 20 27 25 71 27 20 4f  %s name = '%q' O
271c0 52 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c  R substr(name,1,
271d0 25 64 29 20 3d 20 27 25 71 2f 27 22 2c 20 0a 20  %d) = '%q/'", . 
271e0 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c           zWhere,
271f0 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72 6c 65 6e   zSep, z, strlen
27200 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20 20 20 20  30(z)+1, z.     
27210 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
27220 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20  ( zWhere==0 ){. 
27230 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20           *pRc = 
27240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27250 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27270 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a   zSep = " OR ";.
27280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27290 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a  }.  *pzWhere = z
272a0 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Where;.}../*.** 
272b0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
272c0 66 20 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d  f .ar "lisT" com
272d0 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mand. .*/.static
272e0 20 69 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61   int arListComma
272f0 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  nd(ArCommand *pA
27300 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
27310 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54   *zSql = "SELECT
27320 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48 45 52   %s FROM %s WHER
27330 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20  E %s"; .  const 
27340 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d  char *azCols[] =
27350 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20   {.    "name",. 
27360 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f 64 65 29     "lsmode(mode)
27370 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d  , sz, datetime(m
27380 74 69 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63 68  time, 'unixepoch
27390 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a  '), name".  };..
273a0 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
273b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
273c0 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20  mt *pSql = 0;.  
273d0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
273e0 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70  arCheckEntries(p
273f0 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c  Ar);.  arWhereCl
27400 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26  ause(&rc, pAr, &
27410 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c  zWhere);..  shel
27420 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
27430 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  Ar->db, &rc, &pS
27440 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73  ql, zSql, azCols
27450 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 5d 2c  [pAr->bVerbose],
27460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27470 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54        pAr->zSrcT
27480 61 62 6c 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20  able, zWhere);. 
27490 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75   if( pAr->bDryRu
274a0 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  n ){.    utf8_pr
274b0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
274c0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
274d0 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20  3_sql(pSql));.  
274e0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
274f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27500 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
27510 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
27520 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
27530 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a  Ar->bVerbose ){.
27540 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
27550 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c  ntf(pAr->p->out,
27560 20 22 25 73 20 25 20 31 30 64 20 20 25 73 20 20   "%s % 10d  %s  
27570 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
27580 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
27590 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 2c  n_text(pSql, 0),
275a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
275b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
275c0 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20 20  pSql, 1), .     
275d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
275e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
275f0 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   2),.           
27600 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27610 74 65 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20  text(pSql, 3).  
27620 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
27630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74  else{.        ut
27640 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
27650 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
27660 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
27670 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20  xt(pSql, 0));.  
27680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27690 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
276a0 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 72 65  &rc, pSql);.  re
276b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
276c0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
276d0 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63  n of .ar "eXtrac
276e0 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  t" command. .*/.
276f0 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 74  static int arExt
27700 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ractCommand(ArCo
27710 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
27720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31  onst char *zSql1
27730 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20   = .    "SELECT 
27740 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c  ".    " ($dir ||
27750 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77   name),".    " w
27760 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c  ritefile(($dir |
27770 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64  | name), %s, mod
27780 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20  e, mtime) ".    
27790 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28  "FROM %s WHERE (
277a0 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49 53  %s) AND (data IS
277b0 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c   NULL OR $dirOnl
277c0 79 20 3d 20 30 29 22 3b 0a 0a 20 20 63 6f 6e 73  y = 0)";..  cons
277d0 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61 41  t char *azExtraA
277e0 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22 73  rg[] = { .    "s
277f0 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73 28  qlar_uncompress(
27800 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20 20  data, sz)",.    
27810 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20 73  "data".  };..  s
27820 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
27830 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  l = 0;.  int rc 
27840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
27850 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 20  har *zDir = 0;. 
27860 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
27870 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  0;.  int i, j;..
27880 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
27890 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c  s are specified,
278a0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 79   check that they
278b0 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20   actually exist 
278c0 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
278d0 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20 70  archive before p
278e0 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20 66  roceeding. And f
278f0 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52 45  ormulate a WHERE
27900 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20   clause to.  ** 
27910 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a  match them.  */.
27920 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e    rc = arCheckEn
27930 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72  tries(pAr);.  ar
27940 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c  WhereClause(&rc,
27950 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a   pAr, &zWhere);.
27960 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
27980 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20 20  pAr->zDir ){.   
27990 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
279a0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c  3_mprintf("%s/",
279b0 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
279c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 44   }else{.      zD
279d0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
279e0 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d 0a  intf("");.    }.
279f0 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
27a00 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
27a10 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65 6c  MEM;.  }..  shel
27a20 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
27a30 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  Ar->db, &rc, &pS
27a40 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20  ql, zSql1, .    
27a50 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41 72    azExtraArg[pAr
27a60 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a 53  ->bZip], pAr->zS
27a70 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 0a  rcTable, zWhere.
27a80 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
27a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27aa0 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
27ab0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
27ac0 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29 3b  x(pSql, "$dir");
27ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
27ae0 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c 20  d_text(pSql, j, 
27af0 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zDir, -1, SQLITE
27b00 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f  _STATIC);..    /
27b10 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43 54  * Run the SELECT
27b20 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63 65   statement twice
27b30 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
27b40 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69 73  , writefile() is
27b50 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 66   called.    ** f
27b60 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d  or all archive m
27b70 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f 75  embers that shou
27b80 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64 2e  ld be extracted.
27b90 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d 65   The second time
27ba0 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66 6f  ,.    ** only fo
27bb0 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  r the directorie
27bc0 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
27bd0 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  se the timestamp
27be0 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78 74  s for.    ** ext
27bf0 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72 69  racted directori
27c00 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  es must be reset
27c10 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65 20   after they are 
27c20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20 20  populated (as.  
27c30 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67 20    ** populating 
27c40 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68 65  them changes the
27c50 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a 2f   timestamp).  */
27c60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27c70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  2; i++){.      j
27c80 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
27c90 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
27ca0 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79 22  pSql, "$dirOnly"
27cb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27cc0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
27cd0 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  j, i);.      if(
27ce0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
27cf0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
27d00 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
27d10 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
27d20 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20  3_sql(pSql));.  
27d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d40 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
27d50 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
27d60 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
27d70 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
27d80 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
27d90 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  && pAr->bVerbose
27da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27db0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
27dc0 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
27dd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27de0 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
27df0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27e00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27e10 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26      shellReset(&
27e20 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20 7d  rc, pSql);.    }
27e30 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
27e40 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
27e50 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
27e60 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c 69  ee(zDir);.  sqli
27e70 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
27e80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27e90 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
27ea0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
27eb0 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64 6f   zSql.  Or if do
27ec0 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c 20  ing a --dryrun, 
27ed0 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74 20  merely print it 
27ee0 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  out..*/.static i
27ef0 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72 43  nt arExecSql(ArC
27f00 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e  ommand *pAr, con
27f10 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
27f20 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
27f30 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a  pAr->bDryRun ){.
27f40 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27f50 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
27f60 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
27f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
27f90 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
27fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
27fb0 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71 6c  ec(pAr->db, zSql
27fc0 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
27fd0 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
27fe0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27ff0 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f 52  f(stdout, "ERROR
28000 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
28010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28020 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a  ee(zErr);.    }.
28030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28040 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
28050 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
28060 20 22 63 72 65 61 74 65 22 20 61 6e 64 20 22 75   "create" and "u
28070 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e  pdate" commands.
28080 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  .**.** Create th
28090 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  e "sqlar" table 
280a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
280b0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
280c0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a  lready exist..**
280d0 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20 66   Then add each f
280e0 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69 6c  ile in the azFil
280f0 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68 65  e[] array to the
28100 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63 74   archive. Direct
28110 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64 64  ories.** are add
28120 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
28130 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65 72  If argument bVer
28140 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  bose is non-zero
28150 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a 2a  , a message is.*
28160 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 64  * printed on std
28170 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69 6c  out for each fil
28180 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a 2a  e archived..**.*
28190 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f 6d  * The create com
281a0 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d 65  mand is the same
281b0 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63 65   as update, exce
281c0 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70 73  pt that it drops
281d0 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e 67  .** any existing
281e0 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 62   "sqlar" table b
281f0 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 2e  efore beginning.
28200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
28210 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
28220 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d 6d  ommand(.  ArComm
28230 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20 20 20  and *pAr,       
28240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
28250 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61  mand arguments a
28260 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  nd options */.  
28270 69 6e 74 20 62 55 70 64 61 74 65 20 20 20 20 20  int bUpdate     
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20 2d 2d  /* true for a --
282a0 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65 20 66  create.  false f
282b0 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f 0a 29  or --update */.)
282c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
282d0 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20  zCreate = .     
282e0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
282f0 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c  F NOT EXISTS sql
28300 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ar(\n".      "  
28310 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52  name TEXT PRIMAR
28320 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20  Y KEY,  -- name 
28330 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20  of the file\n". 
28340 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54       "  mode INT
28350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28360 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  -- access permis
28370 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22  sions\n".      "
28380 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20    mtime INT,    
28390 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73            -- las
283a0 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74  t modification t
283b0 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ime\n".      "  
283c0 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  sz INT,         
283d0 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69          -- origi
283e0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22  nal file size\n"
283f0 0a 20 20 20 20 20 20 22 20 20 64 61 74 61 20 42  .      "  data B
28400 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20  LOB             
28410 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20    -- compressed 
28420 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20  content\n".     
28430 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68   ")";.  const ch
28440 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f  ar *zDrop = "DRO
28450 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
28460 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73  S sqlar";.  cons
28470 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46  t char *zInsertF
28480 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22  mt[2] = {.     "
28490 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28  REPLACE INTO %s(
284a0 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c  name,mode,mtime,
284b0 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  sz,data)\n".    
284c0 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20   "  SELECT\n".  
284d0 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20     "    %s,\n". 
284e0 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e      "    mode,\n
284f0 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d  ".     "    mtim
28500 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
28510 43 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f  CASE substr(lsmo
28520 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22  de(mode),1,1)\n"
28530 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45  .     "      WHE
28540 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74  N '-' THEN lengt
28550 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  h(data)\n".     
28560 22 20 20 20 20 20 20 57 48 45 4e 20 27 64 27 20  "      WHEN 'd' 
28570 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22  THEN 0\n".     "
28580 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e        ELSE -1 EN
28590 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  D,\n".     "    
285a0 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64  sqlar_compress(d
285b0 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  ata)\n".     "  
285c0 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51  FROM fsdir(%Q,%Q
285d0 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45  )\n".     "  WHE
285e0 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20  RE lsmode(mode) 
285f0 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22  NOT LIKE '?%%';"
28600 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20  ,.     "REPLACE 
28610 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64  INTO %s(name,mod
28620 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22  e,mtime,data)\n"
28630 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c  .     "  SELECT\
28640 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c  n".     "    %s,
28650 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f  \n".     "    mo
28660 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  de,\n".     "   
28670 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20   mtime,\n".     
28680 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20  "    data\n".   
28690 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28    "  FROM fsdir(
286a0 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20 22  %Q,%Q)\n".     "
286b0 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d    WHERE lsmode(m
286c0 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f  ode) NOT LIKE '?
286d0 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e 74  %%';".  };.  int
286e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28700 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
28710 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20 2a  rough azFile[] *
28720 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28750 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
28760 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
28770 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
28780 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
28790 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 63  to insert */.  c
287a0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
287b0 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a 20 20  r zTemp[50];..  
287c0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
287d0 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
287e0 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d 20 61  =512");.  rc = a
287f0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 53  rExecSql(pAr, "S
28800 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a  AVEPOINT ar;");.
28810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28820 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28830 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b  .  zTemp[0] = 0;
28840 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69   .  if( pAr->bZi
28850 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  p ){.    /* Init
28860 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70 66 69  ialize the zipfi
28870 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  le virtual table
28880 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
28890 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a  /.    if( pAr->z
288a0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  File ){.      sq
288b0 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a  lite3_uint64 r;.
288c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
288d0 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
288e0 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r),&r);.      sq
288f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
28900 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65  izeof(zTemp),zTe
28910 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c  mp,"zip%016llx",
28920 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d  r);.      zTab =
28930 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53   zTemp;.      zS
28940 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
28950 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 22  intf(.         "
28960 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
28970 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55 53 49  ABLE temp.%s USI
28980 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 22 2c  NG zipfile(%Q)",
28990 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c 20  .         zTab, 
289a0 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20  pAr->zFile.     
289b0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
289c0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
289d0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
289e0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
289f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28a00 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20  zTab = "zip";.  
28a10 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
28a20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
28a30 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61 6e 20  he table for an 
28a40 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61  SQLAR */.    zTa
28a50 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20 20  b = "sqlar";.   
28a60 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20   if( bUpdate==0 
28a70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72  ){.      rc = ar
28a80 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 44 72  ExecSql(pAr, zDr
28a90 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  op);.      if( r
28aa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
28ab0 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73  oto end_ar_trans
28ac0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
28ad0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
28ae0 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a  (pAr, zCreate);.
28af0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
28b00 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
28b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
28b20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
28b30 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  l2 = sqlite3_mpr
28b40 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b  intf(zInsertFmt[
28b50 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62  pAr->bZip], zTab
28b60 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62  ,.        pAr->b
28b70 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c  Verbose ? "shell
28b80 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a  _putsnl(name)" :
28b90 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20   "name",.       
28ba0 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20   pAr->azArg[i], 
28bb0 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20 20  pAr->zDir);.    
28bc0 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
28bd0 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20 20  Ar, zSql2);.    
28be0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
28bf0 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f  l2);.  }.end_ar_
28c00 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 69  transaction:.  i
28c10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28c20 20 29 7b 0a 20 20 20 20 61 72 45 78 65 63 53 71   ){.    arExecSq
28c30 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42 41 43 4b  l(pAr, "ROLLBACK
28c40 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20   TO ar; RELEASE 
28c50 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ar;");.  }else{.
28c60 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
28c70 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53 45  ql(pAr, "RELEASE
28c80 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28 20   ar;");.    if( 
28c90 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41 72  pAr->bZip && pAr
28ca0 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ->zFile ){.     
28cb0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
28cc0 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54 41  mprintf("DROP TA
28cd0 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29 3b  BLE %s", zTemp);
28ce0 0a 20 20 20 20 20 20 61 72 45 78 65 63 53 71 6c  .      arExecSql
28cf0 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  (pAr, zSql);.   
28d00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28d10 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zSql);.    }.  }
28d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28d30 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
28d40 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
28d50 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
28d60 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
28d70 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
28d80 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
28d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
28da0 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
28db0 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
28dc0 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
28dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
28de0 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
28df0 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
28e00 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
28e10 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
28e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28e30 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
28e40 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
28e50 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d  {.  ArCommand cm
28e60 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d  d;.  int rc;.  m
28e70 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73  emset(&cmd, 0, s
28e80 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 72  izeof(cmd));.  r
28e90 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  c = arParseComma
28ea0 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20  nd(azArg, nArg, 
28eb0 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  &cmd);.  if( rc=
28ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ed0 20 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20    int eDbType = 
28ee0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
28ef0 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70  C;.    cmd.p = p
28f00 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64  State;.    cmd.d
28f10 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a  b = pState->db;.
28f20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
28f30 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79  e ){.      eDbTy
28f40 70 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62  pe = deduceDatab
28f50 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c  aseType(cmd.zFil
28f60 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 1);.    }else
28f70 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20  {.      eDbType 
28f80 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f  = pState->openMo
28f90 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  de;.    }.    if
28fa0 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c  ( eDbType==SHELL
28fb0 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b  _OPEN_ZIPFILE ){
28fc0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
28fd0 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52  Cmd==AR_CMD_EXTR
28fe0 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ACT || cmd.eCmd=
28ff0 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a  =AR_CMD_LIST ){.
29000 20 20 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e          if( cmd.
29010 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
29020 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61        cmd.zSrcTa
29030 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ble = sqlite3_mp
29040 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20 20  rintf("zip");.  
29050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29060 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54         cmd.zSrcT
29070 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  able = sqlite3_m
29080 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 28  printf("zipfile(
29090 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29  %Q)", cmd.zFile)
290a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
290b0 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a    }.      cmd.bZ
290c0 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ip = 1;.    }els
290d0 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20  e if( cmd.zFile 
290e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  ){.      int fla
290f0 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  gs;.      if( cm
29100 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62 54  d.bAppend ) eDbT
29110 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
29120 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20  _APPENDVFS;.    
29130 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d    if( cmd.eCmd==
29140 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c  AR_CMD_CREATE ||
29150 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
29160 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  D_UPDATE ){.    
29170 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
29180 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
29190 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
291a0 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
291b0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
291c0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
291d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
291e0 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20  .      cmd.db = 
291f0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  0;.      if( cmd
29200 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  .bDryRun ){.    
29210 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29220 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d  pState->out, "--
29230 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27   open database '
29240 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46  %s'%s\n", cmd.zF
29250 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
29260 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
29270 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
29280 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76  ? " using 'apndv
29290 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20  fs'" : "");.    
292a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
292b0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63  qlite3_open_v2(c
292c0 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64  md.zFile, &cmd.d
292d0 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20  b, flags, .     
292e0 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
292f0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
29300 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73  NDVFS ? "apndvfs
29310 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66  " : 0);.      if
29320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29330 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
29340 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29350 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
29360 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20  : %s (%s)\n", . 
29370 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a             cmd.z
29380 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  File, sqlite3_er
29390 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20  rmsg(cmd.db).   
293a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
293b0 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
293c0 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
293d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
293e0 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  o_init(cmd.db, 0
293f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
29400 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63  te3_sqlar_init(c
29410 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  md.db, 0, 0);.  
29420 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
29430 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e  te_function(cmd.
29440 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e  db, "shell_putsn
29450 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
29460 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20  F8, cmd.p,.     
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29480 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75           shellPu
29490 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a  tsFunc, 0, 0);..
294a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d      }.    if( cm
294b0 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26  d.zSrcTable==0 &
294c0 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 29 7b  & cmd.bZip==0 ){
294d0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
294e0 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd!=AR_CMD_CREA
294f0 54 45 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  TE.       && sql
29500 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
29510 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64  n_metadata(cmd.d
29520 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d  b,0,"sqlar","nam
29530 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20  e",0,0,0,0,0).  
29540 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
29550 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
29560 72 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f 65  r, "database doe
29570 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
29580 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e   'sqlar' table\n
29590 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
295a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
295b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
295c0 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20  ar_command;.    
295d0 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53    }.      cmd.zS
295e0 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  rcTable = sqlite
295f0 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72  3_mprintf("sqlar
29600 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ");.    }..    s
29610 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20  witch( cmd.eCmd 
29620 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ){.      case AR
29630 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20  _CMD_CREATE:.   
29640 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
29650 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
29660 64 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20 20  d(&cmd, 0);.    
29670 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
29680 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58    case AR_CMD_EX
29690 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72  TRACT:.        r
296a0 63 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d  c = arExtractCom
296b0 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20  mand(&cmd);.    
296c0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
296d0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
296e0 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ST:.        rc =
296f0 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26   arListCommand(&
29700 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
29710 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
29720 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
29730 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53        arUsage(pS
29740 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  tate->out);.    
29750 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
29760 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
29770 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65     assert( cmd.e
29780 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
29790 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  TE );.        rc
297a0 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
297b0 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
297c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
297d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e  ak;.    }.  }.en
297e0 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20  d_ar_command:.  
297f0 69 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61  if( cmd.db!=pSta
29800 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71  te->db ){.    sq
29810 6c 69 74 65 33 5f 63 6c 6f 73 65 28 63 6d 64 2e  lite3_close(cmd.
29820 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
29830 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63  e3_free(cmd.zSrc
29840 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72  Table);..  retur
29850 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  n rc;.}./* End o
29860 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22  f the ".archive"
29870 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   or ".ar" comman
29880 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a  d logic.********
29890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
298e0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
298f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
29900 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
29910 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
29920 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  ZLIB) */.../*.**
29930 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e   If an input lin
29940 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e  e begins with ".
29950 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  " then invoke th
29960 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a  is routine to.**
29970 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69   process that li
29980 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ne..**.** Return
29990 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74   1 on error, 2 t
299a0 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74  o exit, and 0 ot
299b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
299c0 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63  ic int do_meta_c
299d0 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69  ommand(char *zLi
299e0 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ne, ShellState *
299f0 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b  p){.  int h = 1;
29a00 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
29a10 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69  .  int n, c;.  i
29a20 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61  nt rc = 0;.  cha
29a30 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23  r *azArg[50];..#
29a40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29a50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
29a60 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e    if( p->expert.
29a70 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65  pExpert ){.    e
29a80 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31  xpertFinish(p, 1
29a90 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
29aa0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
29ab0 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f   input line into
29ac0 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
29ad0 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
29ae0 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a  && nArg<ArraySiz
29af0 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  e(azArg) ){.    
29b00 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
29b10 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b  Line[h]) ){ h++;
29b20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
29b30 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [h]==0 ) break;.
29b40 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
29b50 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
29b60 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  h]=='"' ){.     
29b70 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
29b80 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[h++];.      a
29b90 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
29ba0 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
29bb0 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
29bc0 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c  && zLine[h]!=del
29bd0 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  im ){.        if
29be0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27  ( zLine[h]=='\\'
29bf0 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26   && delim=='"' &
29c00 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20  & zLine[h+1]!=0 
29c10 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68  ) h++;.        h
29c20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
29c30 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
29c40 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
29c50 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
29c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29c70 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20  f( delim=='"' ) 
29c80 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
29c90 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
29ca0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
29cb0 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
29cc0 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
29cd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
29ce0 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63  ne[h] && !IsSpac
29cf0 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
29d00 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
29d10 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65  zLine[h] ) zLine
29d20 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
29d30 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
29d40 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
29d50 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
29d60 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
29d70 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
29d80 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
29d90 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
29da0 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
29db0 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
29dc0 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
29dd0 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
29de0 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ];.  clearTempFi
29df0 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  le(p);..#ifndef 
29e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
29e10 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
29e20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  c=='a' && strncm
29e30 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74  p(azArg[0], "aut
29e40 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  h", n)==0 ){.   
29e50 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
29e60 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29e70 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
29e80 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22   .auth ON|OFF\n"
29e90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
29ea0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
29eb0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
29ec0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
29ed0 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
29ee0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
29ef0 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
29f00 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
29f10 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68  orizer(p->db, sh
29f20 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20  ellAuth, p);.   
29f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
29f40 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
29f50 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30  izer(p->db, 0, 0
29f60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
29f70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
29f80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
29f90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
29fa0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
29fb0 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69  E_HAVE_ZLIB).  i
29fc0 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72  f( c=='a' && str
29fd0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29fe0 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20  archive", n)==0 
29ff0 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
2a000 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  , 0);.    rc = a
2a010 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61  rDotCommand(p, a
2a020 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d  zArg, nArg);.  }
2a030 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
2a040 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e  f( (c=='b' && n>
2a050 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2a060 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22  Arg[0], "backup"
2a070 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  , n)==0).   || (
2a080 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26  c=='s' && n>=3 &
2a090 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a0a0 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d  0], "save", n)==
2a0b0 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  0).  ){.    cons
2a0c0 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
2a0d0 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  e = 0;.    const
2a0e0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
2a0f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65      sqlite3 *pDe
2a100 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  st;.    sqlite3_
2a110 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
2a120 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
2a130 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b  for(j=1; j<nArg;
2a140 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   j++){.      con
2a150 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41  st char *z = azA
2a160 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rg[j];.      if(
2a170 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
2a180 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30        while( z[0
2a190 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
2a1a0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 74 69        /* No opti
2a1b0 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ons to process a
2a1c0 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  t this time */. 
2a1d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2a1e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2a1f0 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
2a200 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61  option: %s\n", a
2a210 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  zArg[j]);.      
2a220 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2a240 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c  lse if( zDestFil
2a250 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2a260 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72  zDestFile = azAr
2a270 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g[j];.      }els
2a280 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a  e if( zDb==0 ){.
2a290 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44          zDb = zD
2a2a0 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20  estFile;.       
2a2b0 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41   zDestFile = azA
2a2c0 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  rg[j];.      }el
2a2d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
2a2e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a2f0 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e  too many argumen
2a300 74 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c 6e 22  ts to .backup\n"
2a310 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2a320 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2a330 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74   }.    if( zDest
2a340 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2a350 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a360 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c  rr, "missing FIL
2a370 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f  ENAME argument o
2a380 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20  n .backup\n");. 
2a390 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a3a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62     }.    if( zDb
2a3b0 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69  ==0 ) zDb = "mai
2a3c0 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  n";.    rc = sql
2a3d0 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
2a3e0 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
2a3f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
2a410 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a420 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
2a430 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
2a440 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20  zDestFile);.    
2a450 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
2a460 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
2a470 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2a480 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2a490 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
2a4a0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
2a4b0 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22  it(pDest, "main"
2a4c0 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20  , p->db, zDb);. 
2a4d0 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
2a4e0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
2a4f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a500 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2a510 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
2a520 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  st));.      sqli
2a530 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
2a540 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2a550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
2a560 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65  e(  (rc = sqlite
2a570 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
2a580 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
2a590 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73  ITE_OK ){}.    s
2a5a0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
2a5b0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
2a5c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a5d0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
2a5e0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
2a5f0 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
2a600 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2a610 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2a620 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
2a630 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
2a640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2a650 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
2a660 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2a670 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
2a680 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2a690 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d  [0], "bail", n)=
2a6a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2a6b0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62  rg==2 ){.      b
2a6c0 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62  ail_on_error = b
2a6d0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2a6e0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2a6f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2a700 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2a710 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c  e: .bail on|off\
2a720 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2a730 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2a740 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
2a750 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2a760 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e  p(azArg[0], "bin
2a770 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ary", n)==0 ){. 
2a780 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2a790 7b 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c  {.      if( bool
2a7a0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
2a7b0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ]) ){.        se
2a7c0 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f  tBinaryMode(p->o
2a7d0 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ut, 1);.      }e
2a7e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74  lse{.        set
2a7f0 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  TextMode(p->out,
2a800 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
2a810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2a820 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a830 20 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79   "Usage: .binary
2a840 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2a850 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2a860 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2a870 63 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70  c=='c' && strcmp
2a880 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d  (azArg[0],"cd")=
2a890 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2a8a0 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66  rg==2 ){.#if def
2a8b0 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
2a8c0 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20  defined(WIN32). 
2a8d0 20 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20       wchar_t *z 
2a8e0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
2a8f0 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
2a900 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2a910 20 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e   rc = !SetCurren
2a920 74 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a  tDirectoryW(z);.
2a930 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a940 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ee(z);.#else.   
2a950 20 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a     rc = chdir(az
2a960 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a  Arg[1]);.#endif.
2a970 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2a980 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2a990 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
2a9a0 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69  not change to di
2a9b0 72 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e  rectory \"%s\"\n
2a9c0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2a9d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2a9e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2a9f0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2aa00 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2aa10 3a 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c  : .cd DIRECTORY\
2aa20 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2aa30 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2aa40 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63  ..  /* The undoc
2aa50 75 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70  umented ".breakp
2aa60 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61  oint" command ca
2aa70 75 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74  uses a call to t
2aa80 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f  he no-op.  ** ro
2aa90 75 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74  utine named test
2aaa0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20  _breakpoint().. 
2aab0 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27   */.  if( c=='b'
2aac0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2aad0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
2aae0 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d  reakpoint", n)==
2aaf0 30 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72  0 ){.    test_br
2ab00 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65  eakpoint();.  }e
2ab10 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
2ab20 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2ab30 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2ab40 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20  changes", n)==0 
2ab50 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2ab60 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f  =2 ){.      setO
2ab70 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  rClearFlag(p, SH
2ab80 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73  FLG_CountChanges
2ab90 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2aba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2abb0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2abc0 20 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65   "Usage: .change
2abd0 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
2abe0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2abf0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
2ac00 43 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65  Cancel output re
2ac10 64 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74  direction, if it
2ac20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
2ac30 74 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29  t (by .testcase)
2ac40 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20  .  ** Then read 
2ac50 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2ac60 68 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  he testcase-out.
2ac70 74 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d  txt file and com
2ac80 70 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a  pare against.  *
2ac90 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20  * azArg[1].  If 
2aca0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
2acb0 65 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e  ences, report an
2acc0 20 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e   error and exit.
2acd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  .  */.  if( c=='
2ace0 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  c' && n>=3 && st
2acf0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2ad00 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29  "check", n)==0 )
2ad10 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73  {.    char *zRes
2ad20 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74   = 0;.    output
2ad30 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
2ad40 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
2ad50 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ad60 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2ad70 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45  check GLOB-PATTE
2ad80 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  RN\n");.      rc
2ad90 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 2;.    }else 
2ada0 69 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64  if( (zRes = read
2adb0 46 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f  File("testcase-o
2adc0 75 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20  ut.txt", 0))==0 
2add0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2ade0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2adf0 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20  or: cannot read 
2ae00 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  'testcase-out.tx
2ae10 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t'\n");.      rc
2ae20 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 2;.    }else 
2ae30 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
2ae40 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29  b(azArg[1],zRes)
2ae50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
2ae60 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2ae70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ae80 20 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46    "testcase-%s F
2ae90 41 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64  AILED\n Expected
2aea0 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f  : [%s]\n      Go
2aeb0 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  t: [%s]\n",.    
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2aed0 7a 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67  zTestcase, azArg
2aee0 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20  [1], zRes);.    
2aef0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
2af00 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
2af10 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
2af20 74 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e  testcase-%s ok\n
2af30 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  ", p->zTestcase)
2af40 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63  ;.      p->nChec
2af50 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  k++;.    }.    s
2af60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
2af70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
2af80 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e  ( c=='c' && strn
2af90 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
2afa0 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lone", n)==0 ){.
2afb0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2afc0 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c  ){.      tryToCl
2afd0 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29  one(p, azArg[1])
2afe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2aff0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2b000 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2b010 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  lone FILENAME\n"
2b020 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2b030 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2b040 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
2b050 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
2b060 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61  zArg[0], "databa
2b070 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ses", n)==0 ){. 
2b080 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
2b090 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
2b0a0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f  rrMsg = 0;.    o
2b0b0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2b0c0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
2b0d0 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
2b0e0 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
2b0f0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
2b100 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2b110 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
2b120 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  t;.    sqlite3_s
2b130 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64  nprintf(sizeof(d
2b140 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
2b150 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  ),data.colSepara
2b160 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64  tor,": ");.    d
2b170 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ata.cnt = 0;.   
2b180 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2b190 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d  >db, "SELECT nam
2b1a0 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61  e, file FROM pra
2b1b0 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73  gma_database_lis
2b1c0 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
2b1d0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
2b1e0 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
2b1f0 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
2b200 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2b210 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
2b220 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
2b230 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
2b240 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
2b250 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2b260 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2b270 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
2b280 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2b290 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e  azArg[0], "dbcon
2b2a0 66 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  fig", n)==0 ){. 
2b2b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2b2c0 73 74 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43  struct DbConfigC
2b2d0 68 6f 69 63 65 73 20 7b 63 6f 6e 73 74 20 63 68  hoices {const ch
2b2e0 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f  ar *zName; int o
2b2f0 70 3b 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20  p;} aDbConfig[] 
2b300 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65  = {.        { "e
2b310 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20  nable_fkey",    
2b320 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b330 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20  G_ENABLE_FKEY   
2b340 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b350 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72      { "enable_tr
2b360 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54 45  igger",   SQLITE
2b370 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2b380 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 20 20  _TRIGGER        
2b390 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 66   },.        { "f
2b3a0 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20  ts3_tokenizer", 
2b3b0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b3c0 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
2b3d0 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20  KENIZER  },.    
2b3e0 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65      { "load_exte
2b3f0 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45  nsion",   SQLITE
2b400 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2b410 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
2b420 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e   },.        { "n
2b430 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22  o_ckpt_on_close"
2b440 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
2b450 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f  G_NO_CKPT_ON_CLO
2b460 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  SE       },.    
2b470 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70      { "enable_qp
2b480 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  sg",      SQLITE
2b490 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2b4a0 5f 51 50 53 47 20 20 20 20 20 20 20 20 20 20 20  _QPSG           
2b4b0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74   },.        { "t
2b4c0 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20  rigger_eqp",    
2b4d0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b4e0 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20  G_TRIGGER_EQP   
2b4f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b500 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74      { "reset_dat
2b510 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54 45  abase",   SQLITE
2b520 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f  _DBCONFIG_RESET_
2b530 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20 20  DATABASE        
2b540 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   },.    };.    i
2b550 6e 74 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70  nt ii, v;.    op
2b560 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2b570 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41 72   for(ii=0; ii<Ar
2b580 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69  raySize(aDbConfi
2b590 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  g); ii++){.     
2b5a0 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 73   if( nArg>1 && s
2b5b0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20  trcmp(azArg[1], 
2b5c0 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e  aDbConfig[ii].zN
2b5d0 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ame)!=0 ) contin
2b5e0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  ue;.      if( nA
2b5f0 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg>=3 ){.       
2b600 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
2b610 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e  ig(p->db, aDbCon
2b620 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c  fig[ii].op, bool
2b630 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  eanValue(azArg[2
2b640 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ]), 0);.      }.
2b650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
2b660 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61  _config(p->db, a
2b670 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c  DbConfig[ii].op,
2b680 20 2d 31 2c 20 26 76 29 3b 0a 20 20 20 20 20 20   -1, &v);.      
2b690 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2b6a0 75 74 2c 20 22 25 31 38 73 20 25 73 5c 6e 22 2c  ut, "%18s %s\n",
2b6b0 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a   aDbConfig[ii].z
2b6c0 4e 61 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a  Name, v ? "on" :
2b6d0 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 20 20 69   "off");.      i
2b6e0 66 28 20 6e 41 72 67 3e 31 20 29 20 62 72 65 61  f( nArg>1 ) brea
2b6f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2b700 20 6e 41 72 67 3e 31 20 26 26 20 69 69 3d 3d 41   nArg>1 && ii==A
2b710 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66  rraySize(aDbConf
2b720 69 67 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ig) ){.      utf
2b730 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2b740 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e   "Error: unknown
2b750 20 64 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22   dbconfig \"%s\"
2b760 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2b770 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2b780 66 28 73 74 64 65 72 72 2c 20 22 45 6e 74 65 72  f(stderr, "Enter
2b790 20 5c 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77   \".dbconfig\" w
2b7a0 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
2b7b0 20 66 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b   for a list\n");
2b7c0 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73  .    }   .  }els
2b7d0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
2b7e0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2b7f0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62  mp(azArg[0], "db
2b800 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  info", n)==0 ){.
2b810 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64      rc = shell_d
2b820 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c  binfo_command(p,
2b830 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20   nArg, azArg);. 
2b840 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2b850 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='d' && strncmp(
2b860 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22  azArg[0], "dump"
2b870 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2b880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65  onst char *zLike
2b890 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
2b8a0 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
2b8b0 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68  owHeader = p->sh
2b8c0 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68  owHeader;.    Sh
2b8d0 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  ellClearFlag(p, 
2b8e0 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
2b8f0 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  wid|SHFLG_Newlin
2b900 65 73 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  es);.    for(i=1
2b910 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
2b920 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b        if( azArg[
2b930 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
2b940 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b950 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31   *z = azArg[i]+1
2b960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
2b970 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  0]=='-' ) z++;. 
2b980 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
2b990 70 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f  p(z,"preserve-ro
2b9a0 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66  wids")==0 ){.#if
2b9b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b9c0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2b9d0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
2b9e0 66 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d  f(stderr, "The -
2b9f0 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
2ba00 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63   option is not c
2ba10 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20  ompatible".     
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba30 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53          " with S
2ba40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ba50 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20  ALTABLE\n");.   
2ba60 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2ba70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
2ba80 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2ba90 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
2baa0 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
2bab0 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
2bac0 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  owid);.#endif.  
2bad0 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
2bae0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2baf0 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20  ,"newlines")==0 
2bb00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65  ){.          She
2bb10 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46  llSetFlag(p, SHF
2bb20 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20  LG_Newlines);.  
2bb30 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
2bb40 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2bb50 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2bb60 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
2bb70 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e  on \"%s\" on \".
2bb80 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  dump\"\n", azArg
2bb90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
2bba0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2bbb0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2bbc0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2bbd0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2bbe0 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20  if( zLike ){.   
2bbf0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2bc00 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2bc10 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76  .dump ?--preserv
2bc20 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20  e-rowids? ".    
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc40 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69         "?--newli
2bc50 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  nes? ?LIKE-PATTE
2bc60 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
2bc70 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2bc80 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2bc90 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
2bca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c  else{.        zL
2bcb0 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a  ike = azArg[i];.
2bcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bcd0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2bce0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  .    /* When pla
2bcf0 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d  ying back a "dum
2bd00 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  p", the content 
2bd10 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
2bd20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  an order.    ** 
2bd30 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d  which causes imm
2bd40 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
2bd50 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
2bd60 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20  o be violated.. 
2bd70 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65     ** So disable
2bd80 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e   foreign-key con
2bd90 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d  straint enforcem
2bda0 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70  ent to prevent p
2bdb0 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20  roblems. */.    
2bdc0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2bdd0 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69  t, "PRAGMA forei
2bde0 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29  gn_keys=OFF;\n")
2bdf0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
2be00 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20  (p->out, "BEGIN 
2be10 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29  TRANSACTION;\n")
2be20 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c  ;.    p->writabl
2be30 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
2be40 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
2be50 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77   0;.    /* Set w
2be60 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
2be70 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  N since doing so
2be80 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74   forces SQLite t
2be90 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20  o initialize.   
2bea0 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74   ** as much of t
2beb0 68 65 20 73 63 68 65 6d 61 20 61 73 20 69 74 20  he schema as it 
2bec0 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20  can even if the 
2bed0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2bee0 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ble is.    ** co
2bef0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71  rrupt. */.    sq
2bf00 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2bf10 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d  , "SAVEPOINT dum
2bf20 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  p; PRAGMA writab
2bf30 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30  le_schema=ON", 0
2bf40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , 0, 0);.    p->
2bf50 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  nErr = 0;.    if
2bf60 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20  ( zLike==0 ){.  
2bf70 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64      run_schema_d
2bf80 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20  ump_query(p,.   
2bf90 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2bfa0 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
2bfb0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2bfc0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
2bfd0 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e   sql NOT NULL AN
2bfe0 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20  D type=='table' 
2bff0 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74  AND name!='sqlit
2c000 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
2c010 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
2c020 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
2c030 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
2c040 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
2c050 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
2c060 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
2c070 20 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27    "WHERE name=='
2c080 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
2c090 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
2c0a0 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
2c0b0 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
2c0c0 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
2c0d0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2c0e0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
2c0f0 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e   sql NOT NULL AN
2c100 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
2c110 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
2c120 65 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29  ew')", 0.      )
2c130 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c140 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
2c150 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
2c160 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2c170 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2c180 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
2c190 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2c1a0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
2c1b0 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25   tbl_name LIKE %
2c1c0 51 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  Q AND type=='tab
2c1d0 6c 65 27 22 0a 20 20 20 20 20 20 20 20 22 20 20  le'".        "  
2c1e0 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  AND sql NOT NULL
2c1f0 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20  ", zLike);.     
2c200 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
2c210 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a  _query(p,zSql);.
2c220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c230 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
2c240 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2c250 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2c260 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
2c270 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2c280 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2c290 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20  sql NOT NULL".  
2c2a0 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70        "  AND typ
2c2b0 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74  e IN ('index','t
2c2c0 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22  rigger','view')"
2c2d0 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
2c2e0 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51  tbl_name LIKE %Q
2c2f0 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20  ", zLike);.     
2c300 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
2c310 71 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30  query(p, zSql, 0
2c320 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c330 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2c340 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72   }.    if( p->wr
2c350 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a  itableSchema ){.
2c360 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c370 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41  (p->out, "PRAGMA
2c380 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
2c390 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  =OFF;\n");.     
2c3a0 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65   p->writableSche
2c3b0 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ma = 0;.    }.  
2c3c0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2c3d0 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72  ->db, "PRAGMA wr
2c3e0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
2c3f0 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
2c400 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2c410 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20  p->db, "RELEASE 
2c420 64 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29  dump;", 0, 0, 0)
2c430 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
2c440 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72  (p->out, p->nErr
2c450 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d   ? "ROLLBACK; --
2c460 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e   due to errors\n
2c470 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29  " : "COMMIT;\n")
2c480 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61  ;.    p->showHea
2c490 64 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48  der = savedShowH
2c4a0 65 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a  eader;.  }else..
2c4b0 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2c4c0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2c4d0 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20  , "echo", n)==0 
2c4e0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2c4f0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f  =2 ){.      setO
2c500 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  rClearFlag(p, SH
2c510 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b  FLG_Echo, azArg[
2c520 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2c530 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c540 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2c550 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22   .echo on|off\n"
2c560 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2c570 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2c580 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2c590 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2c5a0 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29  , "eqp", n)==0 )
2c5b0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2c5c0 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75  2 ){.      p->au
2c5d0 74 6f 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20  toEQPtest = 0;. 
2c5e0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2c5f0 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29  azArg[1],"full")
2c600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2c610 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  ->autoEQP = AUTO
2c620 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20  EQP_full;.      
2c630 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2c640 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67  (azArg[1],"trigg
2c650 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
2c660 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
2c670 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b  AUTOEQP_trigger;
2c680 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2c690 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2c6a0 2c 22 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"test")==0 ){. 
2c6b0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2c6c0 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a  P = AUTOEQP_on;.
2c6d0 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
2c6e0 51 50 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20  QPtest = 1;.    
2c6f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c700 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75   p->autoEQP = (u
2c710 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
2c720 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2c730 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2c740 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c750 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
2c760 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65  qp off|on|trigge
2c770 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20  r|full\n");.    
2c780 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2c790 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2c7a0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
2c7b0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
2c7c0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2c7d0 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72  if( nArg>1 && (r
2c7e0 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  c = (int)integer
2c7f0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29  Value(azArg[1]))
2c800 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a  !=0 ) exit(rc);.
2c810 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
2c820 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e  lse..  /* The ".
2c830 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64  explain" command
2c840 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f   is automatic no
2c850 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c  w.  It is largel
2c860 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74  y pointless.  It
2c870 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70  .  ** retained p
2c880 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61  urely for backwa
2c890 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2c8a0 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65  y */.  if( c=='e
2c8b0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2c8c0 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22  rg[0], "explain"
2c8d0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2c8e0 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20  nt val = 1;.    
2c8f0 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
2c900 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2c910 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29  azArg[1],"auto")
2c920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  ==0 ){.        v
2c930 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d  al = 99;.      }
2c940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61  else{.        va
2c950 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  l =  booleanValu
2c960 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2c970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2c980 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e  f( val==1 && p->
2c990 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode!=MODE_Expla
2c9a0 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  in ){.      p->n
2c9b0 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d  ormalMode = p->m
2c9c0 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ode;.      p->mo
2c9d0 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
2c9e0 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  n;.      p->auto
2c9f0 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
2ca00 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
2ca10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2ca20 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
2ca30 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
2ca40 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
2ca50 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
2ca60 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
2ca70 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20  lse if( val==99 
2ca80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2ca90 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
2caa0 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
2cab0 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
2cac0 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
2cad0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  in = 1;.    }.  
2cae0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2caf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2cb00 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d  ALTABLE.  if( c=
2cb10 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2cb20 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72  azArg[0], "exper
2cb30 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2cb40 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2cb50 20 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d      expertDotCom
2cb60 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
2cb70 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
2cb80 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
2cb90 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  f' && strncmp(az
2cba0 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68  Arg[0], "fullsch
2cbb0 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ema", n)==0 ){. 
2cbc0 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
2cbd0 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
2cbe0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
2cbf0 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a  nt doStats = 0;.
2cc00 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2cc10 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
2cc20 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
2cc30 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
2cc40 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2cc50 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53  ta.mode = MODE_S
2cc60 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  emi;.    if( nAr
2cc70 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61  g==2 && optionMa
2cc80 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69  tch(azArg[1], "i
2cc90 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
2cca0 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2ccb0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50  ta.mode = MODE_P
2ccc0 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72  retty;.      nAr
2ccd0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
2cce0 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a   if( nArg!=1 ){.
2ccf0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2cd00 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2cd10 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d   .fullschema ?--
2cd20 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20  indent?\n");.   
2cd30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2cd40 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2cd50 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2cd60 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2cd70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2cd80 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
2cd90 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
2cda0 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22  l FROM".       "
2cdb0 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
2cdc0 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
2cdd0 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
2cde0 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
2cdf0 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20 20  d x".       "   
2ce00 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
2ce10 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
2ce20 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
2ce30 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  T sql, type, tbl
2ce40 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77  _name, name, row
2ce50 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  id FROM sqlite_t
2ce60 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20  emp_master) ".  
2ce70 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
2ce80 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
2ce90 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d   NOTNULL AND nam
2cea0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
2ceb0 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22  te_%' ".       "
2cec0 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
2ced0 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b  .       callback
2cee0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2cef0 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  g.    );.    if(
2cf00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cf10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2cf20 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
2cf30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2cf40 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2cf50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2cf60 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
2cf70 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2cf80 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2cf90 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47    " WHERE name G
2cfa0 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74  LOB 'sqlite_stat
2cfb0 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20  [134]'",.       
2cfc0 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
2cfd0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f  mt, 0);.      do
2cfe0 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  Stats = sqlite3_
2cff0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2d000 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73  ITE_ROW;.      s
2d010 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2d020 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
2d030 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30    if( doStats==0
2d040 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2d050 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
2d060 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20   No STAT tables 
2d070 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29  available */\n")
2d080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d090 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2d0a0 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
2d0b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
2d0c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d0d0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2d0e0 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71  LECT 'ANALYZE sq
2d0f0 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20  lite_master'",. 
2d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d110 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
2d120 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
2d130 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2d140 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2d150 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
2d160 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2d170 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  = "sqlite_stat1"
2d180 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2d190 65 63 28 70 2c 20 22 53 45 4c 45 43 54 20 2a 20  ec(p, "SELECT * 
2d1a0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
2d1b0 31 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  1", &zErrMsg);. 
2d1c0 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54       data.zDestT
2d1d0 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73  able = "sqlite_s
2d1e0 74 61 74 33 22 3b 0a 20 20 20 20 20 20 73 68 65  tat3";.      she
2d1f0 6c 6c 5f 65 78 65 63 28 70 2c 20 22 53 45 4c 45  ll_exec(p, "SELE
2d200 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
2d210 5f 73 74 61 74 33 22 2c 20 26 7a 45 72 72 4d 73  _stat3", &zErrMs
2d220 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a  g);.      data.z
2d230 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c  DestTable = "sql
2d240 69 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20  ite_stat4";.    
2d250 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20    shell_exec(p, 
2d260 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
2d270 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 26 7a  qlite_stat4", &z
2d280 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
2d290 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2d2a0 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
2d2b0 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
2d2c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2d2d0 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
2d2e0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2d2f0 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30  "headers", n)==0
2d300 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2d310 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
2d320 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f  showHeader = boo
2d330 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2d340 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2d350 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2d360 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2d370 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66   .headers on|off
2d380 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2d390 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2d3a0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
2d3b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d3c0 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d  [0], "help", n)=
2d3d0 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
2d3e0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
2d3f0 73 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65  s", zHelp);.  }e
2d400 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69  lse..  if( c=='i
2d410 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2d420 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c  rg[0], "import",
2d430 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
2d440 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
2d450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2d460 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
2d470 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
2d480 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
2d490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d4a0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 65  ame of file to e
2d4b0 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f  xtra content fro
2d4c0 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  m */.    sqlite3
2d4d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
2d4e0 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d  ULL; /* A statem
2d4f0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ent */.    int n
2d500 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2d510 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d520 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2d530 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
2d540 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
2d550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d560 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2d570 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  n an SQL string 
2d580 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  */.    int i, j;
2d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2d5b0 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
2d5c0 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20  eedCommit;      
2d5d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2d5e0 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  o COMMIT or ROLL
2d5f0 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20  BACK at end */. 
2d600 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d620 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2d630 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72  s in p->colSepar
2d640 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  ator[] */.    ch
2d650 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
2d660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
2d670 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
2d680 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20 73  .    ImportCtx s
2d690 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ctx;            
2d6a0 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74 65   /* Reader conte
2d6b0 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  xt */.    char *
2d6c0 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
2d6d0 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78 2a  Read)(ImportCtx*
2d6e0 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65  ); /* Func to re
2d6f0 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a  ad one value */.
2d700 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45 5f      int (SQLITE_
2d710 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28  CDECL *xCloser)(
2d720 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20  FILE*);      /* 
2d730 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66 69  Func to close fi
2d740 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e  le */..    if( n
2d750 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
2d760 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2d770 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
2d780 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22  rt FILE TABLE\n"
2d790 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  );.      goto me
2d7a0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2d7b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
2d7c0 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
2d7d0 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
2d7e0 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74 65  2];.    seenInte
2d7f0 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d  rrupt = 0;.    m
2d800 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
2d810 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
2d820 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2d830 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ;.    nSep = str
2d840 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61  len30(p->colSepa
2d850 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  rator);.    if( 
2d860 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
2d870 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2d880 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
2d890 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e       "Error: non
2d8a0 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70  -null column sep
2d8b0 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
2d8c0 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
2d8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d8e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2d8f0 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
2d900 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d910 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
2d920 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20  haracter column 
2d930 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61  separators not a
2d940 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20  llowed".        
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2d960 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
2d970 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d980 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d      }.    nSep =
2d990 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77   strlen30(p->row
2d9a0 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
2d9b0 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
2d9c0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2d9d0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2d9e0 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70  non-null row sep
2d9f0 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
2da00 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
2da10 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2da20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2da30 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65  ep==2 && p->mode
2da40 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73 74  ==MODE_Csv && st
2da50 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61 72  rcmp(p->rowSepar
2da60 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d  ator, SEP_CrLf)=
2da70 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  =0 ){.      /* W
2da80 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43 53  hen importing CS
2da90 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65  V (only), if the
2daa0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 69   row separator i
2dab0 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 20  s set to the.   
2dac0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75     ** default ou
2dad0 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
2dae0 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f  or, change it to
2daf0 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 70   the default inp
2db00 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  ut.      ** row 
2db10 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69 73  separator.  This
2db20 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20 74   avoids having t
2db30 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66 65  o maintain diffe
2db40 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20 20  rent input.     
2db50 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20 72   ** and output r
2db60 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20 2a  ow separators. *
2db70 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
2db80 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2db90 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2dba0 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
2dbb0 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
2dbc0 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
2dbd0 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  30(p->rowSeparat
2dbe0 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
2dbf0 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20  f( nSep>1 ){.   
2dc00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2dc10 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
2dc20 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 72 6f  lti-character ro
2dc30 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  w separators not
2dc40 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc60 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
2dc70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2dc80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78  ;.    }.    sCtx
2dc90 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  .zFile = zFile;.
2dca0 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d      sCtx.nLine =
2dcb0 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74 78   1;.    if( sCtx
2dcc0 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29  .zFile[0]=='|' )
2dcd0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2dce0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20  OMIT_POPEN.     
2dcf0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2dd00 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65  rr, "Error: pipe
2dd10 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72  s are not suppor
2dd20 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e  ted in this OS\n
2dd30 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2dd40 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   1;.#else.      
2dd50 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28  sCtx.in = popen(
2dd60 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72  sCtx.zFile+1, "r
2dd70 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 7a  ");.      sCtx.z
2dd80 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b  File = "<pipe>";
2dd90 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
2dda0 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a   pclose;.#endif.
2ddb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ddc0 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e   sCtx.in = fopen
2ddd0 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62  (sCtx.zFile, "rb
2dde0 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  ");.      xClose
2ddf0 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20  r = fclose;.    
2de00 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64  }.    if( p->mod
2de10 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b  e==MODE_Ascii ){
2de20 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 61  .      xRead = a
2de30 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
2de40 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eld;.    }else{.
2de50 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 63 73        xRead = cs
2de60 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
2de70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2de80 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20  sCtx.in==0 ){.  
2de90 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2dea0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2deb0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
2dec0 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
2ded0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2dee0 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63 43     }.    sCtx.cC
2def0 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65  olSep = p->colSe
2df00 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
2df10 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20 70  sCtx.cRowSep = p
2df20 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 30  ->rowSeparator[0
2df30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  ];.    zSql = sq
2df40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
2df50 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73 22  ELECT * FROM %s"
2df60 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
2df70 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2df80 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2df90 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  .in);.      shel
2dfa0 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
2dfb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
2dfc0 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  te = strlen30(zS
2dfd0 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ql);.    rc = sq
2dfe0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2dff0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2e000 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2e010 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
2e020 63 68 61 72 28 26 73 43 74 78 2c 20 30 29 3b 20  char(&sCtx, 0); 
2e030 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
2e040 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f 63 61  sCtx.z is alloca
2e050 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ted */.    if( r
2e060 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  c && sqlite3_str
2e070 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74 61  glob("no such ta
2e080 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33  ble: *", sqlite3
2e090 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3d  _errmsg(p->db))=
2e0a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
2e0b0 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69   *zCreate = sqli
2e0c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52 45  te3_mprintf("CRE
2e0d0 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ATE TABLE %s", z
2e0e0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63 68  Table);.      ch
2e0f0 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20  ar cSep = '(';. 
2e100 20 20 20 20 20 77 68 69 6c 65 28 20 78 52 65 61       while( xRea
2e110 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20 20 20  d(&sCtx) ){.    
2e120 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71      zCreate = sq
2e130 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2e140 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20 54 45  z%c\n  \"%w\" TE
2e150 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63 53  XT", zCreate, cS
2e160 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ep, sCtx.z);.   
2e170 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b       cSep = ',';
2e180 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43 74  .        if( sCt
2e190 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
2e1a0 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b 0a 20  olSep ) break;. 
2e1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e1c0 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20   cSep=='(' ){.  
2e1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e1e0 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20  ee(zCreate);.   
2e1f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2e200 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20  e(sCtx.z);.     
2e210 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2e220 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  in);.        utf
2e230 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e240 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c 65 5c  "%s: empty file\
2e250 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 29 3b  n", sCtx.zFile);
2e260 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e270 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2e280 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74   zCreate = sqlit
2e290 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e  e3_mprintf("%z\n
2e2a0 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20  )", zCreate);.  
2e2b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e2c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43 72  _exec(p->db, zCr
2e2d0 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  eate, 0, 0, 0);.
2e2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e2f0 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20 20  ee(zCreate);.   
2e300 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e310 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e320 28 73 74 64 65 72 72 2c 20 22 43 52 45 41 54 45  (stderr, "CREATE
2e330 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29 20 66   TABLE %s(...) f
2e340 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 7a 54  ailed: %s\n", zT
2e350 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  able,.          
2e360 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
2e370 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
2e380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e390 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
2e3a0 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2e3b0 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  .in);.        re
2e3c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2e3d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e3e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2e3f0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
2e400 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
2e410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e420 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
2e430 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 20   rc ){.      if 
2e440 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f  (pStmt) sqlite3_
2e450 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2e460 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2e470 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2e480 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2e490 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2e4a0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73  .      xCloser(s
2e4b0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72  Ctx.in);.      r
2e4c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2e4d0 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
2e4e0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
2e4f0 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
2e500 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2e510 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
2e520 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  0;.    if( nCol=
2e530 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  =0 ) return 0; /
2e540 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f  * no columns, no
2e550 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53   error */.    zS
2e560 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ql = sqlite3_mal
2e570 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32 20 2b  loc64( nByte*2 +
2e580 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a   20 + nCol*2 );.
2e590 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
2e5a0 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  ){.      xCloser
2e5b0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2e5c0 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
2e5d0 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
2e5e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2e5f0 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71  tf(nByte+20, zSq
2e600 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  l, "INSERT INTO 
2e610 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28 3f 22  \"%w\" VALUES(?"
2e620 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
2e630 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
2e640 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
2e650 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
2e660 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2e670 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
2e680 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
2e690 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
2e6a0 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
2e6b0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
2e6c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2e6d0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2e6e0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2e6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e700 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
2e710 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
2e720 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e730 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2e740 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2e750 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  ->db));.      if
2e760 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
2e770 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2e780 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
2e790 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2e7a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2e7b0 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d      needCommit =
2e7c0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
2e7d0 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a  ocommit(p->db);.
2e7e0 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d      if( needComm
2e7f0 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  it ) sqlite3_exe
2e800 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  c(p->db, "BEGIN"
2e810 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2e820 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  do{.      int st
2e830 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e  artLine = sCtx.n
2e840 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
2e850 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
2e860 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2e870 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43 74 78  *z = xRead(&sCtx
2e880 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20  );.        /*.  
2e890 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20        ** Did we 
2e8a0 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
2e8b0 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67  e before finding
2e8c0 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20   any columns?.  
2e8d0 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20        ** If so, 
2e8e0 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20  stop instead of 
2e8f0 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65  NULL filling the
2e900 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
2e910 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
2e920 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20         if( z==0 
2e930 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b  && i==0 ) break;
2e940 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
2e950 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65      ** Did we re
2e960 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20  ach end-of-file 
2e970 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62  OR end-of-line b
2e980 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e  efore finding an
2e990 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c  y.        ** col
2e9a0 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20 6d 6f  umns in ASCII mo
2e9b0 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f 70  de?  If so, stop
2e9c0 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c   instead of NULL
2e9d0 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   filling.       
2e9e0 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   ** the remainin
2e9f0 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20  g columns..     
2ea00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2ea10 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
2ea20 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c  Ascii && (z==0 |
2ea30 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d  | z[0]==0) && i=
2ea40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2ea50 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
2ea60 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
2ea70 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
2ea80 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
2ea90 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31      if( i<nCol-1
2eaa0 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d 21 3d   && sCtx.cTerm!=
2eab0 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a  sCtx.cColSep ){.
2eac0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2ead0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
2eae0 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  s:%d: expected %
2eaf0 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f  d columns but fo
2eb00 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20  und %d - ".     
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20 74 68       "filling th
2eb30 65 20 72 65 73 74 20 77 69 74 68 20 4e 55 4c 4c  e rest with NULL
2eb40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2eb60 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74  Ctx.zFile, start
2eb70 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  Line, nCol, i+1)
2eb80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
2eb90 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   2;.          wh
2eba0 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20  ile( i<=nCol ){ 
2ebb0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
2ebc0 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b  l(pStmt, i); i++
2ebd0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
2ebe0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ebf0 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78  sCtx.cTerm==sCtx
2ec00 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20  .cColSep ){.    
2ec10 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
2ec20 20 20 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a    xRead(&sCtx);.
2ec30 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
2ec40 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 73         }while( s
2ec50 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e  Ctx.cTerm==sCtx.
2ec60 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20 20 20  cColSep );.     
2ec70 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2ec80 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
2ec90 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2eca0 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
2ecb0 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 74              "ext
2ecd0 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a  ras ignored\n",.
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecf0 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
2ed00 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
2ed10 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  Col, i);.      }
2ed20 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43  .      if( i>=nC
2ed30 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
2ed40 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2ed50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2ed60 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
2ed70 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  tmt);.        if
2ed80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ed90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
2eda0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2edb0 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52 54 20   "%s:%d: INSERT 
2edc0 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
2edd0 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20  Ctx.zFile,.     
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edf0 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69   startLine, sqli
2ee00 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2ee10 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
2ee20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
2ee30 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f  ( sCtx.cTerm!=EO
2ee40 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65  F );..    xClose
2ee50 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2ee60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
2ee70 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x.z);.    sqlite
2ee80 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2ee90 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43  );.    if( needC
2eea0 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f  ommit ) sqlite3_
2eeb0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d  exec(p->db, "COM
2eec0 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
2eed0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
2eee0 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42   SQLITE_UNTESTAB
2eef0 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  LE.  if( c=='i' 
2ef00 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2ef10 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c  [0], "imposter",
2ef20 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
2ef30 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68  ar *zSql;.    ch
2ef40 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30  ar *zCollist = 0
2ef50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
2ef60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69  mt *pStmt;.    i
2ef70 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  nt tnum = 0;.   
2ef80 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
2ef90 21 28 6e 41 72 67 3d 3d 33 20 7c 7c 20 28 6e 41  !(nArg==3 || (nA
2efa0 72 67 3d 3d 32 20 26 26 20 73 71 6c 69 74 65 33  rg==2 && sqlite3
2efb0 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b 31  _stricmp(azArg[1
2efc0 5d 2c 22 6f 66 66 22 29 3d 3d 30 29 29 20 29 7b  ],"off")==0)) ){
2efd0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2efe0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2eff0 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44  e: .imposter IND
2f000 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e 22 0a 20  EX IMPOSTER\n". 
2f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f020 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
2f030 20 2e 69 6d 70 6f 73 74 65 72 20 6f 66 66 5c 6e   .imposter off\n
2f040 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2f050 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2f060 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2f070 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2f080 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
2f090 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2f0a0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2f0b0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2f0c0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
2f0d0 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20   p->db, "main", 
2f0e0 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 67 6f 74  0, 1);.      got
2f0f0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2f100 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
2f110 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2f120 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 72 6f  rintf("SELECT ro
2f130 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
2f140 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
2f170 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
2f180 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41 72 67  ='index'", azArg
2f190 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [1]);.    sqlite
2f1a0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2f1b0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2f1c0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2f1d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2f1e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2f1f0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
2f200 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2f210 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65     tnum = sqlite
2f220 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2f230 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  mt, 0);.    }.  
2f240 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2f250 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
2f260 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  f( tnum==0 ){.  
2f270 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f280 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68  stderr, "no such
2f290 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e   index: \"%s\"\n
2f2a0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2f2b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f2c0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2f2d0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2f2e0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2f2f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
2f300 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27  MA index_xinfo='
2f310 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  %q'", azArg[1]);
2f320 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f330 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2f340 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2f350 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2f360 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2f370 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20  ;.    i = 0;.   
2f380 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
2f390 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2f3a0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
2f3b0 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d   char zLabel[20]
2f3c0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
2f3d0 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73  ar *zCol = (cons
2f3e0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2f3f0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2f400 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  t,2);.      i++;
2f410 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d  .      if( zCol=
2f420 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
2f430 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
2f440 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d  _int(pStmt,1)==-
2f450 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  1 ){.          z
2f460 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b  Col = "_ROWID_";
2f470 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2f480 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f490 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f4a0 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c  f(zLabel),zLabel
2f4b0 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a 20 20  ,"expr%d",i);.  
2f4c0 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a          zCol = z
2f4d0 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Label;.        }
2f4e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f4f0 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29  f( zCollist==0 )
2f500 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69  {.        zColli
2f510 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
2f520 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
2f530 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Col);.      }els
2f540 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  e{.        zColl
2f550 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ist = sqlite3_mp
2f560 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22  rintf("%z,\"%w\"
2f570 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f  ", zCollist, zCo
2f580 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2f590 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
2f5a0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2f5b0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2f5c0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2f5d0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
2f5e0 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50 52 49  LE \"%w\"(%s,PRI
2f5f0 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57 49 54  MARY KEY(%s))WIT
2f600 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20  HOUT ROWID",.   
2f610 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c         azArg[2],
2f620 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c   zCollist, zColl
2f630 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2f640 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29  3_free(zCollist)
2f650 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f660 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2f670 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f680 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c  IMPOSTER, p->db,
2f690 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d   "main", 1, tnum
2f6a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2f6b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f6c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2f6d0 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
2f6e0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
2f6f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2f700 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2f710 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
2f720 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30  p->db, "main", 0
2f730 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2f740 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2f750 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2f760 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d  , "Error in [%s]
2f770 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73  : %s\n", zSql, s
2f780 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2f790 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >db));.      }el
2f7a0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  se{.        utf8
2f7b0 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
2f7c0 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  "%s;\n", zSql);.
2f7d0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2f7e0 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20 20 20  tf(stdout,.     
2f7f0 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20        "WARNING: 
2f800 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d  writing to an im
2f810 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77 69 6c  poster table wil
2f820 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20 69 6e  l corrupt the in
2f830 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20 20 20  dex!\n".        
2f840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f850 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2f860 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f870 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f880 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72 6e 73  IMPOSTER returns
2f890 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
2f8a0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f8b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2f8c0 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65  e(zSql);.  }else
2f8d0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2f8e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f8f0 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f  TEST_CONTROL) */
2f900 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2f910 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
2f920 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
2f930 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f940 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d   "iotrace", n)==
2f950 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f  0 ){.    SQLITE_
2f960 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69 64 20  API extern void 
2f970 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73  (SQLITE_CDECL *s
2f980 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63  qlite3IoTrace)(c
2f990 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29  onst char*, ...)
2f9a0 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61 63  ;.    if( iotrac
2f9b0 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74  e && iotrace!=st
2f9c0 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f  dout ) fclose(io
2f9d0 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72  trace);.    iotr
2f9e0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ace = 0;.    if(
2f9f0 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
2fa00 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2fa10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2fa20 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
2fa30 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20  1], "-")==0 ){. 
2fa40 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
2fa50 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
2fa60 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61  ntf;.      iotra
2fa70 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ce = stdout;.   
2fa80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
2fa90 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a  trace = fopen(az
2faa0 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20  Arg[1], "w");.  
2fab0 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d      if( iotrace=
2fac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
2fad0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2fae0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2faf0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
2fb00 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2fb10 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
2fb20 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2fb30 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rc = 1;.      }e
2fb40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2fb50 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
2fb60 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
2fb70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2fb80 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
2fb90 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20   c=='l' && n>=5 
2fba0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2fbb0 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e  [0], "limits", n
2fbc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
2fbd0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2fbe0 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  {.       const c
2fbf0 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b  har *zLimitName;
2fc00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
2fc10 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20  limit */.       
2fc20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20  int limitCode;  
2fc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
2fc40 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68  eger code for th
2fc50 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20  at limit */.    
2fc60 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  } aLimit[] = {. 
2fc70 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c       { "length",
2fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc90 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
2fca0 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  GTH             
2fcb0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2fcc0 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20  { "sql_length", 
2fcd0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2fce0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
2fcf0 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
2fd00 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f    },.      { "co
2fd10 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20  lumn",          
2fd20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2fd30 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20  IT_COLUMN       
2fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2fd50 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65        { "expr_de
2fd60 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  pth",           
2fd70 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58   SQLITE_LIMIT_EX
2fd80 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  PR_DEPTH        
2fd90 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2fda0 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c   { "compound_sel
2fdb0 65 63 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ect",       SQLI
2fdc0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
2fdd0 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  D_SELECT        
2fde0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76     },.      { "v
2fdf0 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20  dbe_op",        
2fe00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2fe10 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20  MIT_VDBE_OP     
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2fe30 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69  .      { "functi
2fe40 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20  on_arg",        
2fe50 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46    SQLITE_LIMIT_F
2fe60 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20  UNCTION_ARG     
2fe70 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2fe80 20 20 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20    { "attached", 
2fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2fea0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
2feb0 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ED              
2fec0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2fed0 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e  like_pattern_len
2fee0 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c  gth",   SQLITE_L
2fef0 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
2ff00 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d  N_LENGTH       }
2ff10 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72 69 61  ,.      { "varia
2ff20 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20  ble_number",    
2ff30 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2ff40 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
2ff50 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2ff60 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65     { "trigger_de
2ff70 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 53 51  pth",         SQ
2ff80 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
2ff90 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  ER_DEPTH        
2ffa0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2ffb0 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22  "worker_threads"
2ffc0 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
2ffd0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
2ffe0 45 41 44 53 20 20 20 20 20 20 20 20 20 20 20 20  EADS            
2fff0 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
30000 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65  t i, n2;.    ope
30010 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
30020 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
30030 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
30040 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74  ArraySize(aLimit
30050 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
30060 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64   printf("%20s %d
30070 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a  \n", aLimit[i].z
30080 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20  LimitName,.     
30090 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
300a0 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
300b0 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f  Limit[i].limitCo
300c0 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  de, -1));.      
300d0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
300e0 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20  nArg>3 ){.      
300f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
30100 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69  r, "Usage: .limi
30110 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55  t NAME ?NEW-VALU
30120 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  E?\n");.      rc
30130 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
30140 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30150 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  it;.    }else{. 
30160 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20       int iLimit 
30170 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d  = -1;.      n2 =
30180 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
30190 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  1]);.      for(i
301a0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
301b0 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20  aLimit); i++){. 
301c0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
301d0 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d  e3_strnicmp(aLim
301e0 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  it[i].zLimitName
301f0 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d  , azArg[1], n2)=
30200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30210 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a  if( iLimit<0 ){.
30220 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 69 6d              iLim
30230 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  it = i;.        
30240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30250 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30260 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75  (stderr, "ambigu
30270 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c  ous limit: \"%s\
30280 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
30290 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
302a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
302b0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
302c0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
302d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
302e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
302f0 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
30300 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30310 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
30320 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c  n limit: \"%s\"\
30330 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
30340 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 74 65             "ente
30350 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69  r \".limits\" wi
30360 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  th no arguments 
30370 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a  for a list.\n",.
30380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30390 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31           azArg[1
303a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
303b0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
303c0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
303d0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
303e0 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
303f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30400 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c  _limit(p->db, aL
30410 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d  imit[iLimit].lim
30420 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  itCode,.        
30430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
30440 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
30450 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20  azArg[2]));.    
30460 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
30470 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c  ("%20s %d\n", aL
30480 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69  imit[iLimit].zLi
30490 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  mitName,.       
304a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
304b0 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
304c0 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43  t[iLimit].limitC
304d0 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ode, -1));.    }
304e0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
304f0 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26 26  c=='l' && n>2 &&
30500 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
30510 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30  ], "lint", n)==0
30520 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
30530 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44  p, 0);.    lintD
30540 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
30550 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
30560 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
30570 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
30580 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d  ENSION.  if( c==
30590 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'l' && strncmp(a
305a0 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c  zArg[0], "load",
305b0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
305c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
305d0 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61   *zProc;.    cha
305e0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
305f0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
30600 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
30610 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30620 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45  e: .load FILE ?E
30630 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a  NTRYPOINT?\n");.
30640 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30650 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
30660 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
30670 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
30680 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f  Arg[1];.    zPro
30690 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  c = nArg>=3 ? az
306a0 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20  Arg[2] : 0;.    
306b0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
306c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
306d0 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
306e0 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72  ->db, zFile, zPr
306f0 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  oc, &zErrMsg);. 
30700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74  E_OK ){.      ut
30720 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
30730 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
30740 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
30750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
30760 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
30770 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
30780 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
30790 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e  ( c=='l' && strn
307a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
307b0 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  og", n)==0 ){.  
307c0 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
307d0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
307e0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
307f0 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c  : .log FILENAME\
30800 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
30810 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
30820 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30830 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
30840 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66  ;.      output_f
30850 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f  ile_close(p->pLo
30860 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f  g);.      p->pLo
30870 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  g = output_file_
30880 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 30 29 3b 0a  open(zFile, 0);.
30890 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
308a0 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73   if( c=='m' && s
308b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
308c0 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29   "mode", n)==0 )
308d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
308e0 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d   *zMode = nArg>=
308f0 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
30900 22 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20  ";.    int n2 = 
30910 73 74 72 6c 65 6e 33 30 28 7a 4d 6f 64 65 29 3b  strlen30(zMode);
30920 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d  .    int c2 = zM
30930 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ode[0];.    if( 
30940 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
30950 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30960 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d  [1],"lines",n2)=
30970 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
30980 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b  ode = MODE_Line;
30990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
309a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
309b0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
309c0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
309d0 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
309e0 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63  }else if( c2=='c
309f0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
30a00 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c  rg[1],"columns",
30a10 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
30a20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
30a30 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c  olumn;.      sql
30a40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30a50 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
30a60 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
30a70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
30a80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30a90 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
30aa0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30ab0 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d  [1],"list",n2)==
30ac0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
30ad0 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
30ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
30af0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
30b00 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
30b10 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
30b20 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20   SEP_Column);.  
30b30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30b40 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
30b50 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
30b60 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
30b70 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
30b80 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26  se if( c2=='h' &
30b90 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
30ba0 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30  1],"html",n2)==0
30bb0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
30bc0 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20  e = MODE_Html;. 
30bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
30be0 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
30bf0 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e  azArg[1],"tcl",n
30c00 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
30c10 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63  ->mode = MODE_Tc
30c20 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
30c30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30c40 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
30c50 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
30c60 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a  or, SEP_Space);.
30c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
30c80 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
30c90 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
30ca0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
30cb0 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
30cc0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27  else if( c2=='c'
30cd0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30ce0 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d  g[1],"csv",n2)==
30cf0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
30d00 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
30d10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
30d20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30d30 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
30d40 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
30d50 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
30d60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30d70 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
30d80 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
30d90 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
30da0 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73  _CrLf);.    }els
30db0 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
30dc0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
30dd0 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20  ],"tabs",n2)==0 
30de0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
30df0 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
30e00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30e10 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
30e20 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
30e30 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
30e40 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c  EP_Tab);.    }el
30e50 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26  se if( c2=='i' &
30e60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
30e70 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d  1],"insert",n2)=
30e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
30e90 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
30ea0 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62  t;.      set_tab
30eb0 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e  le_name(p, nArg>
30ec0 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20  =3 ? azArg[2] : 
30ed0 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65  "table");.    }e
30ee0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20  lse if( c2=='q' 
30ef0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30f00 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d  [1],"quote",n2)=
30f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
30f20 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65  ode = MODE_Quote
30f30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30f40 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63  c2=='a' && strnc
30f50 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63  mp(azArg[1],"asc
30f60 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ii",n2)==0 ){.  
30f70 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
30f80 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20  DE_Ascii;.      
30f90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30fa0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
30fb0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
30fc0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55  Separator, SEP_U
30fd0 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nit);.      sqli
30fe0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30ff0 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
31000 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
31010 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72  rator, SEP_Recor
31020 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
31030 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
31040 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
31050 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f  >out, "current o
31060 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e  utput mode: %s\n
31070 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e  ", modeDescr[p->
31080 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  mode]);.    }els
31090 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
310a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
310b0 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20  or: mode should 
310c0 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
310d0 20 20 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c        "ascii col
310e0 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73  umn csv html ins
310f0 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75  ert line list qu
31100 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29  ote tabs tcl\n")
31110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
31120 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f      }.    p->cMo
31130 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
31140 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
31150 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'n' && strncmp(a
31160 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61  zArg[0], "nullva
31170 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  lue", n)==0 ){. 
31180 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
31190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
311a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
311b0 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70  p->nullValue), p
311c0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20  ->nullValue,.   
311d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311e0 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
311f0 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
31200 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llValue)-1, azAr
31210 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
31220 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
31230 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
31240 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54  e: .nullvalue ST
31250 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20  RING\n");.      
31260 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
31270 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
31280 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'o' && strncmp(a
31290 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c  zArg[0], "open",
312a0 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29   n)==0 && n>=2 )
312b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
312c0 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61  Filename;  /* Na
312d0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
312e0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
312f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65  */.    int iName
31300 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 1;       /* I
31310 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ndex in azArg[] 
31320 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
31330 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c  */.    int newFl
31340 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ag = 0;     /* T
31350 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69  rue to delete fi
31360 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e  le before openin
31370 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g */.    /* Clos
31380 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  e the existing d
31390 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73  atabase */.    s
313a0 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
313b0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
313c0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
313d0 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
313e0 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
313f0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
31400 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f  3_free(p->zFreeO
31410 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e  nClose);.    p->
31420 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30  zFreeOnClose = 0
31430 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64  ;.    p->openMod
31440 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  e = SHELL_OPEN_U
31450 4e 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68  NSPEC;.    /* Ch
31460 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d  eck for command-
31470 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a  line arguments *
31480 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d  /.    for(iName=
31490 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26  1; iName<nArg &&
314a0 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d   azArg[iName][0]
314b0 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b  =='-'; iName++){
314c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
314d0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61  r *z = azArg[iNa
314e0 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  me];.      if( o
314f0 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65  ptionMatch(z,"ne
31500 77 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  w") ){.        n
31510 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64  ewFlag = 1;.#ifd
31520 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
31530 4c 49 42 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LIB.      }else 
31540 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
31550 7a 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20  z, "zip") ){.   
31560 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
31570 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49   = SHELL_OPEN_ZI
31580 50 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20  PFILE;.#endif.  
31590 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
315a0 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70  tionMatch(z, "ap
315b0 70 65 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20  pend") ){.      
315c0 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
315d0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
315e0 44 56 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DVFS;.      }els
315f0 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
31600 68 28 7a 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29  h(z, "readonly")
31610 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
31620 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
31630 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
31640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
31650 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
31660 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31670 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
31680 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
31690 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z);.        rc =
316a0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
316b0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
316c0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
316d0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69  }.    /* If a fi
316e0 6c 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  lename is specif
316f0 69 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ied, try to open
31700 20 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20   it first */.   
31710 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20   zNewFilename = 
31720 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c  nArg>iName ? sql
31730 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
31740 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29  ", azArg[iName])
31750 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e   : 0;.    if( zN
31760 65 77 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20  ewFilename ){.  
31770 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
31780 29 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  ) shellDeleteFil
31790 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  e(zNewFilename);
317a0 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
317b0 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65  ename = zNewFile
317c0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e  name;.      open
317d0 5f 64 62 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  _db(p, 1);.     
317e0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
317f0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31800 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
31810 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
31820 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69   '%s'\n", zNewFi
31830 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
31840 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
31850 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ewFilename);.   
31860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31870 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
31880 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  e = zNewFilename
31890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
318a0 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
318b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 20   ){.      /* As 
318c0 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e  a fall-back open
318d0 20 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65   a TEMP database
318e0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62   */.      p->zDb
318f0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
31900 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
31920 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a  ..  if( (c=='o'.
31930 20 20 20 20 20 20 20 20 26 26 20 28 73 74 72 6e          && (strn
31940 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
31950 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73  utput", n)==0||s
31960 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31970 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29   "once", n)==0))
31980 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26  .   || (c=='e' &
31990 26 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70  & n==5 && strcmp
319a0 28 61 7a 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c  (azArg[0],"excel
319b0 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  ")==0).  ){.    
319c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
319d0 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  e = nArg>=2 ? az
319e0 41 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74  Arg[1] : "stdout
319f0 22 3b 0a 20 20 20 20 69 6e 74 20 62 54 78 74 4d  ";.    int bTxtM
31a00 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ode = 0;.    if(
31a10 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65   azArg[0][0]=='e
31a20 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  ' ){.      /* Tr
31a30 61 6e 73 66 6f 72 6d 20 74 68 65 20 22 2e 65 78  ansform the ".ex
31a40 63 65 6c 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74  cel" command int
31a50 6f 20 22 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a  o ".once -x" */.
31a60 20 20 20 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a        nArg = 2;.
31a70 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d        azArg[0] =
31a80 20 22 6f 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a   "once";.      z
31a90 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20  File = azArg[1] 
31aa0 3d 20 22 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20  = "-x";.      n 
31ab0 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 4;.    }.    i
31ac0 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20  f( nArg>2 ){.   
31ad0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
31ae0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
31af0 25 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c  %s [-e|-x|FILE]\
31b00 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
31b10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31b20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
31b30 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
31b40 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20  .    if( n>1 && 
31b50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31b60 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20  , "once", n)==0 
31b70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
31b80 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  g<2 ){.        r
31b90 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31ba0 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20  , "Usage: .once 
31bb0 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29  (-e|-x|FILE)\n")
31bc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
31bd0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
31be0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
31bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31c00 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b  p->outCount = 2;
31c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31c20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20    p->outCount = 
31c30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74  0;.    }.    out
31c40 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  put_reset(p);.  
31c50 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
31c60 27 2d 27 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d  '-' && zFile[1]=
31c70 3d 27 2d 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a  ='-' ) zFile++;.
31c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
31c90 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20  OHAVE_SYSTEM.   
31ca0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
31cb0 65 2c 20 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73  e, "-e")==0 || s
31cc0 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78  trcmp(zFile, "-x
31cd0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
31ce0 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b  ->doXdgOpen = 1;
31cf0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
31d00 65 50 75 73 68 28 70 29 3b 0a 20 20 20 20 20 20  ePush(p);.      
31d10 69 66 28 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78  if( zFile[1]=='x
31d20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  ' ){.        new
31d30 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 63 73 76  TempFile(p, "csv
31d40 22 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d  ");.        p->m
31d50 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
31d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31d70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
31d80 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
31d90 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
31da0 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20  r, SEP_Comma);. 
31db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
31dc0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
31dd0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
31de0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
31df0 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20  , SEP_CrLf);.   
31e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31e10 20 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c    newTempFile(p,
31e20 20 22 74 78 74 22 29 3b 0a 20 20 20 20 20 20 20   "txt");.       
31e30 20 62 54 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20   bTxtMode = 1;. 
31e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
31e50 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  le = p->zTempFil
31e60 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  e;.    }.#endif 
31e70 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  /* SQLITE_NOHAVE
31e80 5f 53 59 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69  _SYSTEM */.    i
31e90 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27  f( zFile[0]=='|'
31ea0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
31eb0 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
31ec0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31ed0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69  derr, "Error: pi
31ee0 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  pes are not supp
31ef0 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53  orted in this OS
31f00 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
31f10 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74   1;.      p->out
31f20 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65   = stdout;.#else
31f30 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
31f40 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c  popen(zFile + 1,
31f50 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
31f60 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20   p->out==0 ){.  
31f70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31f80 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
31f90 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70   cannot open pip
31fa0 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  e \"%s\"\n", zFi
31fb0 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20  le + 1);.       
31fc0 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
31fd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
31fe0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
32000 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
32010 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f  ->outfile), p->o
32020 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46  utfile, "%s", zF
32030 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ile);.      }.#e
32040 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
32050 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f        p->out = o
32060 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
32070 7a 46 69 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29  zFile, bTxtMode)
32080 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
32090 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
320a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
320b0 65 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20  e,"off")!=0 ){. 
320c0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
320d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
320e0 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65  or: cannot write
320f0 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a   to \"%s\"\n", z
32100 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
32110 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
32120 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
32130 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32140 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
32150 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32160 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
32170 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
32180 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  , "%s", zFile);.
32190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
321a0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
321b0 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'p' && n>=3 && s
321c0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
321d0 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20   "print", n)==0 
321e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
321f0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
32200 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
32210 66 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69  f( i>1 ) raw_pri
32220 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29  ntf(p->out, " ")
32230 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
32240 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
32250 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
32260 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
32270 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
32280 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
32290 63 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d  c=='p' && strncm
322a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f  p(azArg[0], "pro
322b0 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  mpt", n)==0 ){. 
322c0 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32     if( nArg >= 2
322d0 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
322e0 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41  y(mainPrompt,azA
322f0 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[1],(int)Array
32300 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29  Size(mainPrompt)
32310 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -1);.    }.    i
32320 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a  f( nArg >= 3) {.
32330 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f        strncpy(co
32340 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41  ntinuePrompt,azA
32350 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[2],(int)Array
32360 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f  Size(continuePro
32370 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
32380 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
32390 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
323a0 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22  azArg[0], "quit"
323b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , n)==0 ){.    r
323c0 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
323d0 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
323e0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
323f0 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22  azArg[0], "read"
32400 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46  , n)==0 ){.    F
32410 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66  ILE *alt;.    if
32420 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
32430 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32440 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
32450 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  ead FILE\n");.  
32460 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32470 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
32480 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
32490 20 20 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28      alt = fopen(
324a0 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b  azArg[1], "rb");
324b0 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20  .    if( alt==0 
324c0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
324d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
324e0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
324f0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
32500 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
32510 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
32520 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73       rc = proces
32530 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b  s_input(p, alt);
32540 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c  .      fclose(al
32550 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
32560 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
32570 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
32580 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
32590 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  store", n)==0 ){
325a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
325b0 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63  *zSrcFile;.    c
325c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
325d0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72      sqlite3 *pSr
325e0 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  c;.    sqlite3_b
325f0 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
32600 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74      int nTimeout
32610 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e   = 0;..    if( n
32620 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
32630 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67  zSrcFile = azArg
32640 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d  [1];.      zDb =
32650 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c   "main";.    }el
32660 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29  se if( nArg==3 )
32670 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  {.      zSrcFile
32680 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
32690 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31     zDb = azArg[1
326a0 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
326b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
326c0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
326d0 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
326e0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
326f0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
32700 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
32710 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
32720 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
32730 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b  SrcFile, &pSrc);
32740 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32760 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
32770 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
32780 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
32790 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20  ", zSrcFile);.  
327a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
327b0 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
327c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
327d0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
327e0 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  ;.    pBackup = 
327f0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
32800 6e 69 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  nit(p->db, zDb, 
32810 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  pSrc, "main");. 
32820 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
32830 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
32840 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32850 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
32860 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
32870 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
32880 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
32890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
328a0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
328b0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
328c0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
328d0 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
328e0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c  E_OK.          |
328f0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  | rc==SQLITE_BUS
32900 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Y  ){.      if( 
32910 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
32920 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
32930 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29  Timeout++ >= 3 )
32940 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
32950 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
32960 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
32970 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
32980 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
32990 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
329a0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
329b0 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
329c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
329d0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
329e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
329f0 44 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  D ){.      raw_p
32a00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
32a10 72 72 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74  rror: source dat
32a20 61 62 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22  abase is busy\n"
32a30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
32a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32a50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
32a60 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
32a70 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
32a80 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
32a90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
32aa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
32ab0 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73  se(pSrc);.  }els
32ac0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
32ad0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32ae0 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22  [0], "scanstats"
32af0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
32b00 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
32b10 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73      p->scanstats
32b20 4f 6e 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e  On = (u8)boolean
32b30 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
32b40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32b50 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
32b60 53 54 41 54 55 53 0a 20 20 20 20 20 20 72 61 77  STATUS.      raw
32b70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32b80 22 57 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73  "Warning: .scans
32b90 74 61 74 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  tats not availab
32ba0 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
32bb0 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
32bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
32bd0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32be0 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 61 6e 73  , "Usage: .scans
32bf0 74 61 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  tats on|off\n");
32c00 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
32c10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
32c20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
32c30 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32c40 22 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20  "schema", n)==0 
32c50 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  ){.    ShellText
32c60 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68   sSelect;.    Sh
32c70 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
32c80 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
32c90 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
32ca0 63 68 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22  char *zDiv = "("
32cb0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
32cc0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
32cd0 20 69 6e 74 20 69 53 63 68 65 6d 61 20 3d 20 30   int iSchema = 0
32ce0 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 62 75 67  ;.    int bDebug
32cf0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
32d00 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ;..    open_db(p
32d10 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  , 0);.    memcpy
32d20 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
32d30 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
32d40 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
32d50 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  0;.    data.cMod
32d60 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
32d70 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69  MODE_Semi;.    i
32d80 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
32d90 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b  );.    for(ii=1;
32da0 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b   ii<nArg; ii++){
32db0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f  .      if( optio
32dc0 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d  nMatch(azArg[ii]
32dd0 2c 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20  ,"indent") ){.  
32de0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
32df0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
32e00 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20  ODE_Pretty;.    
32e10 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
32e20 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69  onMatch(azArg[ii
32e30 5d 2c 22 64 65 62 75 67 22 29 20 29 7b 0a 20 20  ],"debug") ){.  
32e40 20 20 20 20 20 20 62 44 65 62 75 67 20 3d 20 31        bDebug = 1
32e50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32e60 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
32e70 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a        zName = az
32e80 41 72 67 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d  Arg[ii];.      }
32e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61  else{.        ra
32ea0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
32eb0 20 22 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61   "Usage: .schema
32ec0 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b   ?--indent? ?LIK
32ed0 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
32ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32ef0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
32f00 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
32f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32f20 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29    if( zName!=0 )
32f30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 61  {.      int isMa
32f40 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  ster = sqlite3_s
32f50 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73  trlike(zName, "s
32f60 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 27  qlite_master", '
32f70 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  \\')==0;.      i
32f80 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20 73  f( isMaster || s
32f90 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
32fa0 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65 6d  Name,"sqlite_tem
32fb0 70 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27 29  p_master", '\\')
32fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
32fd0 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d  har *new_argv[2]
32fe0 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a  , *new_colv[2];.
32ff0 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
33000 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [0] = sqlite3_mp
33010 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
33020 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52               "CR
33030 45 41 54 45 20 54 41 42 4c 45 20 25 73 20 28 5c  EATE TABLE %s (\
33040 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
33050 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
33060 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
33090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
330a0 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
330b0 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
330c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330d0 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
330e0 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
330f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33100 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
33110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33120 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61 73 74       ")", isMast
33130 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73  er ? "sqlite_mas
33140 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65 5f 74  ter" : "sqlite_t
33150 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20  emp_master");.  
33160 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31        new_argv[1
33170 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  ] = 0;.        n
33180 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71  ew_colv[0] = "sq
33190 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  l";.        new_
331a0 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  colv[1] = 0;.   
331b0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64       callback(&d
331c0 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76  ata, 1, new_argv
331d0 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20  , new_colv);.   
331e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
331f0 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a  e(new_argv[0]);.
33200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33210 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a 20 20    if( zDiv ){.  
33220 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
33230 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
33240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
33250 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
33260 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  , "SELECT name F
33270 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62  ROM pragma_datab
33280 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20  ase_list",.     
33290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332a0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
332b0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tmt, 0);.      i
332c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
332d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
332e0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
332f0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
33300 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
33310 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
33320 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
33330 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
33340 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
33350 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
33360 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
33370 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33380 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
33390 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 53 63  ", 0);.      iSc
333a0 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
333b0 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
333c0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
333d0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
333e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
333f0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
33400 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33410 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
33420 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 53 63          char zSc
33430 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20  Num[30];.       
33440 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33450 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29  f(sizeof(zScNum)
33460 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20  , zScNum, "%d", 
33470 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ++iSchema);.    
33480 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33490 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30  sSelect, zDiv, 0
334a0 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69 76 20  );.        zDiv 
334b0 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b  = " UNION ALL ";
334c0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
334d0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
334e0 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f  ELECT shell_add_
334f0 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29  schema(sql,", 0)
33500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
33510 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44  lite3_stricmp(zD
33520 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b  b, "main")!=0 ){
33530 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
33540 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33550 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20  zDb, '"');.     
33560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33570 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33580 73 53 65 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c  sSelect, "NULL",
33590 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
335a0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
335b0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61  t(&sSelect, ",na
335c0 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79 70 65  me) AS sql, type
335d0 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
335e0 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20  , rowid,", 0);. 
335f0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33600 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e  t(&sSelect, zScN
33610 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
33620 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33630 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20  ect, " AS snum, 
33640 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
33650 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
33660 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a  ct, zDb, '\'');.
33670 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
33680 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41  xt(&sSelect, " A
33690 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20  S sname FROM ", 
336a0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
336b0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
336c0 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20   zDb, '"');.    
336d0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
336e0 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74  sSelect, ".sqlit
336f0 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a 20  e_master", 0);. 
33700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
33710 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
33720 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tmt);.#ifdef SQL
33730 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f  ITE_INTROSPECTIO
33740 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20 20 20  N_PRAGMAS.      
33750 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
33760 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33770 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20 20 20  &sSelect,.      
33780 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c       " UNION ALL
33790 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f   SELECT shell_mo
337a0 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65  dule_schema(name
337b0 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  ),".           "
337c0 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20   'table', name, 
337d0 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39  name, name, 9e+9
337e0 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70  9, 'main' FROM p
337f0 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73  ragma_module_lis
33800 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  t", 0);.      }.
33810 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 70 70  #endif.      app
33820 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33830 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20 30 29  , ") WHERE ", 0)
33840 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
33850 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
33860 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69 74  r *zQarg = sqlit
33870 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51 22 2c  e3_mprintf("%Q",
33880 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
33890 20 69 6e 74 20 62 47 6c 6f 62 20 3d 20 73 74 72   int bGlob = str
338a0 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20  chr(zName, '*') 
338b0 21 3d 20 30 20 7c 7c 20 73 74 72 63 68 72 28 7a  != 0 || strchr(z
338c0 4e 61 6d 65 2c 20 27 3f 27 29 20 21 3d 20 30 20  Name, '?') != 0 
338d0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
338e0 20 20 20 20 20 20 20 73 74 72 63 68 72 28 7a 4e         strchr(zN
338f0 61 6d 65 2c 20 27 5b 27 29 20 21 3d 20 30 3b 0a  ame, '[') != 0;.
33900 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
33910 68 72 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29  hr(zName, '.') )
33920 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
33930 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
33940 20 22 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27   "lower(printf('
33950 25 73 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c  %s.%s',sname,tbl
33960 5f 6e 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20  _name))", 0);.  
33970 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33980 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33990 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77  t(&sSelect, "low
339a0 65 72 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30  er(tbl_name)", 0
339b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
339c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
339d0 26 73 53 65 6c 65 63 74 2c 20 62 47 6c 6f 62 20  &sSelect, bGlob 
339e0 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c  ? " GLOB " : " L
339f0 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  IKE ", 0);.     
33a00 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33a10 53 65 6c 65 63 74 2c 20 7a 51 61 72 67 2c 20 30  Select, zQarg, 0
33a20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
33a30 62 47 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 20  bGlob ){.       
33a40 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33a50 53 65 6c 65 63 74 2c 20 22 20 45 53 43 41 50 45  Select, " ESCAPE
33a60 20 27 5c 5c 27 20 22 2c 20 30 29 3b 0a 20 20 20   '\\' ", 0);.   
33a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
33a80 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
33a90 63 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b  ct, " AND ", 0);
33aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33ab0 5f 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20  _free(zQarg);.  
33ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
33ad0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
33ae0 20 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41   "type!='meta' A
33af0 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55  ND sql IS NOT NU
33b00 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL".            
33b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33b20 20 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20   ORDER BY snum, 
33b30 72 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20  rowid", 0);.    
33b40 20 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a    if( bDebug ){.
33b50 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
33b60 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c  ntf(p->out, "SQL
33b70 3a 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63  : %s;\n", sSelec
33b80 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t.z);.      }els
33b90 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
33ba0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
33bb0 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63  db, sSelect.z, c
33bc0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
33bd0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
33be0 20 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78   }.      freeTex
33bf0 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
33c00 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d   }.    if( zErrM
33c10 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  sg ){.      utf8
33c20 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
33c30 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
33c40 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
33c50 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
33c60 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
33c70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
33c80 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
33c90 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
33ca0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
33cb0 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68  or: querying sch
33cc0 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c  ema information\
33cd0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
33ce0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
33cf0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
33d00 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64  }.  }else..#if d
33d10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
33d20 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
33d30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
33d40 4c 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28  LECTTRACE).  if(
33d50 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31   c=='s' && n==11
33d60 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
33d70 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61  g[0], "selecttra
33d80 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
33d90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54    sqlite3SelectT
33da0 72 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65  race = (int)inte
33db0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
33dc0 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ]);.  }else.#end
33dd0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
33de0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
33df0 53 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d  SSION).  if( c==
33e00 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
33e10 7a 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e  zArg[0],"session
33e20 22 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20  ",n)==0 && n>=3 
33e30 29 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69  ){.    OpenSessi
33e40 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26  on *pSession = &
33e50 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a  p->aSession[0];.
33e60 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64      char **azCmd
33e70 20 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20   = &azArg[1];.  
33e80 20 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a    int iSes = 0;.
33e90 20 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e      int nCmd = n
33ea0 41 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74  Arg - 1;.    int
33eb0 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   i;.    if( nArg
33ec0 3c 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  <=1 ) goto sessi
33ed0 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
33ee0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
33ef0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
33f00 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  >=3 ){.      for
33f10 28 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d  (iSes=0; iSes<p-
33f20 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b  >nSession; iSes+
33f30 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
33f40 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69  strcmp(p->aSessi
33f50 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20  on[iSes].zName, 
33f60 61 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62  azArg[1])==0 ) b
33f70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
33f80 20 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e      if( iSes<p->
33f90 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
33fa0 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26      pSession = &
33fb0 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73  p->aSession[iSes
33fc0 5d 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64  ];.        azCmd
33fd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64  ++;.        nCmd
33fe0 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
33ff0 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f  .        pSessio
34000 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e  n = &p->aSession
34010 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65  [0];.        iSe
34020 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
34030 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65     }..    /* .se
34040 73 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42  ssion attach TAB
34050 4c 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65  LE.    ** Invoke
34060 20 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73   the sqlite3sess
34070 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74  ion_attach() int
34080 65 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68  erface to attach
34090 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20   a particular.  
340a0 20 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68    ** table so th
340b0 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66  at it is never f
340c0 69 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  iltered..    */.
340d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
340e0 7a 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22  zCmd[0],"attach"
340f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
34100 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f  ( nCmd!=2 ) goto
34110 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
34120 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
34130 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20   pSession->p==0 
34140 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69  ){.        sessi
34150 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20  on_not_open:.   
34160 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34170 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
34180 4e 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20  No sessions are 
34190 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  open\n");.      
341a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
341b0 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
341c0 6f 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69  on_attach(pSessi
341d0 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29  on->p, azCmd[1])
341e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
341f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
34200 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34210 20 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33   "ERROR: sqlite3
34220 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
34230 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
34240 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rc);.          r
34250 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
34260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34270 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
34280 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49  ion changeset FI
34290 4c 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69  LE.    ** .sessi
342a0 6f 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45  on patchset FILE
342b0 0a 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20  .    ** Write a 
342c0 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74  changeset or pat
342d0 63 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c  chset into a fil
342e0 65 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  e.  The file is 
342f0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20  overwritten..   
34300 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
34310 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61  mp(azCmd[0],"cha
34320 6e 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73  ngeset")==0 || s
34330 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
34340 70 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b  patchset")==0 ){
34350 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
34360 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
34370 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73  nCmd!=2 ) goto s
34380 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
34390 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
343a0 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20  Session->p==0 ) 
343b0 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74  goto session_not
343c0 5f 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74  _open;.      out
343d0 20 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31   = fopen(azCmd[1
343e0 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20  ], "wb");.      
343f0 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
34400 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
34410 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
34420 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
34430 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67  %s\" for writing
34440 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a  \n", azCmd[1]);.
34450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34460 20 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b       int szChng;
34470 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70  .        void *p
34480 43 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66  Chng;.        if
34490 28 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27  ( azCmd[0][0]=='
344a0 63 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c' ){.          
344b0 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  rc = sqlite3sess
344c0 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53  ion_changeset(pS
344d0 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68  ession->p, &szCh
344e0 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20  ng, &pChng);.   
344f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34500 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34510 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73  e3session_patchs
34520 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  et(pSession->p, 
34530 26 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29  &szChng, &pChng)
34540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34550 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
34560 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
34570 45 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64  Error: error cod
34580 65 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  e %d\n", rc);.  
34590 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
345a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
345b0 20 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20    if( pChng.    
345c0 20 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28        && fwrite(
345d0 70 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31  pChng, szChng, 1
345e0 2c 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20  , out)!=1 ){.   
345f0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
34600 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
34610 3a 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74  : Failed to writ
34620 65 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65  e entire %d-byte
34630 20 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20   output\n",.    
34640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
34650 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Chng);.        }
34660 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34670 5f 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20  _free(pChng);.  
34680 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
34690 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
346a0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
346b0 73 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20  ssion close.    
346c0 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65  ** Close the ide
346d0 6e 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a  ntified session.
346e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
346f0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
34700 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20  "close")==0 ){. 
34710 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31       if( nCmd!=1
34720 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
34730 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
34740 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
34750 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ion ){.        s
34760 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65  ession_close(pSe
34770 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ssion);.        
34780 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73  p->aSession[iSes
34790 5d 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  ] = p->aSession[
347a0 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a  --p->nSession];.
347b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
347c0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
347d0 6f 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45  on enable ?BOOLE
347e0 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79  AN?.    ** Query
347f0 20 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62   or set the enab
34800 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  le flag.    */. 
34810 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
34820 43 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22  Cmd[0], "enable"
34830 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
34840 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  t ii;.      if( 
34850 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65  nCmd>2 ) goto se
34860 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
34870 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e  or;.      ii = n
34880 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f  Cmd==1 ? -1 : bo
34890 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64  oleanValue(azCmd
348a0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
348b0 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
348c0 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69         ii = sqli
348d0 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c  te3session_enabl
348e0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69  e(pSession->p, i
348f0 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  i);.        utf8
34900 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
34910 22 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62  "session %s enab
34920 6c 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  le flag = %d\n",
34930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34940 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
34950 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
34960 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
34970 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69    /* .session fi
34980 6c 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20  lter GLOB ..... 
34990 20 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74     ** Set a list
349a0 20 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e   of GLOB pattern
349b0 73 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73  s of table names
349c0 20 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e   to be excluded.
349d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
349e0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
349f0 20 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b   "filter")==0 ){
34a00 0a 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e  .      int ii, n
34a10 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Byte;.      if( 
34a20 6e 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65  nCmd<2 ) goto se
34a30 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
34a40 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
34a50 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
34a60 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
34a70 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
34a80 74 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ter; ii++){.    
34a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
34aa0 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
34ab0 69 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20  ilter[ii]);.    
34ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
34ad0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
34ae0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a  ion->azFilter);.
34af0 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
34b00 73 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d  sizeof(pSession-
34b10 3e 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e  >azFilter[0])*(n
34b20 43 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Cmd-1);.        
34b30 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
34b40 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  er = sqlite3_mal
34b50 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
34b60 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69        if( pSessi
34b70 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20  on->azFilter==0 
34b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
34b90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34ba0 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d  "Error: out or m
34bb0 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
34bc0 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
34bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34be0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d  for(ii=1; ii<nCm
34bf0 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  d; ii++){.      
34c00 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
34c10 46 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73  Filter[ii-1] = s
34c20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
34c30 25 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b  %s", azCmd[ii]);
34c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34c50 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69     pSession->nFi
34c60 6c 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20  lter = ii-1;.   
34c70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
34c80 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
34c90 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
34ca0 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
34cb0 6f 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72  or set the indir
34cc0 65 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a  ect flag.    */.
34cd0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
34ce0 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65  zCmd[0], "indire
34cf0 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ct")==0 ){.     
34d00 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
34d10 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f  f( nCmd>2 ) goto
34d20 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
34d30 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20  error;.      ii 
34d40 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a  = nCmd==1 ? -1 :
34d50 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
34d60 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Cmd[1]);.      i
34d70 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
34d80 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73  {.        ii = s
34d90 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e  qlite3session_in
34da0 64 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d  direct(pSession-
34db0 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20  >p, ii);.       
34dc0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
34dd0 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73  out, "session %s
34de0 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d   indirect flag =
34df0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
34e00 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73              pSes
34e10 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29  sion->zName, ii)
34e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
34e30 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
34e40 73 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20  sion isempty.   
34e50 20 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66   ** Determine if
34e60 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
34e70 65 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20  empty.    */.   
34e80 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
34e90 64 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29  d[0], "isempty")
34ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
34eb0 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
34ec0 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65  Cmd!=1 ) goto se
34ed0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
34ee0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
34ef0 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
34f00 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65       ii = sqlite
34f10 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79  3session_isempty
34f20 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
34f30 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
34f40 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73  tf(p->out, "sess
34f50 69 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66  ion %s isempty f
34f60 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20  lag = %d\n",.   
34f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f80 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
34f90 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , ii);.      }. 
34fa0 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
34fb0 20 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20   .session list. 
34fc0 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63     ** List all c
34fd0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65  urrently open se
34fe0 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20  ssions.    */.  
34ff0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
35000 6d 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30  md[0],"list")==0
35010 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
35020 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
35030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
35040 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
35050 75 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69  ut, "%d %s\n", i
35060 2c 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d  , p->aSession[i]
35070 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
35080 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
35090 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e  /* .session open
350a0 20 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20   DB NAME.    ** 
350b0 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  Open a new sessi
350c0 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f  on called NAME o
350d0 6e 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64  n the attached d
350e0 61 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20  atabase DB..    
350f0 2a 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c  ** DB is normall
35100 79 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f  y "main"..    */
35110 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
35120 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29  azCmd[0],"open")
35130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
35140 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  r *zName;.      
35150 69 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f  if( nCmd!=3 ) go
35160 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
35170 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a  x_error;.      z
35180 4e 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b  Name = azCmd[2];
35190 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
351a0 5b 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  [0]==0 ) goto se
351b0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
351c0 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  or;.      for(i=
351d0 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
351e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
351f0 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
35200 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c  ession[i].zName,
35210 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
35220 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
35230 74 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73  tf(stderr, "Sess
35240 69 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ion \"%s\" alrea
35250 64 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e  dy exists\n", zN
35260 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
35270 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
35280 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
35290 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
352a0 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e  if( p->nSession>
352b0 3d 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53  =ArraySize(p->aS
352c0 65 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20  ession) ){.     
352d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
352e0 64 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f  derr, "Maximum o
352f0 66 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22  f %d sessions\n"
35300 2c 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  , ArraySize(p->a
35310 53 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20  Session));.     
35320 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
35330 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
35340 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f   }.      pSessio
35350 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e  n = &p->aSession
35360 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  [p->nSession];. 
35370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35380 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
35390 70 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c  p->db, azCmd[1],
353a0 20 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a   &pSession->p);.
353b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
353c0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
353d0 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
353e0 6f 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a  ot open session:
353f0 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e   error code=%d\n
35400 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
35410 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
35420 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
35430 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
35440 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
35450 6e 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20  nFilter = 0;.   
35460 20 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f     sqlite3sessio
35470 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70  n_table_filter(p
35480 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73  Session->p, sess
35490 69 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73  ion_filter, pSes
354a0 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  sion);.      p->
354b0 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nSession++;.    
354c0 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d    pSession->zNam
354d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
354e0 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29  ntf("%s", zName)
354f0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20  ;.    }else.    
35500 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64  /* If no command
35510 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73   name matches, s
35520 68 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72  how a syntax err
35530 6f 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  or */.    sessio
35540 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a  n_syntax_error:.
35550 20 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70      session_help
35560 28 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  (p);.  }else.#en
35570 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
35580 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e  TE_DEBUG.  /* Un
35590 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61  documented comma
355a0 6e 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  nds for internal
355b0 20 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65   testing.  Subje
355c0 63 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a  ct to change.  *
355d0 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65  * without notice
355e0 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73  . */.  if( c=='s
355f0 27 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74  ' && n>=10 && st
35600 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35610 22 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d  "selftest-", 9)=
35620 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  =0 ){.    if( st
35630 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39  rncmp(azArg[0]+9
35640 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39  , "boolean", n-9
35650 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
35660 74 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f  t i, v;.      fo
35670 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
35680 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  ++){.        v =
35690 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
356a0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
356b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
356c0 6f 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25  out, "%s: %d 0x%
356d0 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  x\n", azArg[i], 
356e0 76 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v, v);.      }. 
356f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
35700 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
35710 20 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29   "integer", n-9)
35720 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
35730 20 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   i; sqlite3_int6
35740 34 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4 v;.      for(i
35750 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
35760 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
35770 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20  Buf[200];.      
35780 20 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c    v = integerVal
35790 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ue(azArg[i]);.  
357a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
357b0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
357c0 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c  uf),zBuf,"%s: %l
357d0 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a  ld 0x%llx\n", az
357e0 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20  Arg[i],v,v);.   
357f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35800 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
35810 42 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Buf);.      }.  
35820 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
35830 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  if..  if( c=='s'
35840 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e   && n>=4 && strn
35850 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65  cmp(azArg[0],"se
35860 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b  lftest",n)==0 ){
35870 0a 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74  .    int bIsInit
35880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
35890 20 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c   True to initial
358a0 69 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54  ize the SELFTEST
358b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
358c0 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20  t bVerbose = 0; 
358d0 20 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73         /* Verbos
358e0 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
358f0 69 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69  int bSelftestExi
35900 73 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  sts;     /* True
35910 20 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72   if SELFTEST alr
35920 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
35930 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20     int i, k;    
35940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35950 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
35960 20 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20      int nTest = 
35970 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
35980 4e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20  Number of tests 
35990 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  runs */.    int 
359a0 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nErr = 0;       
359b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
359c0 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
359d0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
359e0 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tr;           /*
359f0 20 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75   Answer for a qu
35a00 65 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ery */.    sqlit
35a10 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
35a20 20 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61   0; /* Query aga
35a30 69 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53  inst the SELFTES
35a40 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  T table */..    
35a50 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20  open_db(p,0);.  
35a60 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
35a70 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; i++){.      c
35a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
35a90 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
35aa0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
35ab0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
35ac0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
35ad0 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  p(z,"-init")==0 
35ae0 29 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e  ){.        bIsIn
35af0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  it = 1;.      }e
35b00 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
35b10 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20  rcmp(z,"-v")==0 
35b20 29 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62  ){.        bVerb
35b30 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ose++;.      }el
35b40 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  se.      {.     
35b50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
35b60 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tderr, "Unknown 
35b70 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  option \"%s\" on
35b80 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
35b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ba0 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
35bb0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  0]);.        raw
35bc0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35bd0 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f  "Should be one o
35be0 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29  f: --init -v\n")
35bf0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
35c00 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
35c10 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
35c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35c30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
35c40 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
35c50 61 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69  adata(p->db,"mai
35c60 6e 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c  n","selftest",0,
35c70 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20  0,0,0,0,0).     
35c80 20 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f        != SQLITE_
35c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c  OK ){.      bSel
35ca0 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b  ftestExists = 0;
35cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35cc0 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74    bSelftestExist
35cd0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
35ce0 20 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a   if( bIsInit ){.
35cf0 20 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66        createSelf
35d00 74 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20  testTable(p);.  
35d10 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69      bSelftestExi
35d20 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  sts = 1;.    }. 
35d30 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72     initText(&str
35d40 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
35d50 74 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b  t(&str, "x", 0);
35d60 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66  .    for(k=bSelf
35d70 74 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30  testExists; k>=0
35d80 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; k--){.      if
35d90 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( k==1 ){.      
35da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
35db0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
35dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
35dd0 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  LECT tno,op,cmd,
35de0 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73  ans FROM selftes
35df0 74 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c  t ORDER BY tno",
35e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  .            -1,
35e10 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
35e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
35e40 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
35e50 0a 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55  .          "VALU
35e60 45 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73  ES(0,'memo','Mis
35e70 73 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61  sing SELFTEST ta
35e80 62 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68  ble - default ch
35e90 65 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22  ecks only',''),"
35ea0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
35eb0 20 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47    (1,'run','PRAG
35ec0 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
35ed0 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20  ck','ok')",.    
35ee0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
35ef0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
35f00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35f10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
35f20 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
35f30 71 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c  querying the sel
35f40 66 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b  ftest table\n");
35f50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
35f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35f70 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
35f80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
35f90 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
35fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35fb0 66 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33  for(i=1; sqlite3
35fc0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
35fd0 4c 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a  LITE_ROW; i++){.
35fe0 20 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20          int tno 
35ff0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
36000 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
36010 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
36020 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74  ar *zOp = (const
36030 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
36040 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
36050 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 1);.        co
36060 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
36070 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
36080 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
36090 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
360a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
360b0 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63  *zAns = (const c
360c0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
360d0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
360e0 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d  3);..        k =
360f0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
36100 62 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20  bVerbose>0 ){.  
36110 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51          char *zQ
36120 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uote = sqlite3_m
36130 70 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71  printf("%q", zSq
36140 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  l);.          pr
36150 69 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c  intf("%d: %s %s\
36160 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53  n", tno, zOp, zS
36170 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ql);.          s
36180 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f  qlite3_free(zQuo
36190 74 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  te);.        }. 
361a0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
361b0 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30  p(zOp,"memo")==0
361c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
361d0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
361e0 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
361f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
36200 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
36210 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20  p(zOp,"run")==0 
36220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
36230 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
36240 20 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20            str.n 
36250 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
36260 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  tr.z[0] = 0;.   
36270 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36280 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
36290 7a 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74  zSql, captureOut
362a0 70 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74  putCallback, &st
362b0 72 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  r, &zErrMsg);.  
362c0 20 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b          nTest++;
362d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
362e0 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
362f0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
36300 74 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75  tf(p->out, "Resu
36310 6c 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a  lt: %s\n", str.z
36320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
36330 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
36340 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  || zErrMsg ){.  
36350 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b            nErr++
36360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
36370 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
36380 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
36390 3e 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f 72  >out, "%d: error
363a0 2d 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c  -code-%d: %s\n",
363b0 20 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73   tno, rc, zErrMs
363c0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
363d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
363e0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
363f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
36400 70 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30  p(zAns,str.z)!=0
36410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36420 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
36430 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36440 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
36450 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a  ntf(p->out, "%d:
36460 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c   Expected: [%s]\
36470 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a  n", tno, zAns);.
36480 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
36490 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
364a0 22 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b  "%d:      Got: [
364b0 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72  %s]\n", tno, str
364c0 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  .z);.          }
364d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
364e0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
364f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36500 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
36510 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72     "Unknown oper
36520 61 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ation \"%s\" on 
36530 73 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25 64  selftest line %d
36540 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a  \n", zOp, tno);.
36550 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
36560 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
36570 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
36580 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70     } /* End loop
36590 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63 6f   over rows of co
365a0 6e 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54  ntent from SELFT
365b0 45 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  EST */.      sql
365c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
365d0 74 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45  tmt);.    } /* E
365e0 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a  nd loop over k *
365f0 2f 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  /.    freeText(&
36600 73 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  str);.    utf8_p
36610 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
36620 64 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20  d errors out of 
36630 25 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72  %d tests\n", nEr
36640 72 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c  r, nTest);.  }el
36650 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
36660 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
36670 67 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72  g[0], "separator
36680 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36690 69 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41  if( nArg<2 || nA
366a0 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61  rg>3 ){.      ra
366b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
366c0 20 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72 61   "Usage: .separa
366d0 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22  tor COL ?ROW?\n"
366e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
366f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
36700 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg>=2 ){.      
36710 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36720 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
36730 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
36740 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20  Separator,.     
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36760 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41    "%.*s", (int)A
36770 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53  rraySize(p->colS
36780 65 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41  eparator)-1, azA
36790 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[1]);.    }.  
367a0 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b    if( nArg>=3 ){
367b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
367c0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
367d0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
367e0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
367f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36800 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
36810 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
36820 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
36830 2d 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  -1, azArg[2]);. 
36840 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
36850 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e  if( c=='s' && n>
36860 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =4 && strncmp(az
36870 41 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22  Arg[0],"sha3sum"
36880 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ,n)==0 ){.    co
36890 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20  nst char *zLike 
368a0 3d 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68 20  = 0;   /* Which 
368b0 74 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73 75  table to checksu
368c0 6d 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72 79  m. 0 means every
368d0 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  thing */.    int
368e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
368f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36900 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
36910 20 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20   bSchema = 0;   
36920 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61        /* Also ha
36930 73 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  sh the schema */
36940 0a 20 20 20 20 69 6e 74 20 62 53 65 70 61 72 61  .    int bSepara
36950 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  te = 0;       /*
36960 20 48 61 73 68 20 65 61 63 68 20 74 61 62 6c 65   Hash each table
36970 20 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20   separately */. 
36980 20 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 32     int iSize = 2
36990 32 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  24;         /* H
369a0 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ash algorithm to
369b0 20 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20   use */.    int 
369c0 62 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20 20  bDebug = 0;     
369d0 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f       /* Only sho
369e0 77 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74  w the query that
369f0 20 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e 20   would have run 
36a00 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
36a10 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
36a20 2f 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67 20  /* For querying 
36a30 74 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a  tables names */.
36a40 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36a60 53 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f  SQL to be run */
36a70 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b  .    char *zSep;
36a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a90 20 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   Separator */.  
36aa0 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71 6c    ShellText sSql
36ab0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
36ac0 6d 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20 74  mplete SQL for t
36ad0 68 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e 20  he query to run 
36ae0 74 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20 20  the hash */.    
36af0 53 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72 79  ShellText sQuery
36b00 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
36b10 6f 66 20 71 75 65 72 69 65 73 20 75 73 65 64 20  of queries used 
36b20 74 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74  to read all cont
36b30 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f  ent */.    open_
36b40 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f  db(p, 0);.    fo
36b50 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
36b60 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
36b70 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
36b80 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
36b90 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
36ba0 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20      z++;.       
36bb0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
36bc0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   z++;.        if
36bd0 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68 65  ( strcmp(z,"sche
36be0 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ma")==0 ){.     
36bf0 20 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20 31       bSchema = 1
36c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
36c10 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
36c20 6d 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22 29  mp(z,"sha3-224")
36c30 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c  ==0 || strcmp(z,
36c40 22 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20  "sha3-256")==0. 
36c50 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d          || strcm
36c60 70 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29 3d  p(z,"sha3-384")=
36c70 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
36c80 73 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20  sha3-512")==0.  
36c90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
36ca0 20 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69 28     iSize = atoi(
36cb0 26 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20  &z[5]);.        
36cc0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
36cd0 28 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75  ( strcmp(z,"debu
36ce0 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
36cf0 20 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a      bDebug = 1;.
36d00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
36d10 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
36d20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
36d30 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
36d40 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
36d50 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67   azArg[i], azArg
36d80 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [0]);.          
36d90 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36da0 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e  r, "Should be on
36db0 65 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a  e of: --schema".
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d               " -
36de0 2d 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61 33  -sha3-224 --sha3
36df0 2d 32 35 35 20 2d 2d 73 68 61 33 2d 33 38 34 20  -255 --sha3-384 
36e00 2d 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a  --sha3-512\n");.
36e10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
36e20 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
36e30 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36e40 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
36e50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
36e60 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
36e70 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36e80 2c 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33 73  , "Usage: .sha3s
36e90 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49  um ?OPTIONS? ?LI
36ea0 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
36eb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
36ec0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
36ed0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
36ee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36ef0 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b        zLike = z;
36f00 0a 20 20 20 20 20 20 20 20 62 53 65 70 61 72 61  .        bSepara
36f10 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  te = 1;.        
36f20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
36f30 69 6b 65 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22  ike("sqlite\\_%"
36f40 2c 20 7a 4c 69 6b 65 2c 20 27 5c 5c 27 29 3d 3d  , zLike, '\\')==
36f50 30 20 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b  0 ) bSchema = 1;
36f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36f70 20 20 20 69 66 28 20 62 53 63 68 65 6d 61 20 29     if( bSchema )
36f80 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22  {.      zSql = "
36f90 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d  SELECT lower(nam
36fa0 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  e) FROM sqlite_m
36fb0 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
36fc0 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65      " WHERE type
36fd0 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61  ='table' AND coa
36fe0 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30  lesce(rootpage,0
36ff0 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  )>1".           
37000 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
37010 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73  LECT 'sqlite_mas
37020 74 65 72 27 22 0a 20 20 20 20 20 20 20 20 20 20  ter'".          
37030 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
37040 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
37050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37060 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
37070 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
37080 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
37090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
370a0 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
370b0 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
370c0 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
370d0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e              " AN
370e0 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
370f0 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20  'sqlite_%'".    
37100 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
37110 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f   BY 1 collate no
37120 63 61 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20  case";.    }.   
37130 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
37140 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
37150 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
37160 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
37170 51 75 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74  Query);.    init
37180 54 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20  Text(&sSql);.   
37190 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
371a0 6c 2c 20 22 57 49 54 48 20 5b 73 68 61 33 73 75  l, "WITH [sha3su
371b0 6d 24 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53  m$query](a,b) AS
371c0 28 22 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20  (",0);.    zSep 
371d0 3d 20 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20  = "VALUES(";.   
371e0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
371f0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
37200 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
37210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
37220 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
37230 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
37240 74 65 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20  text(pStmt,0);. 
37250 20 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26       if( zLike &
37260 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
37270 65 28 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30  e(zLike, zTab, 0
37280 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
37290 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
372a0 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65  mp(zTab, "sqlite
372b0 5f 22 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",7)!=0 ){.    
372c0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
372d0 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a  sQuery,"SELECT *
372e0 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20   FROM ", 0);.   
372f0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
37300 26 73 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27  &sQuery,zTab,'"'
37310 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
37320 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 20  dText(&sQuery," 
37330 4e 4f 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30  NOT INDEXED;", 0
37340 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
37350 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20  f( strcmp(zTab, 
37360 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  "sqlite_master")
37370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
37380 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
37390 79 2c 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e  y,"SELECT type,n
373a0 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c  ame,tbl_name,sql
373b0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
373c0 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
373d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373e0 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  " ORDER BY name;
373f0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
37400 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  se if( strcmp(zT
37410 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  ab, "sqlite_sequ
37420 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
37430 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
37440 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20  &sQuery,"SELECT 
37450 6e 61 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71  name,seq FROM sq
37460 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20  lite_sequence". 
37470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37480 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
37490 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
374a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
374b0 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
374c0 71 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30  qlite_stat1")==0
374d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
374e0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
374f0 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73  SELECT tbl,idx,s
37500 74 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  tat FROM sqlite_
37510 73 74 61 74 31 22 0a 20 20 20 20 20 20 20 20 20  stat1".         
37520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37530 20 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c    " ORDER BY tbl
37540 2c 69 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20  ,idx;", 0);.    
37550 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
37560 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65  mp(zTab, "sqlite
37570 5f 73 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20  _stat3")==0.    
37580 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
37590 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65  mp(zTab, "sqlite
375a0 5f 73 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20  _stat4")==0 ){. 
375b0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
375c0 74 28 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45  t(&sQuery, "SELE
375d0 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b  CT * FROM ", 0);
375e0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
375f0 65 78 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61  ext(&sQuery, zTa
37600 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
37610 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
37620 79 2c 20 22 20 4f 52 44 45 52 20 42 59 20 74 62  y, " ORDER BY tb
37630 6c 2c 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e  l, idx, rowid;\n
37640 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
37650 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
37660 26 73 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b  &sSql, zSep, 0);
37670 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
37680 74 28 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e  t(&sSql, sQuery.
37690 7a 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20  z, '\'');.      
376a0 73 51 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20  sQuery.n = 0;.  
376b0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
376c0 73 53 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  sSql, ",", 0);. 
376d0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
376e0 26 73 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27  &sSql, zTab, '\'
376f0 27 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  ');.      zSep =
37700 20 22 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20   "),(";.    }.  
37710 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
37720 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
37730 66 28 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a  f( bSeparate ){.
37740 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
37750 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
37760 20 20 20 20 20 20 20 20 22 25 73 29 29 22 0a 20          "%s))"