/ Hex Artifact Content
Login

Artifact 54b902ab7d840f60ddfabc13124c85d4980342c88aff7679f2cc25f67c21ade7:


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 53 65 6c 65 63 74 49 64 3b 20 20 20 20  t iSelectId;    
66d0: 20 20 20 20 2f 2a 20 54 68 65 20 53 65 6c 65 63      /* The Selec
66e0: 74 49 44 20 66 6f 72 20 74 68 69 73 20 72 6f 77  tID for this row
66f0: 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68 52 6f   */.  EQPGraphRo
6700: 77 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4e  w *pNext;   /* N
6710: 65 78 74 20 72 6f 77 20 69 6e 20 73 65 71 75 65  ext row in seque
6720: 6e 63 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  nce */.  char zT
6730: 65 78 74 5b 31 5d 3b 20 20 20 20 20 20 20 20 2f  ext[1];        /
6740: 2a 20 54 65 78 74 20 74 6f 20 64 69 73 70 6c 61  * Text to displa
6750: 79 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a  y for this row *
6760: 2f 0a 7d 3b 0a 0a 2f 2a 20 41 6c 6c 20 45 51 50  /.};../* All EQP
6770: 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6c 6c 65   output is colle
6780: 63 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73  cted into an ins
6790: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
67a0: 6c 6f 77 69 6e 67 20 2a 2f 0a 74 79 70 65 64 65  lowing */.typede
67b0: 66 20 73 74 72 75 63 74 20 45 51 50 47 72 61 70  f struct EQPGrap
67c0: 68 20 45 51 50 47 72 61 70 68 3b 0a 73 74 72 75  h EQPGraph;.stru
67d0: 63 74 20 45 51 50 47 72 61 70 68 20 7b 0a 20 20  ct EQPGraph {.  
67e0: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f  EQPGraphRow *pRo
67f0: 77 3b 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20  w;    /* Linked 
6800: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 72 6f 77 73  list of all rows
6810: 20 6f 66 20 74 68 65 20 45 51 50 20 6f 75 74 70   of the EQP outp
6820: 75 74 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68  ut */.  EQPGraph
6830: 52 6f 77 20 2a 70 4c 61 73 74 3b 20 20 20 2f 2a  Row *pLast;   /*
6840: 20 4c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66   Last element of
6850: 20 74 68 65 20 70 52 6f 77 20 6c 69 73 74 20 2a   the pRow list *
6860: 2f 0a 20 20 63 68 61 72 20 7a 50 72 65 66 69 78  /.  char zPrefix
6870: 5b 31 30 30 5d 3b 20 20 20 20 2f 2a 20 47 72 61  [100];    /* Gra
6880: 70 68 20 70 72 65 66 69 78 20 2a 2f 0a 7d 3b 0a  ph prefix */.};.
6890: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66  ./*.** State inf
68a0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
68b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
68c0: 65 63 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61 69  ection is contai
68d0: 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 73  ned in an.** ins
68e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
68f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6900: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
6910: 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20 53  uct ShellState S
6920: 68 65 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75 63  hellState;.struc
6930: 74 20 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a 20  t ShellState {. 
6940: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
6950: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
6960: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
6970: 61 75 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20 20  autoExplain;    
6980: 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
6990: 61 6c 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65 78  ally turn on .ex
69a0: 70 6c 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20  plain mode */.  
69b0: 75 38 20 61 75 74 6f 45 51 50 3b 20 20 20 20 20  u8 autoEQP;     
69c0: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45 58         /* Run EX
69d0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
69e0: 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68 20   prior to seach 
69f0: 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 75 38  SQL stmt */.  u8
6a00: 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20   statsOn;       
6a10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6a20: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
6a30: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
6a40: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75   finalize */.  u
6a50: 38 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20  8 scanstatsOn;  
6a60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6a70: 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74   display scan st
6a80: 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20  ats before each 
6a90: 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38  finalize */.  u8
6aa0: 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
6ab0: 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50       /* SHELL_OP
6ac0: 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45  EN_NORMAL, _APPE
6ad0: 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49  NDVFS, or _ZIPFI
6ae0: 4c 45 20 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67  LE */.  u8 doXdg
6af0: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  Open;          /
6b00: 2a 20 49 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f  * Invoke start/o
6b10: 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20  pen/xdg-open in 
6b20: 6f 75 74 70 75 74 5f 72 65 73 65 74 28 29 20 2a  output_reset() *
6b30: 2f 0a 20 20 75 38 20 6e 45 71 70 4c 65 76 65 6c  /.  u8 nEqpLevel
6b40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
6b50: 70 74 68 20 6f 66 20 74 68 65 20 45 51 50 20 6f  pth of the EQP o
6b60: 75 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20  utput graph */. 
6b70: 20 75 6e 73 69 67 6e 65 64 20 6d 45 71 70 4c 69   unsigned mEqpLi
6b80: 6e 65 73 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  nes;    /* Mask 
6b90: 6f 66 20 76 65 72 69 74 69 63 61 6c 20 6c 69 6e  of veritical lin
6ba0: 65 73 20 69 6e 20 74 68 65 20 45 51 50 20 6f 75  es in the EQP ou
6bb0: 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20  tput graph */.  
6bc0: 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20  int outCount;   
6bd0: 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74         /* Revert
6be0: 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20   to stdout when 
6bf0: 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f  reaching zero */
6c00: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6c20: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64  ber of records d
6c30: 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20  isplayed so far 
6c40: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6c60: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
6c70: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  e */.  FILE *tra
6c80: 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ceOut;        /*
6c90: 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69   Output for sqli
6ca0: 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20  te3_trace() */. 
6cb0: 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6cd0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
6ce0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d00: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
6d10: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
6d20: 6d 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20  modePrior;      
6d30: 20 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65     /* Saved mode
6d40: 20 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b   */.  int cMode;
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d60: 74 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74  temporary output
6d70: 20 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75   mode for the cu
6d80: 72 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20  rrent query */. 
6d90: 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b   int normalMode;
6da0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
6db0: 74 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e  t mode before ".
6dc0: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
6dd0: 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68   int writableSch
6de0: 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  ema;    /* True 
6df0: 69 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  if PRAGMA writab
6e00: 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a  le_schema=ON */.
6e10: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6e20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
6e30: 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20   to show column 
6e40: 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72  names in List or
6e50: 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a   Column mode */.
6e60: 20 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20    int nCheck;   
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6e80: 65 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63  er of ".check" c
6e90: 6f 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20  ommands run */. 
6ea0: 20 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46   unsigned shellF
6eb0: 6c 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f  lgs;    /* Vario
6ec0: 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68  us flags */.  ch
6ed0: 61 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20  ar *zDestTable; 
6ee0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6ef0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
6f00: 65 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65  e when MODE_Inse
6f10: 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  rt */.  char *zT
6f20: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 2f  empFile;       /
6f30: 2a 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * Temporary file
6f40: 20 74 68 61 74 20 6d 69 67 68 74 20 6e 65 65 64   that might need
6f50: 20 64 65 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63   deleting */.  c
6f60: 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b 33 30  har zTestcase[30
6f70: 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ];    /* Name of
6f80: 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 63 61   current test ca
6f90: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c  se */.  char col
6fa0: 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f  Separator[20]; /
6fb0: 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  * Column separat
6fc0: 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72  or character for
6fd0: 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a   several modes *
6fe0: 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65 70 61  /.  char rowSepa
6ff0: 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f  rator[20]; /* Ro
7000: 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  w separator char
7010: 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41  acter for MODE_A
7020: 73 63 69 69 20 2a 2f 0a 20 20 63 68 61 72 20 63  scii */.  char c
7030: 6f 6c 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  olSepPrior[20]; 
7040: 20 2f 2a 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e   /* Saved column
7050: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
7060: 63 68 61 72 20 72 6f 77 53 65 70 50 72 69 6f 72  char rowSepPrior
7070: 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20  [20];  /* Saved 
7080: 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 2a 2f  row separator */
7090: 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b  .  int colWidth[
70a0: 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71  100];     /* Req
70b0: 75 65 73 74 65 64 20 77 69 64 74 68 20 6f 66 20  uested width of 
70c0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e  each column when
70d0: 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a   in column mode*
70e0: 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69  /.  int actualWi
70f0: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63  dth[100];  /* Ac
7100: 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61  tual width of ea
7110: 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ch column */.  c
7120: 68 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30  har nullValue[20
7130: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78  ];    /* The tex
7140: 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20  t to print when 
7150: 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
7160: 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20  k from.         
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
7190: 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c  */.  char outfil
71a0: 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b  e[FILENAME_MAX];
71b0: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72   /* Filename for
71c0: 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   *out */.  const
71d0: 20 63 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61   char *zDbFilena
71e0: 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  me;    /* name o
71f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7200: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7210: 46 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20  FreeOnClose;    
7220: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
7230: 20 74 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c   to free when cl
7240: 6f 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  osing */.  const
7250: 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20   char *zVfs;    
7260: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7270: 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  f VFS to use */.
7280: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
7290: 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72  pStmt;   /* Curr
72a0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66  ent statement if
72b0: 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20   any. */.  FILE 
72c0: 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20  *pLog;          
72d0: 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f    /* Write log o
72e0: 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20  utput here */.  
72f0: 69 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20  int *aiIndent;  
7300: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
7310: 6f 66 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20  of indents used 
7320: 69 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  in MODE_Explain 
7330: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74  */.  int nIndent
7340: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7350: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 69 49  ize of array aiI
7360: 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ndent[] */.  int
7370: 20 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   iIndent;       
7380: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
7390: 63 75 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69  current op in ai
73a0: 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51  Indent[] */.  EQ
73b0: 50 47 72 61 70 68 20 73 47 72 61 70 68 3b 20 20  PGraph sGraph;  
73c0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
73d0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 61 70  ion for the grap
73e0: 68 69 63 61 6c 20 45 58 50 4c 41 49 4e 20 51 55  hical EXPLAIN QU
73f0: 45 52 59 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20  ERY PLAN */.#if 
7400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
7410: 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
7420: 20 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20   int nSession;  
7430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7440: 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
7450: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65  essions */.  Ope
7460: 6e 53 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f  nSession aSessio
7470: 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20  n[4];  /* Array 
7480: 6f 66 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30  of sessions.  [0
7490: 5d 20 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a  ] is in focus. *
74a0: 2f 0a 23 65 6e 64 69 66 0a 20 20 45 78 70 65 72  /.#endif.  Exper
74b0: 74 49 6e 66 6f 20 65 78 70 65 72 74 3b 20 20 20  tInfo expert;   
74c0: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66       /* Valid if
74d0: 20 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e   previous comman
74e0: 64 20 77 61 73 20 22 2e 65 78 70 65 72 74 20 4f  d was ".expert O
74f0: 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  PT..." */.};.../
7500: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
7510: 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e   for ShellState.
7520: 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69  autoEQP.*/.#defi
7530: 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66 66 20 20  ne AUTOEQP_off  
7540: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 41 55      0.#define AU
7550: 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31  TOEQP_on       1
7560: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7570: 5f 74 72 69 67 67 65 72 20 20 32 0a 23 64 65 66  _trigger  2.#def
7580: 69 6e 65 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c  ine AUTOEQP_full
7590: 20 20 20 20 20 33 0a 0a 2f 2a 20 41 6c 6c 6f 77       3../* Allow
75a0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
75b0: 65 6c 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64  ellState.openMod
75c0: 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e.*/.#define SHE
75d0: 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20  LL_OPEN_UNSPEC  
75e0: 20 20 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f 20     0      /* No 
75f0: 6f 70 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69 66  open-mode specif
7600: 69 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ied */.#define S
7610: 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
7620: 20 20 20 20 20 31 20 20 20 20 20 20 2f 2a 20 4e       1      /* N
7630: 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
7640: 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ile */.#define S
7650: 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
7660: 56 46 53 20 20 32 20 20 20 20 20 20 2f 2a 20 55  VFS  2      /* U
7670: 73 65 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a  se appendvfs */.
7680: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7690: 45 4e 5f 5a 49 50 46 49 4c 45 20 20 20 20 33 20  EN_ZIPFILE    3 
76a0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
76b0: 7a 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20  zipfile virtual 
76c0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
76d0: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44   SHELL_OPEN_READ
76e0: 4f 4e 4c 59 20 20 20 34 20 20 20 20 20 20 2f 2a  ONLY   4      /*
76f0: 20 4f 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64   Open a normal d
7700: 61 74 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c  atabase read-onl
7710: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  y */../*.** Thes
7720: 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65  e are the allowe
7730: 64 20 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75  d shellFlgs valu
7740: 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  es.*/.#define SH
7750: 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 20 20  FLG_Pagecache   
7760: 20 20 20 30 78 30 30 30 30 30 30 30 31 20 2f 2a     0x00000001 /*
7770: 20 54 68 65 20 2d 2d 70 61 67 65 63 61 63 68 65   The --pagecache
7780: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
7790: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
77a0: 5f 4c 6f 6f 6b 61 73 69 64 65 20 20 20 20 20 20  _Lookaside      
77b0: 30 78 30 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f  0x00000002 /* Lo
77c0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
77d0: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
77e0: 65 20 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73  e SHFLG_Backslas
77f0: 68 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30  h      0x0000000
7800: 34 20 2f 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73  4 /* The --backs
7810: 6c 61 73 68 20 6f 70 74 69 6f 6e 20 69 73 20 75  lash option is u
7820: 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  sed */.#define S
7830: 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
7840: 69 64 20 20 30 78 30 30 30 30 30 30 30 38 20 2f  id  0x00000008 /
7850: 2a 20 2e 64 75 6d 70 20 70 72 65 73 65 72 76 65  * .dump preserve
7860: 73 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 2a  s rowid values *
7870: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7880: 4e 65 77 6c 69 6e 65 73 20 20 20 20 20 20 20 30  Newlines       0
7890: 78 30 30 30 30 30 30 31 30 20 2f 2a 20 2e 64 75  x00000010 /* .du
78a0: 6d 70 20 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61  mp --newline fla
78b0: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  g */.#define SHF
78c0: 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 20  LG_CountChanges 
78d0: 20 20 30 78 30 30 30 30 30 30 32 30 20 2f 2a 20    0x00000020 /* 
78e0: 2e 63 68 61 6e 67 65 73 20 73 65 74 74 69 6e 67  .changes setting
78f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7900: 47 5f 45 63 68 6f 20 20 20 20 20 20 20 20 20 20  G_Echo          
7910: 20 30 78 30 30 30 30 30 30 34 30 20 2f 2a 20 2e   0x00000040 /* .
7920: 65 63 68 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73  echo or --echo s
7930: 65 74 74 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  etting */../*.**
7940: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 65 73 74   Macros for test
7950: 69 6e 67 20 61 6e 64 20 73 65 74 74 69 6e 67 20  ing and setting 
7960: 73 68 65 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65  shellFlgs.*/.#de
7970: 66 69 6e 65 20 53 68 65 6c 6c 48 61 73 46 6c 61  fine ShellHasFla
7980: 67 28 50 2c 58 29 20 20 20 20 28 28 28 50 29 2d  g(P,X)    (((P)-
7990: 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 28 58 29  >shellFlgs & (X)
79a0: 29 21 3d 30 29 0a 23 64 65 66 69 6e 65 20 53 68  )!=0).#define Sh
79b0: 65 6c 6c 53 65 74 46 6c 61 67 28 50 2c 58 29 20  ellSetFlag(P,X) 
79c0: 20 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c     ((P)->shellFl
79d0: 67 73 7c 3d 28 58 29 29 0a 23 64 65 66 69 6e 65  gs|=(X)).#define
79e0: 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28   ShellClearFlag(
79f0: 50 2c 58 29 20 20 28 28 50 29 2d 3e 73 68 65 6c  P,X)  ((P)->shel
7a00: 6c 46 6c 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a  lFlgs&=(~(X)))..
7a10: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7a20: 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65  the allowed mode
7a30: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  s..*/.#define MO
7a40: 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f  DE_Line     0  /
7a50: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72  * One column per
7a60: 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69   line.  Blank li
7a70: 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72  ne between recor
7a80: 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ds */.#define MO
7a90: 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f  DE_Column   1  /
7aa0: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
7ab0: 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f   line in neat co
7ac0: 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65  lumns */.#define
7ad0: 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32   MODE_List     2
7ae0: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
7af0: 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20  per line with a 
7b00: 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65  separator */.#de
7b10: 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20  fine MODE_Semi  
7b20: 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73     3  /* Same as
7b30: 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61   MODE_List but a
7b40: 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63  ppend ";" to eac
7b50: 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  h line */.#defin
7b60: 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20  e MODE_Html     
7b70: 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  4  /* Generate a
7b80: 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f  n XHTML table */
7b90: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e  .#define MODE_In
7ba0: 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e  sert   5  /* Gen
7bb0: 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72  erate SQL "inser
7bc0: 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  t" statements */
7bd0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75  .#define MODE_Qu
7be0: 6f 74 65 20 20 20 20 36 20 20 2f 2a 20 51 75 6f  ote    6  /* Quo
7bf0: 74 65 20 76 61 6c 75 65 73 20 61 73 20 66 6f 72  te values as for
7c00: 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20   SQL */.#define 
7c10: 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20 20 37 20  MODE_Tcl      7 
7c20: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 41 4e 53   /* Generate ANS
7c30: 49 2d 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 65  I-C or TCL quote
7c40: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64  d elements */.#d
7c50: 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20  efine MODE_Csv  
7c60: 20 20 20 20 38 20 20 2f 2a 20 51 75 6f 74 65 20      8  /* Quote 
7c70: 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73  strings, numbers
7c80: 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64   are plain */.#d
7c90: 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61  efine MODE_Expla
7ca0: 69 6e 20 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d  in  9  /* Like M
7cb0: 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20  ODE_Column, but 
7cc0: 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61 74 65 20  do not truncate 
7cd0: 64 61 74 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20  data */.#define 
7ce0: 4d 4f 44 45 5f 41 73 63 69 69 20 20 20 31 30 20  MODE_Ascii   10 
7cf0: 20 2f 2a 20 55 73 65 20 41 53 43 49 49 20 75 6e   /* Use ASCII un
7d00: 69 74 20 61 6e 64 20 72 65 63 6f 72 64 20 73 65  it and record se
7d10: 70 61 72 61 74 6f 72 73 20 28 30 78 31 46 2f 30  parators (0x1F/0
7d20: 78 31 45 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  x1E) */.#define 
7d30: 4d 4f 44 45 5f 50 72 65 74 74 79 20 20 31 31 20  MODE_Pretty  11 
7d40: 20 2f 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74   /* Pretty-print
7d50: 20 73 63 68 65 6d 61 73 20 2a 2f 0a 23 64 65 66   schemas */.#def
7d60: 69 6e 65 20 4d 4f 44 45 5f 45 51 50 20 20 20 20  ine MODE_EQP    
7d70: 20 31 32 20 20 2f 2a 20 43 6f 6e 76 65 72 74 73   12  /* Converts
7d80: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
7d90: 4c 41 4e 20 6f 75 74 70 75 74 20 69 6e 74 6f 20  LAN output into 
7da0: 61 20 67 72 61 70 68 20 2a 2f 0a 0a 73 74 61 74  a graph */..stat
7db0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  ic const char *m
7dc0: 6f 64 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20  odeDescr[] = {. 
7dd0: 20 22 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75   "line",.  "colu
7de0: 6d 6e 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20  mn",.  "list",. 
7df0: 20 22 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c   "semi",.  "html
7e00: 22 2c 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20  ",.  "insert",. 
7e10: 20 22 71 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c   "quote",.  "tcl
7e20: 22 2c 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65  ",.  "csv",.  "e
7e30: 78 70 6c 61 69 6e 22 2c 0a 20 20 22 61 73 63 69  xplain",.  "asci
7e40: 69 22 2c 0a 20 20 22 70 72 65 74 74 79 70 72 69  i",.  "prettypri
7e50: 6e 74 22 2c 0a 20 20 22 65 71 70 22 0a 7d 3b 0a  nt",.  "eqp".};.
7e60: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
7e70: 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f   the column/row/
7e80: 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20  line separators 
7e90: 75 73 65 64 20 62 79 20 74 68 65 20 76 61 72 69  used by the vari
7ea0: 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78  ous.** import/ex
7eb0: 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23  port modes..*/.#
7ec0: 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d  define SEP_Colum
7ed0: 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65  n    "|".#define
7ee0: 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22   SEP_Row       "
7ef0: 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  \n".#define SEP_
7f00: 54 61 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23  Tab       "\t".#
7f10: 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65  define SEP_Space
7f20: 20 20 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65       " ".#define
7f30: 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22   SEP_Comma     "
7f40: 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43  ,".#define SEP_C
7f50: 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a  rLf      "\r\n".
7f60: 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74  #define SEP_Unit
7f70: 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65        "\x1F".#de
7f80: 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20  fine SEP_Record 
7f90: 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a     "\x1E"../*.**
7fa0: 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20   A callback for 
7fb0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  the sqlite3_log(
7fc0: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
7fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
7fe0: 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c  lLog(void *pArg,
7ff0: 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63   int iErrCode, c
8000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29  onst char *zMsg)
8010: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
8020: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
8030: 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e  )pArg;.  if( p->
8040: 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  pLog==0 ) return
8050: 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
8060: 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25  p->pLog, "(%d) %
8070: 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20  s\n", iErrCode, 
8080: 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28  zMsg);.  fflush(
8090: 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a  p->pLog);.}../*.
80a0: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  ** SQL function:
80b0: 20 20 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58    shell_putsnl(X
80c0: 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
80d0: 65 20 74 65 78 74 20 58 20 74 6f 20 74 68 65 20  e text X to the 
80e0: 73 63 72 65 65 6e 20 28 6f 72 20 77 68 61 74 65  screen (or whate
80f0: 76 65 72 20 6f 75 74 70 75 74 20 69 73 20 62 65  ver output is be
8100: 69 6e 67 20 64 69 72 65 63 74 65 64 29 0a 2a 2a  ing directed).**
8110: 20 61 64 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e   adding a newlin
8120: 65 20 61 74 20 74 68 65 20 65 6e 64 2c 20 61 6e  e at the end, an
8130: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 58 2e  d then return X.
8140: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8150: 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20  shellPutsFunc(. 
8160: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8170: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56   *pCtx,.  int nV
8180: 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
8190: 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
81a0: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
81b0: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 73 71   (ShellState*)sq
81c0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
81d0: 70 43 74 78 29 3b 0a 20 20 28 76 6f 69 64 29 6e  pCtx);.  (void)n
81e0: 56 61 6c 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  Val;.  utf8_prin
81f0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
8200: 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
8210: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 29  _text(apVal[0]))
8220: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
8230: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61  lt_value(pCtx, a
8240: 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  pVal[0]);.}../*.
8250: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  ** SQL function:
8260: 20 20 20 65 64 69 74 28 56 41 4c 55 45 29 0a 2a     edit(VALUE).*
8270: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
8280: 20 20 65 64 69 74 28 56 41 4c 55 45 2c 45 44 49    edit(VALUE,EDI
8290: 54 4f 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  TOR).**.** These
82a0: 20 73 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   steps:.**.**   
82b0: 20 20 28 31 29 20 57 72 69 74 65 20 56 41 4c 55    (1) Write VALU
82c0: 45 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61  E into a tempora
82d0: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
82e0: 28 32 29 20 52 75 6e 20 70 72 6f 67 72 61 6d 20  (2) Run program 
82f0: 45 44 49 54 4f 52 20 6f 6e 20 74 68 61 74 20 74  EDITOR on that t
8300: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
8310: 2a 20 20 20 20 20 28 33 29 20 52 65 61 64 20 74  *     (3) Read t
8320: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
8330: 65 20 62 61 63 6b 20 61 6e 64 20 72 65 74 75 72  e back and retur
8340: 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 61 73  n its content as
8350: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20   the result..** 
8360: 20 20 20 20 28 34 29 20 44 65 6c 65 74 65 20 74      (4) Delete t
8370: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
8380: 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  e.**.** If the E
8390: 44 49 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 69  DITOR argument i
83a0: 73 20 6f 6d 69 74 74 65 64 2c 20 75 73 65 20 74  s omitted, use t
83b0: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
83c0: 56 49 53 55 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f  VISUAL.** enviro
83d0: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 20  nment variable. 
83e0: 20 49 66 20 73 74 69 6c 6c 20 74 68 65 72 65 20   If still there 
83f0: 69 73 20 6e 6f 20 45 44 49 54 4f 52 2c 20 74 68  is no EDITOR, th
8400: 72 6f 75 67 68 20 61 6e 20 65 72 72 6f 72 2e 0a  rough an error..
8410: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 68 72 6f 77  **.** Also throw
8420: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
8430: 20 45 44 49 54 4f 52 20 70 72 6f 67 72 61 6d 20   EDITOR program 
8440: 72 65 74 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65  returns a non-ze
8450: 72 6f 20 65 78 69 74 20 63 6f 64 65 2e 0a 2a 2f  ro exit code..*/
8460: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8470: 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 73 74  NOHAVE_SYSTEM.st
8480: 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 46 75  atic void editFu
8490: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
84a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
84b0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
84c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
84d0: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  gv.){.  const ch
84e0: 61 72 20 2a 7a 45 64 69 74 6f 72 3b 0a 20 20 63  ar *zEditor;.  c
84f0: 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 20 3d  har *zTempFile =
8500: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
8510: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 20  b;.  char *zCmd 
8520: 3d 20 30 3b 0a 20 20 69 6e 74 20 62 42 69 6e 3b  = 0;.  int bBin;
8530: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c  .  int rc;.  FIL
8540: 45 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69  E *f = 0;.  sqli
8550: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
8560: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
8570: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8580: 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20   *p = 0;..  if( 
8590: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
85a0: 45 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20  Editor = (const 
85b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
85c0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
85d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
85e0: 7a 45 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76  zEditor = getenv
85f0: 28 22 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a  ("VISUAL");.  }.
8600: 20 20 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30    if( zEditor==0
8610: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8620: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8630: 74 65 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72  text, "no editor
8640: 20 66 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31   for edit()", -1
8650: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8660: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
8670: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8680: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
8690: 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
86a0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
86b0: 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70  ntext, "NULL inp
86c0: 75 74 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d  ut to edit()", -
86d0: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
86e0: 20 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74    }.  db = sqlit
86f0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
8700: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
8710: 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a   zTempFile = 0;.
8720: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
8730: 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51  ontrol(db, 0, SQ
8740: 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
8750: 49 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46  ILENAME, &zTempF
8760: 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d  ile);.  if( zTem
8770: 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
8780: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
8790: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
87a0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
87b0: 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
87c0: 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c   zTempFile = sql
87d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65  ite3_mprintf("te
87e0: 6d 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20  mp%llx", r);.   
87f0: 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d   if( zTempFile==
8800: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8810: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
8820: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
8830: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8840: 20 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d    }.  }.  bBin =
8850: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8860: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
8870: 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 66 20 3d  LITE_BLOB;.  f =
8880: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
8890: 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20  , bBin ? "wb" : 
88a0: 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "w");.  if( f==0
88b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
88c0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
88d0: 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61  text, "edit() ca
88e0: 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66  nnot open temp f
88f0: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
8900: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
8910: 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71  d;.  }.  sz = sq
8920: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8930: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  s(argv[0]);.  if
8940: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
8950: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
8960: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
8970: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
8980: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 20  .  }else{.    x 
8990: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
89a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
89b0: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
89c0: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
89d0: 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  f = 0;.  if(
89e0: 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71   x!=sz ){.    sq
89f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8a00: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69  or(context, "edi
8a10: 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72  t() could not wr
8a20: 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69  ite the whole fi
8a30: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
8a40: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
8a50: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73  ;.  }.  zCmd = s
8a60: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8a70: 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69  %s \"%s\"", zEdi
8a80: 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b  tor, zTempFile);
8a90: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
8aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8ab0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8ac0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
8ad0: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
8ae0: 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  d;.  }.  rc = sy
8af0: 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71  stem(zCmd);.  sq
8b00: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
8b10: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
8b20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8b30: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8b40: 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64  "EDITOR returned
8b50: 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b   non-zero", -1);
8b60: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8b70: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66  unc_end;.  }.  f
8b80: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
8b90: 6c 65 2c 20 62 42 69 6e 20 3f 20 22 72 62 22 20  le, bBin ? "rb" 
8ba0: 3a 20 22 72 22 29 3b 0a 20 20 69 66 28 20 66 3d  : "r");.  if( f=
8bb0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8bc0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8bd0: 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 22 65  ontext,.      "e
8be0: 64 69 74 28 29 20 63 61 6e 6e 6f 74 20 72 65 6f  dit() cannot reo
8bf0: 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 20 61 66  pen temp file af
8c00: 74 65 72 20 65 64 69 74 22 2c 20 2d 31 29 3b 0a  ter edit", -1);.
8c10: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8c20: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 73  nc_end;.  }.  fs
8c30: 65 65 6b 28 66 2c 20 30 2c 20 53 45 45 4b 5f 45  eek(f, 0, SEEK_E
8c40: 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c  ND);.  sz = ftel
8c50: 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e 64 28 66  l(f);.  rewind(f
8c60: 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  );.  p = sqlite3
8c70: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a 2b 28 62  _malloc64( sz+(b
8c80: 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  Bin==0) );.  if(
8c90: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
8ca0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8cb0: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
8cc0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
8cd0: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
8ce0: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
8cf0: 78 20 3d 20 66 72 65 61 64 28 70 2c 20 31 2c 20  x = fread(p, 1, 
8d00: 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  sz, f);.  }else{
8d10: 0a 20 20 20 20 78 20 3d 20 66 72 65 61 64 28 70  .    x = fread(p
8d20: 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 20  , 1, sz, f);.   
8d30: 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 7d 0a   p[sz] = 0;.  }.
8d40: 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66    fclose(f);.  f
8d50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73   = 0;.  if( x!=s
8d60: 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  z ){.    sqlite3
8d70: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
8d80: 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f  ntext, "could no
8d90: 74 20 72 65 61 64 20 62 61 63 6b 20 74 68 65 20  t read back the 
8da0: 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29  whole file", -1)
8db0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
8dc0: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
8dd0: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
8de0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
8df0: 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70  lob64(context, p
8e00: 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72  , sz, sqlite3_fr
8e10: 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ee);.  }else{.  
8e20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8e30: 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c  _text64(context,
8e40: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c   (const char*)p,
8e50: 20 73 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20   sz,.           
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8e70: 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c  qlite3_free, SQL
8e80: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20  ITE_UTF8);.  }. 
8e90: 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75   p = 0;..edit_fu
8ea0: 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20  nc_end:.  if( f 
8eb0: 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75  ) fclose(f);.  u
8ec0: 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29  nlink(zTempFile)
8ed0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8ee0: 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  (zTempFile);.  s
8ef0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
8f00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8f10: 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
8f20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20   */../*.** Save 
8f30: 6f 72 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  or restore the c
8f40: 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f  urrent output mo
8f50: 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  de.*/.static voi
8f60: 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68  d outputModePush
8f70: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
8f80: 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20  .  p->modePrior 
8f90: 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d  = p->mode;.  mem
8fa0: 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69  cpy(p->colSepPri
8fb0: 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  or, p->colSepara
8fc0: 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63  tor, sizeof(p->c
8fd0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20  olSeparator));. 
8fe0: 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65   memcpy(p->rowSe
8ff0: 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65  pPrior, p->rowSe
9000: 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28  parator, sizeof(
9010: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
9020: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
9030: 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53   outputModePop(S
9040: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
9050: 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f   p->mode = p->mo
9060: 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70  dePrior;.  memcp
9070: 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  y(p->colSeparato
9080: 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f  r, p->colSepPrio
9090: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
90a0: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
90b0: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61  emcpy(p->rowSepa
90c0: 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70  rator, p->rowSep
90d0: 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  Prior, sizeof(p-
90e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
90f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
9100: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9110: 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64  g as a hex-encod
9120: 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31  ed blob (eg. X'1
9130: 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63  234' ).*/.static
9140: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78   void output_hex
9150: 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c  _blob(FILE *out,
9160: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
9170: 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a  ob, int nBlob){.
9180: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
9190: 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a  *zBlob = (char *
91a0: 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72  )pBlob;.  raw_pr
91b0: 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a  intf(out,"X'");.
91c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c    for(i=0; i<nBl
91d0: 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72  ob; i++){ raw_pr
91e0: 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c  intf(out,"%02x",
91f0: 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20  zBlob[i]&0xff); 
9200: 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f  }.  raw_printf(o
9210: 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ut,"'");.}../*.*
9220: 2a 20 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20  * Find a string 
9230: 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e  that is not foun
9240: 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b  d anywhere in z[
9250: 5d 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ].  Return a poi
9260: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20  nter.** to that 
9270: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72  string..**.** Tr
9280: 79 20 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20  y to use zA and 
9290: 7a 42 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f  zB first.  If bo
92a0: 74 68 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20  th of those are 
92b0: 61 6c 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e  already found in
92c0: 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   z[].** then mak
92d0: 65 20 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67  e up some string
92e0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
92f0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66   the buffer zBuf
9300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9310: 74 20 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73  t char *unused_s
9320: 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63  tring(.  const c
9330: 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
9340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9350: 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70  sult must not ap
9360: 70 65 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e  pear anywhere in
9370: 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68   z */.  const ch
9380: 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68  ar *zA, const ch
9390: 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79  ar *zB,   /* Try
93a0: 20 74 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a   these first */.
93b0: 20 20 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20    char *zBuf    
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
93e0: 73 74 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65  store a generate
93f0: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
9400: 20 75 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b   unsigned i = 0;
9410: 0a 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c  .  if( strstr(z,
9420: 20 7a 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e   zA)==0 ) return
9430: 20 7a 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74   zA;.  if( strst
9440: 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65  r(z, zB)==0 ) re
9450: 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20  turn zB;.  do{. 
9460: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9470: 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73  ntf(20,zBuf,"(%s
9480: 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a  %u)", zA, i++);.
9490: 20 20 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72    }while( strstr
94a0: 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20  (z,zBuf)!=0 );. 
94b0: 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a   return zBuf;.}.
94c0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
94d0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
94e0: 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  s a quoted strin
94f0: 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74  g using SQL quot
9500: 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e  ing conventions.
9510: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
9520: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
9530: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a  scaped_string().
9540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
9550: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
9560: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
9570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9580: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
9590: 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  ;.  setBinaryMod
95a0: 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72  e(out, 1);.  for
95b0: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
95c0: 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  !=0 && c!='\''; 
95d0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d  i++){}.  if( c==
95e0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
95f0: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
9600: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
9610: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9620: 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65   "'");.    while
9630: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
9640: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  r(i=0; (c = z[i]
9650: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b  )!=0 && c!='\'';
9660: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
9670: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
9680: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
9690: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
96a0: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
96b0: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
96c0: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
96d0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
96e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
96f0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
9700: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
9710: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
9720: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
9730: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9740: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
9750: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
9760: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
9770: 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f  .  }.  setTextMo
9780: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f  de(out, 1);.}../
9790: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
97a0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
97b0: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
97c0: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
97d0: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
97e0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20  * Additionallly 
97f0: 2c 20 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e  , escape the "\n
9800: 22 20 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61  " and "\r" chara
9810: 63 74 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  cters so that th
9820: 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74  ey do not.** get
9830: 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e   corrupted by en
9840: 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c  d-of-line transl
9850: 61 74 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73  ation facilities
9860: 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69   in some operati
9870: 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a  ng.** systems..*
9880: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b  *.** This is lik
9890: 65 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  e output_quoted_
98a0: 73 74 72 69 6e 67 28 29 20 62 75 74 20 77 69 74  string() but wit
98b0: 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
98c0: 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73  f the \r\n.** es
98d0: 63 61 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a  cape mechanism..
98e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
98f0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9900: 61 70 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  aped_string(FILE
9910: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
9920: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
9930: 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42    char c;.  setB
9940: 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31  inaryMode(out, 1
9950: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
9960: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
9970: 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e  !='\'' && c!='\n
9980: 27 20 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b  ' && c!='\r'; i+
9990: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
99a0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
99b0: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
99c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
99d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d  onst char *zNL =
99e0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
99f0: 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20  ar *zCR = 0;.   
9a00: 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20   int nNL = 0;.  
9a10: 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20    int nCR = 0;. 
9a20: 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30     char zBuf1[20
9a30: 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20  ], zBuf2[20];.  
9a40: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
9a50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9a60: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e   z[i]=='\n' ) nN
9a70: 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  L++;.      if( z
9a80: 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b  [i]=='\r' ) nCR+
9a90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
9aa0: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61   nNL ){.      ra
9ab0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72  w_printf(out, "r
9ac0: 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20  eplace(");.     
9ad0: 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74   zNL = unused_st
9ae0: 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22  ring(z, "\\n", "
9af0: 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a  \\012", zBuf1);.
9b00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43      }.    if( nC
9b10: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
9b20: 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c  rintf(out, "repl
9b30: 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43  ace(");.      zC
9b40: 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e  R = unused_strin
9b50: 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30  g(z, "\\r", "\\0
9b60: 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20  15", zBuf2);.   
9b70: 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
9b80: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9b90: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9ba0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9bb0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9bc0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
9bd0: 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b   && c!='\''; i++
9be0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ){}.      if( c=
9bf0: 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\'' ) i++;.   
9c00: 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20     if( i ){.    
9c10: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
9c20: 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  out, "%.*s", i, 
9c30: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d  z);.        z +=
9c40: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
9c50: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b    if( c=='\'' ){
9c60: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
9c70: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
9c80: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
9c90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9ca0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
9cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9cc0: 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  }.      z++;.   
9cd0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
9ce0: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
9cf0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
9d00: 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  zNL);.        co
9d10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
9d20: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
9d30: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29  (out, "%s", zCR)
9d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
9d50: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
9d60: 3b 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b  ;.    if( nCR ){
9d70: 0a 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 2c 27 25 73 27 2c 63 68  f(out, ",'%s',ch
9d90: 61 72 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a  ar(13))", zCR);.
9da0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e      }.    if( nN
9db0: 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  L ){.      raw_p
9dc0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
9dd0: 27 2c 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e  ',char(10))", zN
9de0: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
9df0: 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c  setTextMode(out,
9e00: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75   1);.}../*.** Ou
9e10: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9e20: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
9e30: 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43  d according to C
9e40: 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20   or TCL quoting 
9e50: 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rules..*/.static
9e60: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73   void output_c_s
9e70: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
9e80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
9e90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
9ea0: 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20  c;.  fputc('"', 
9eb0: 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28  out);.  while( (
9ec0: 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29  c = *(z++))!=0 )
9ed0: 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c  {.    if( c=='\\
9ee0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
9ef0: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
9f00: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
9f10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
9f20: 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  '"' ){.      fpu
9f30: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
9f40: 20 20 20 20 20 66 70 75 74 63 28 27 22 27 2c 20       fputc('"', 
9f50: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
9f60: 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20  if( c=='\t' ){. 
9f70: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
9f80: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
9f90: 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('t', out);.  
9fa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
9fb0: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \n' ){.      fpu
9fc0: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
9fd0: 20 20 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20       fputc('n', 
9fe0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
9ff0: 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20  if( c=='\r' ){. 
a000: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
a010: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a020: 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('r', out);.  
a030: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70    }else if( !isp
a040: 72 69 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a  rint(c&0xff) ){.
a050: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a060: 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20  (out, "\\%03o", 
a070: 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c  c&0xff);.    }el
a080: 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28  se{.      fputc(
a090: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  c, out);.    }. 
a0a0: 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20   }.  fputc('"', 
a0b0: 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  out);.}../*.** O
a0c0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
a0d0: 73 74 72 69 6e 67 20 77 69 74 68 20 63 68 61 72  string with char
a0e0: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20  acters that are 
a0f0: 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54  special to.** HT
a100: 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73  ML escaped..*/.s
a110: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
a120: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49  t_html_string(FI
a130: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
a140: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
a150: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a  ;.  if( z==0 ) z
a160: 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20   = "";.  while( 
a170: 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  *z ){.    for(i=
a180: 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20  0;   z[i].      
a190: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
a1a0: 3c 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  <'.            &
a1b0: 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20  & z[i]!='&'.    
a1c0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a1d0: 3d 27 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='>'.           
a1e0: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20   && z[i]!='\"'. 
a1f0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
a200: 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20  i]!='\'';.      
a210: 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28    i++){}.    if(
a220: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74   i>0 ){.      ut
a230: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  f8_printf(out,"%
a240: 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d  .*s",i,z);.    }
a250: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
a260: 3c 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <' ){.      raw_
a270: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b  printf(out,"&lt;
a280: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
a290: 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20  ( z[i]=='&' ){. 
a2a0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a2b0: 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20  out,"&amp;");.  
a2c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
a2d0: 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72  =='>' ){.      r
a2e0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
a2f0: 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gt;");.    }else
a300: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20   if( z[i]=='\"' 
a310: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a320: 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22  ntf(out,"&quot;"
a330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a340: 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20   z[i]=='\'' ){. 
a350: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a360: 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20  out,"&#39;");.  
a370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
a380: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a390: 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a  z += i + 1;.  }.
a3a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69  }../*.** If a fi
a3b0: 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  eld contains any
a3c0: 20 63 68 61 72 61 63 74 65 72 20 69 64 65 6e 74   character ident
a3d0: 69 66 69 65 64 20 62 79 20 61 20 31 20 69 6e 20  ified by a 1 in 
a3e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
a3f0: 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65   array, then the
a400: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20   string must be 
a410: 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a  quoted for CSV..
a420: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
a430: 63 68 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74  char needCsvQuot
a440: 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20  e[] = {.  1, 1, 
a450: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a460: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
a470: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
a480: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a490: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
a4a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
a4b0: 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c    1, 0, 1, 0, 0,
a4c0: 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30   0, 0, 1,   0, 0
a4d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a4e0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
a4f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
a500: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a510: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
a520: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a530: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
a540: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
a550: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a560: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
a570: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
a580: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a590: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
a5a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a5b0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
a5c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
a5d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a5e0: 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 0, 1,.  1, 1, 
a5f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a600: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
a610: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
a620: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a630: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
a640: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
a650: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a660: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
a670: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a680: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
a690: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
a6a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a6b0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
a6c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a6d0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
a6e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
a6f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a700: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
a710: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
a720: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a730: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
a740: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a750: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
a760: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
a770: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a780: 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 1, 1,.};../*.*
a790: 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c  * Output a singl
a7a0: 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20  e term of CSV.  
a7b0: 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c  Actually, p->col
a7c0: 53 65 70 61 72 61 74 6f 72 20 69 73 20 75 73 65  Separator is use
a7d0: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70  d for.** the sep
a7e0: 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61  arator, which ma
a7f0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
a800: 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c  a comma.  p->nul
a810: 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65  lValue is.** the
a820: 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74   null value.  St
a830: 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64  rings are quoted
a840: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
a850: 54 68 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a  The separator.**
a860: 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20   is only issued 
a870: 69 66 20 62 53 65 70 20 69 73 20 74 72 75 65 2e  if bSep is true.
a880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a890: 6f 75 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c  output_csv(Shell
a8a0: 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
a8b0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65  char *z, int bSe
a8c0: 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20  p){.  FILE *out 
a8d0: 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20  = p->out;.  if( 
a8e0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  z==0 ){.    utf8
a8f0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  _printf(out,"%s"
a900: 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a  ,p->nullValue);.
a910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
a920: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   i;.    int nSep
a930: 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63   = strlen30(p->c
a940: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
a950: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
a960: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
a970: 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28   needCsvQuote[((
a980: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
a990: 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c  )[i]].         |
a9a0: 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53  | (z[i]==p->colS
a9b0: 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20  eparator[0] &&. 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 53 65              (nSe
a9d0: 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a  p==1 || memcmp(z
a9e0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
a9f0: 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b  r, nSep)==0)) ){
aa00: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  .        i = 0;.
aa10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
aa20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
aa30: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
aa40: 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64     char *zQuoted
aa50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
aa60: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b  tf("\"%w\"", z);
aa70: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
aa80: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51  tf(out, "%s", zQ
aa90: 75 6f 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  uoted);.      sq
aaa0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
aab0: 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ed);.    }else{.
aac0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
aad0: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  f(out, "%s", z);
aae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
aaf0: 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66   bSep ){.    utf
ab00: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ab10: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ab20: 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  arator);.  }.}..
ab30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ab40: 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  ne runs when the
ab50: 20 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74   user presses Ct
ab60: 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rl-C.*/.static v
ab70: 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61  oid interrupt_ha
ab80: 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65  ndler(int NotUse
ab90: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
aba0: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
abb0: 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  .  seenInterrupt
abc0: 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e  ++;.  if( seenIn
abd0: 74 65 72 72 75 70 74 3e 32 20 29 20 65 78 69 74  terrupt>2 ) exit
abe0: 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61  (1);.  if( globa
abf0: 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e  lDb ) sqlite3_in
ac00: 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62  terrupt(globalDb
ac10: 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e  );.}..#if (defin
ac20: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
ac30: 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26  fined(WIN32)) &&
ac40: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
ac50: 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _WCE)./*.** This
ac60: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f   routine runs fo
ac70: 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73  r console events
ac80: 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f   (e.g. Ctrl-C) o
ac90: 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69  n Win32.*/.stati
aca0: 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f  c BOOL WINAPI Co
acb0: 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72  nsoleCtrlHandler
acc0: 28 0a 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c  (.  DWORD dwCtrl
acd0: 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  Type /* One of t
ace0: 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20  he CTRL_*_EVENT 
acf0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a  constants */.){.
ad00: 20 20 69 66 28 20 64 77 43 74 72 6c 54 79 70 65    if( dwCtrlType
ad10: 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29  ==CTRL_C_EVENT )
ad20: 7b 0a 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f  {.    interrupt_
ad30: 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20  handler(0);.    
ad40: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
ad50: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
ad60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
ad70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ad80: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
ad90: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75  ** When the ".au
ada0: 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74  th ON" is set, t
adb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74  he following aut
adc0: 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
add0: 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20   is.** invoked. 
ade0: 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
adf0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
ae00: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
ae10: 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70  lAuth(.  void *p
ae20: 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e  ClientData,.  in
ae30: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
ae40: 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74  ar *zA1,.  const
ae50: 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f   char *zA2,.  co
ae60: 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20  nst char *zA3,. 
ae70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34   const char *zA4
ae80: 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  .){.  ShellState
ae90: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
aea0: 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a  e*)pClientData;.
aeb0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
aec0: 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20  har *azAction[] 
aed0: 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45  = { 0,.     "CRE
aee0: 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20  ATE_INDEX",     
aef0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c      "CREATE_TABL
af00: 45 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45  E",         "CRE
af10: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c  ATE_TEMP_INDEX",
af20: 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 45  .     "CREATE_TE
af30: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43  MP_TABLE",    "C
af40: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
af50: 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45  ER",  "CREATE_TE
af60: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
af70: 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c  CREATE_TRIGGER",
af80: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56         "CREATE_V
af90: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 22  IEW",          "
afa0: 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44  DELETE",.     "D
afb0: 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20  ROP_INDEX",     
afc0: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c        "DROP_TABL
afd0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44  E",           "D
afe0: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c  ROP_TEMP_INDEX",
aff0: 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50  .     "DROP_TEMP
b000: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44  _TABLE",      "D
b010: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
b020: 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50  ",    "DROP_TEMP
b030: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52  _VIEW",.     "DR
b040: 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20  OP_TRIGGER",    
b050: 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22       "DROP_VIEW"
b060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e  ,            "IN
b070: 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41  SERT",.     "PRA
b080: 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  GMA",           
b090: 20 20 20 20 22 52 45 41 44 22 2c 20 20 20 20 20      "READ",     
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
b0b0: 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e  ECT",.     "TRAN
b0c0: 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20  SACTION",       
b0d0: 20 20 20 22 55 50 44 41 54 45 22 2c 20 20 20 20     "UPDATE",    
b0e0: 20 20 20 20 20 20 20 20 20 20 20 22 41 54 54 41             "ATTA
b0f0: 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43  CH",.     "DETAC
b100: 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  H",             
b110: 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c    "ALTER_TABLE",
b120: 20 20 20 20 20 20 20 20 20 20 22 52 45 49 4e 44            "REIND
b130: 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59  EX",.     "ANALY
b140: 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ZE",            
b150: 20 20 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45    "CREATE_VTABLE
b160: 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f  ",        "DROP_
b170: 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46  VTABLE",.     "F
b180: 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20  UNCTION",       
b190: 20 20 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54        "SAVEPOINT
b1a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 52  ",            "R
b1b0: 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20  ECURSIVE".  };. 
b1c0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
b1d0: 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61  char *az[4];.  a
b1e0: 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a  z[0] = zA1;.  az
b1f0: 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b  [1] = zA2;.  az[
b200: 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33  2] = zA3;.  az[3
b210: 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f  ] = zA4;.  utf8_
b220: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b230: 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c  authorizer: %s",
b240: 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a   azAction[op]);.
b250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20    for(i=0; i<4; 
b260: 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  i++){.    raw_pr
b270: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22  intf(p->out, " "
b280: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d  );.    if( az[i]
b290: 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74   ){.      output
b2a0: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
b2b0: 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  , az[i]);.    }e
b2c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
b2d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e  rintf(p->out, "N
b2e0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
b2f0: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
b300: 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72  >out, "\n");.  r
b310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b320: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b330: 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20   Print a schema 
b340: 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74  statement.  Part
b350: 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e   of MODE_Semi an
b360: 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75  d MODE_Pretty ou
b370: 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tput..**.** This
b380: 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74   routine convert
b390: 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41  s some CREATE TA
b3a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66  BLE statements f
b3b0: 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73  or shadow tables
b3c0: 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20  .** in FTS3/4/5 
b3d0: 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c  into CREATE TABL
b3e0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
b3f0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
b400: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
b410: 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20  SchemaLine(FILE 
b420: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
b430: 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *z, const char 
b440: 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 73  *zTail){.  if( s
b450: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
b460: 43 52 45 41 54 45 20 54 41 42 4c 45 20 5b 27 5c  CREATE TABLE ['\
b470: 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  "]*", z)==0 ){. 
b480: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
b490: 75 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  ut, "CREATE TABL
b4a0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
b4b0: 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61  %s%s", z+13, zTa
b4c0: 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  il);.  }else{.  
b4d0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
b4e0: 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54  t, "%s%s", z, zT
b4f0: 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ail);.  }.}.stat
b500: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68  ic void printSch
b510: 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f  emaLineN(FILE *o
b520: 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ut, char *z, int
b530: 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   n, const char *
b540: 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61 72 20 63  zTail){.  char c
b550: 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20   = z[n];.  z[n] 
b560: 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53 63 68 65  = 0;.  printSche
b570: 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a  maLine(out, z, z
b580: 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20  Tail);.  z[n] = 
b590: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
b5a0: 72 6e 20 74 72 75 65 20 69 66 20 73 74 72 69 6e  rn true if strin
b5b0: 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e  g z[] has nothin
b5c0: 67 20 62 75 74 20 77 68 69 74 65 73 70 61 63 65  g but whitespace
b5d0: 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f   and comments to
b5e0: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
b5f0: 68 65 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a  he first line..*
b600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 73 54  /.static int wsT
b610: 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  oEol(const char 
b620: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
b630: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
b640: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
b650: 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74 75 72 6e  ]=='\n' ) return
b660: 20 31 3b 0a 20 20 20 20 69 66 28 20 49 73 53 70   1;.    if( IsSp
b670: 61 63 65 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74  ace(z[i]) ) cont
b680: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b  inue;.    if( z[
b690: 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31  i]=='-' && z[i+1
b6a0: 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]=='-' ) return 
b6b0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
b6c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
b6d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
b6e0: 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65  new entry to the
b6f0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
b700: 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  LAN data.*/.stat
b710: 69 63 20 76 6f 69 64 20 65 71 70 5f 61 70 70 65  ic void eqp_appe
b720: 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nd(ShellState *p
b730: 2c 20 69 6e 74 20 69 53 65 6c 65 63 74 49 64 2c  , int iSelectId,
b740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
b750: 78 74 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52  xt){.  EQPGraphR
b760: 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  ow *pNew;.  int 
b770: 6e 54 65 78 74 20 3d 20 73 74 72 6c 65 6e 33 30  nText = strlen30
b780: 28 7a 54 65 78 74 29 3b 0a 20 20 70 4e 65 77 20  (zText);.  pNew 
b790: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
b7a0: 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  64( sizeof(*pNew
b7b0: 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69  ) + nText );.  i
b7c0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65  f( pNew==0 ) she
b7d0: 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
b7e0: 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 53 65 6c  ();.  pNew->iSel
b7f0: 65 63 74 49 64 20 3d 20 69 53 65 6c 65 63 74 49  ectId = iSelectI
b800: 64 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  d;.  memcpy(pNew
b810: 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c 20  ->zText, zText, 
b820: 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65 77  nText+1);.  pNew
b830: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69  ->pNext = 0;.  i
b840: 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  f( p->sGraph.pLa
b850: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47 72  st ){.    p->sGr
b860: 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74  aph.pLast->pNext
b870: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65   = pNew;.  }else
b880: 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e  {.    p->sGraph.
b890: 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  pRow = pNew;.  }
b8a0: 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  .  p->sGraph.pLa
b8b0: 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  st = pNew;.}../*
b8c0: 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65 73  .** Free and res
b8d0: 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  et the EXPLAIN Q
b8e0: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20 74  UERY PLAN data t
b8f0: 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6c  hat has been col
b900: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  lected.** in p->
b910: 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74 69  sGraph..*/.stati
b920: 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65 74  c void eqp_reset
b930: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
b940: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
b950: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
b960: 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73 47  for(pRow = p->sG
b970: 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77 3b  raph.pRow; pRow;
b980: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
b990: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f 77      pNext = pRow
b9a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
b9b0: 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b  ite3_free(pRow);
b9c0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
b9d0: 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69 7a  ->sGraph, 0, siz
b9e0: 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29 3b  eof(p->sGraph));
b9f0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
ba00: 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20 51  e next EXPLAIN Q
ba10: 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20 77  UERY PLAN line w
ba20: 69 74 68 20 69 53 65 6c 65 63 74 49 64 20 74 68  ith iSelectId th
ba30: 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a  at occurs after.
ba40: 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75  ** pOld, or retu
ba50: 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75 63  rn the first suc
ba60: 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69  h line if pOld i
ba70: 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  s NULL.*/.static
ba80: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71   EQPGraphRow *eq
ba90: 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c  p_next_row(Shell
baa0: 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 53  State *p, int iS
bab0: 65 6c 65 63 74 49 64 2c 20 45 51 50 47 72 61 70  electId, EQPGrap
bac0: 68 52 6f 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45  hRow *pOld){.  E
bad0: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77  QPGraphRow *pRow
bae0: 20 3d 20 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e   = pOld ? pOld->
baf0: 70 4e 65 78 74 20 3a 20 70 2d 3e 73 47 72 61 70  pNext : p->sGrap
bb00: 68 2e 70 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28  h.pRow;.  while(
bb10: 20 70 52 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69   pRow && pRow->i
bb20: 53 65 6c 65 63 74 49 64 21 3d 69 53 65 6c 65 63  SelectId!=iSelec
bb30: 74 49 64 20 29 20 70 52 6f 77 20 3d 20 70 52 6f  tId ) pRow = pRo
bb40: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  w->pNext;.  retu
bb50: 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52  rn pRow;.}../* R
bb60: 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65 20 6c  ender a single l
bb70: 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72 61 70  evel of the grap
bb80: 68 20 73 68 65 6c 6c 20 68 61 76 69 6e 67 20 69  h shell having i
bb90: 53 65 6c 65 63 74 49 64 2e 20 20 43 61 6c 6c 65  SelectId.  Calle
bba0: 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79  d.** recursively
bbb0: 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65   to render suble
bbc0: 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  vels..*/.static 
bbd0: 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f  void eqp_render_
bbe0: 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65  level(ShellState
bbf0: 20 2a 70 2c 20 69 6e 74 20 69 53 65 6c 65 63 74   *p, int iSelect
bc00: 49 64 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52  Id){.  EQPGraphR
bc10: 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74  ow *pRow, *pNext
bc20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
bc30: 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d   n = strlen30(p-
bc40: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 29  >sGraph.zPrefix)
bc50: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66  ;.  char *z;.  f
bc60: 6f 72 28 70 52 6f 77 20 3d 20 65 71 70 5f 6e 65  or(pRow = eqp_ne
bc70: 78 74 5f 72 6f 77 28 70 2c 20 69 53 65 6c 65 63  xt_row(p, iSelec
bc80: 74 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70  tId, 0); pRow; p
bc90: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
bca0: 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65    pNext = eqp_ne
bcb0: 78 74 5f 72 6f 77 28 70 2c 20 69 53 65 6c 65 63  xt_row(p, iSelec
bcc0: 74 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20  tId, pRow);.    
bcd0: 7a 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b  z = pRow->zText;
bce0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
bcf0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73  (p->out, "%s%s%s
bd00: 5c 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a  \n", p->sGraph.z
bd10: 50 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20  Prefix, pNext ? 
bd20: 22 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a  "|--" : "`--", z
bd30: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 73 69 7a  );.    if( n<siz
bd40: 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50  eof(p->sGraph.zP
bd50: 72 65 66 69 78 29 2d 37 20 26 26 20 28 7a 20 3d  refix)-7 && (z =
bd60: 20 73 74 72 73 74 72 28 7a 2c 20 22 20 53 55 42   strstr(z, " SUB
bd70: 51 55 45 52 22 29 29 21 3d 30 20 29 7b 0a 20 20  QUER"))!=0 ){.  
bd80: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
bd90: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
bda0: 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20  , pNext ? "|  " 
bdb0: 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20  : "   ", 4);.   
bdc0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
bdd0: 2c 20 22 20 53 55 42 51 55 45 52 59 20 22 2c 20  , " SUBQUERY ", 
bde0: 39 29 3d 3d 30 20 26 26 20 28 69 20 3d 20 61 74  9)==0 && (i = at
bdf0: 6f 69 28 7a 2b 31 30 29 29 3e 69 53 65 6c 65 63  oi(z+10))>iSelec
be00: 74 49 64 20 29 7b 0a 20 20 20 20 20 20 20 20 65  tId ){.        e
be10: 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28  qp_render_level(
be20: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p, i);.      }el
be30: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
be40: 2c 20 22 20 53 55 42 51 55 45 52 49 45 53 20 22  , " SUBQUERIES "
be50: 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 12)==0 ){.    
be60: 20 20 20 20 69 20 3d 20 61 74 6f 69 28 7a 2b 31      i = atoi(z+1
be70: 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
be80: 69 3e 69 53 65 6c 65 63 74 49 64 20 29 7b 0a 20  i>iSelectId ){. 
be90: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
bea0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
beb0: 7c 2d 2d 53 55 42 51 55 45 52 59 20 25 64 5c 6e  |--SUBQUERY %d\n
bec0: 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  ", p->sGraph.zPr
bed0: 65 66 69 78 2c 20 69 29 3b 0a 20 20 20 20 20 20  efix, i);.      
bee0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
bef0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 2b  Graph.zPrefix[n+
bf00: 33 5d 2c 22 7c 20 20 22 2c 34 29 3b 0a 20 20 20  3],"|  ",4);.   
bf10: 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65         eqp_rende
bf20: 72 5f 6c 65 76 65 6c 28 70 2c 20 69 29 3b 0a 20  r_level(p, i);. 
bf30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bf40: 20 7a 20 3d 20 73 74 72 73 74 72 28 7a 2c 20 22   z = strstr(z, "
bf50: 20 41 4e 44 20 22 29 3b 0a 20 20 20 20 20 20 20   AND ");.       
bf60: 20 69 66 28 20 7a 20 26 26 20 28 69 20 3d 20 61   if( z && (i = a
bf70: 74 6f 69 28 7a 2b 35 29 29 3e 69 53 65 6c 65 63  toi(z+5))>iSelec
bf80: 74 49 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tId ){.         
bf90: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
bfa0: 69 78 5b 6e 2b 33 5d 20 3d 20 30 3b 0a 20 20 20  ix[n+3] = 0;.   
bfb0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
bfc0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 60 2d  tf(p->out, "%s`-
bfd0: 2d 53 55 42 51 55 45 52 59 20 25 64 5c 6e 22 2c  -SUBQUERY %d\n",
bfe0: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
bff0: 69 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ix, i);.        
c000: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47 72    memcpy(&p->sGr
c010: 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 2b 33 5d  aph.zPrefix[n+3]
c020: 2c 22 20 20 20 22 2c 34 29 3b 0a 20 20 20 20 20  ,"   ",4);.     
c030: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c040: 6c 65 76 65 6c 28 70 2c 20 69 29 3b 0a 20 20 20  level(p, i);.   
c050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c060: 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a       p->sGraph.z
c070: 50 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20  Prefix[n] = 0;. 
c080: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c090: 2a 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72 65  * Display and re
c0a0: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c0b0: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a  QUERY PLAN data.
c0c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
c0d0: 71 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c 53  qp_render(ShellS
c0e0: 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47  tate *p){.  EQPG
c0f0: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c100: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a  p->sGraph.pRow;.
c110: 20 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20 20    if( pRow ){.  
c120: 20 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65 78    if( pRow->zTex
c130: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  t[0]=='-' ){.   
c140: 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e 65     if( pRow->pNe
c150: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  xt==0 ){.       
c160: 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20   eqp_reset(p);. 
c170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
c190: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c1a0: 20 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a   "%s\n", pRow->z
c1b0: 54 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20 70  Text+3);.      p
c1c0: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20  ->sGraph.pRow = 
c1d0: 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pRow->pNext;.   
c1e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c1f0: 70 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRow);.    }else
c200: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
c210: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55 45  ntf(p->out, "QUE
c220: 52 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20  RY PLAN\n");.   
c230: 20 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68   }.    p->sGraph
c240: 2e 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b  .zPrefix[0] = 0;
c250: 0a 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f  .    eqp_render_
c260: 6c 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20 20  level(p, 0);.   
c270: 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20   eqp_reset(p);. 
c280: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
c290: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
c2a0: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
c2b0: 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b  e shell.** invok
c2c0: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
c2d0: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
c2e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c2f0: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
c300: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
c310: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
c320: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
c330: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
c340: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
c350: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
c360: 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ach result colum
c370: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
c380: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
c390: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
c3a0: 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a   *aiType      /*
c3b0: 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f   Column types */
c3c0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  .){.  int i;.  S
c3d0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
c3e0: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
c3f0: 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d  ;..  if( azArg==
c400: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c410: 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65  switch( p->cMode
c420: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
c430: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
c440: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
c450: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c460: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
c470: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c480: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
c490: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
c4a0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
c4b0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
c4c0: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
c4d0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
c4e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
c4f0: 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  +>0 ) utf8_print
c500: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
c510: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
c520: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c530: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
c540: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c550: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
c560: 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s%s", w, azCol
c570: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
c580: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
c590: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
c5a0: 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53  llValue, p->rowS
c5b0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c5c0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c5d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
c5e0: 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20  ODE_Explain:.   
c5f0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   case MODE_Colum
c600: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  n: {.      stati
c610: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70  c const int aExp
c620: 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b  lainWidths[] = {
c630: 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20  4, 13, 4, 4, 4, 
c640: 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20  13, 2, 13};.    
c650: 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c    const int *col
c660: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  Width;.      int
c670: 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20   showHdr;.      
c680: 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20  char *rowSep;.  
c690: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
c6a0: 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b  ==MODE_Column ){
c6b0: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
c6c0: 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b  h = p->colWidth;
c6d0: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
c6e0: 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
c6f0: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
c700: 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
c710: 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  or;.      }else{
c720: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
c730: 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74  h = aExplainWidt
c740: 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77  hs;.        show
c750: 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Hdr = 1;.       
c760: 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f   rowSep = SEP_Ro
c770: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
c780: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
c790: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
c7a0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
c7b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c7c0: 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   w, n;.         
c7d0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
c7e0: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b  (p->colWidth) ){
c7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
c800: 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20   colWidth[i];.  
c810: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c820: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
c830: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c840: 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30          if( w==0
c850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c860: 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61  w = strlenChar(a
c870: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
c880: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
c890: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
c8a0: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
c8b0: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43       n = strlenC
c8c0: 68 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41  har(azArg && azA
c8d0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
c8e0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
c8f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
c900: 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20  ( w<n ) w = n;. 
c910: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c920: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
c930: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
c940: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
c950: 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64      p->actualWid
c960: 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20  th[i] = w;.     
c970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
c980: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
c990: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
c9a0: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
c9b0: 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  out, w, azCol[i]
c9c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
c9d0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c9e0: 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67  t, "%s", i==nArg
c9f0: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
ca00: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
ca10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ca20: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
ca30: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
ca40: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
ca50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
ca60: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
ca70: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
ca80: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
ca90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
caa0: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
cab0: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
cac0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
cad0: 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20  0 ) w = -w;.    
cae0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
cb00: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
cb10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
cb20: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
cb30: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
cb40: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
cb50: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
cb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb90: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
cba0: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbe0: 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
cbf0: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
cc00: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
cc10: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
cc20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc30: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
cc40: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
cc50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
cc60: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
cc70: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
cc80: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
cc90: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
cca0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
ccb0: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
ccc0: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  th[i];.        }
ccd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
cce0: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
ccf0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
cd00: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
cd10: 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69  plain && azArg[i
cd20: 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28  ] && strlenChar(
cd30: 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20  azArg[i])>w ){. 
cd40: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
cd50: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
cd60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cd70: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26       if( i==1 &&
cd80: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20   p->aiIndent && 
cd90: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
cda0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e        if( p->iIn
cdb0: 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20  dent<p->nIndent 
cdc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
cdd0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cde0: 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69  t, "%*.s", p->ai
cdf0: 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e  Indent[p->iInden
ce00: 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  t], "");.       
ce10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
ce20: 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20  ->iIndent++;.   
ce30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
ce40: 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28  tf8_width_print(
ce50: 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67  p->out, w, azArg
ce60: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
ce70: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
ce80: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ce90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
cea0: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
ceb0: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
cec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ced0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
cee0: 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20  e MODE_Semi: {  
cef0: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
cf00: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70  .fullschema outp
cf10: 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e  ut */.      prin
cf20: 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
cf30: 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b  ut, azArg[0], ";
cf40: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
cf50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
cf60: 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b  e MODE_Pretty: {
cf70: 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64    /* .schema and
cf80: 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74   .fullschema wit
cf90: 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20  h --indent */.  
cfa0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
cfb0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
cfc0: 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a  int nParen = 0;.
cfd0: 20 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20        char cEnd 
cfe0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
cff0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  c;.      int nLi
d000: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ne = 0;.      as
d010: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
d020: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
d030: 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [0]==0 ) break;.
d040: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d050: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
d060: 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b  E VIEW%", azArg[
d070: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
d080: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
d090: 69 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47  ike("CREATE TRIG
d0a0: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
d0b0: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
d0c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d0d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (p->out, "%s;\n"
d0e0: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
d0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d100: 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71    }.      z = sq
d110: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
d120: 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  s", azArg[0]);. 
d130: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
d140: 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61    for(i=0; IsSpa
d150: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
d160: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20  .      for(; (c 
d170: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
d180: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
d190: 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
d1a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d        if( z[j-1]
d1b0: 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20  =='\r' ) z[j-1] 
d1c0: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
d1d0: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
d1e0: 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d  j-1]) || z[j-1]=
d1f0: 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='(' ) continue;
d200: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
d210: 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  f( (c=='(' || c=
d220: 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20  =')') && j>0 && 
d230: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
d240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  ){.          j--
d250: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d260: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
d270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
d280: 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70  ile( j>0 && IsSp
d290: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
d2a0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d  --; }.      z[j]
d2b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
d2c0: 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20  strlen30(z)>=79 
d2d0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
d2e0: 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
d2f0: 21 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43  !=0; i++){  /* C
d300: 6f 70 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d  opy changes from
d310: 20 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b   z[i] back to z[
d320: 6a 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  j] */.          
d330: 69 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20  if( c==cEnd ){. 
d340: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
d350: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
d360: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20  else if( c=='"' 
d370: 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  || c=='\'' || c=
d380: 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='`' ){.        
d390: 20 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20      cEnd = c;.  
d3a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d3b0: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
d3c0: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27          cEnd = '
d3d0: 5d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]';.          }e
d3e0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26  lse if( c=='-' &
d3f0: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b  & z[i+1]=='-' ){
d400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
d410: 64 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  d = '\n';.      
d420: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d430: 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
d440: 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20      nParen++;.  
d450: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d460: 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  ( c==')' ){.    
d470: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d          nParen--
d480: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d490: 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61  ( nLine>0 && nPa
d4a0: 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b  ren==0 && j>0 ){
d4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d4c0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
d4d0: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
d4e0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n");.           
d4f0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d510: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b    }.          z[
d520: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
d530: 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d      if( nParen==
d540: 31 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20  1 && cEnd==0.   
d550: 20 20 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27          && (c=='
d560: 28 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c  (' || c=='\n' ||
d570: 20 28 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54   (c==',' && !wsT
d580: 6f 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20  oEol(z+i+1))).  
d590: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
d5a0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
d5b0: 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20  n' ) j--;.      
d5c0: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
d5d0: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
d5e0: 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20  , j, "\n  ");.  
d5f0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
d600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69  .            nLi
d610: 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ne++;.          
d620: 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
d630: 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b  (z[i+1]) ){ i++;
d640: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
d650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d660: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
d670: 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63   }.      printSc
d680: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
d690: 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20   z, ";\n");.    
d6a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d6b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d6c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d6d0: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
d6e0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
d6f0: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
d700: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
d710: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d720: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ++){.          u
d730: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d740: 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69  t,"%s%s",azCol[i
d750: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
d760: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
d770: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d780: 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   : p->colSeparat
d790: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
d7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d7b0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
d7c0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
d7d0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
d7e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
d7f0: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
d800: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
d810: 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b   = p->nullValue;
d820: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
d830: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d840: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ", z);.        i
d850: 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20  f( i<nArg-1 ){. 
d860: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d870: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d880: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
d890: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  or);.        }el
d8a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74  se{.          ut
d8b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d8c0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
d8d0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
d8e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d8f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d900: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d     case MODE_Htm
d910: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
d920: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
d930: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
d940: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
d950: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29  f(p->out,"<TR>")
d960: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d970: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d980: 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
d990: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
d9a0: 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  H>");.          
d9b0: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
d9c0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
d9d0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
d9e0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
d9f0: 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20  t,"</TH>\n");.  
da00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
da10: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
da20: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
da30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
da40: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
da50: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
da60: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22  tf(p->out,"<TR>"
da70: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
da80: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
da90: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
daa0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22  tf(p->out,"<TD>"
dab0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
dac0: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
dad0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
dae0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
daf0: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
db00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
db10: 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b  >out,"</TD>\n");
db20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
db30: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
db40: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
db50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
db60: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63      case MODE_Tc
db70: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
db80: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
db90: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
dba0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
dbb0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
dbc0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
dbd0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61  _string(p->out,a
dbe0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
dbf0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
dc00: 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29      if(i<nArg-1)
dc10: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
dc20: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
dc30: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
dc40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
dc50: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
dc60: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
dc70: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
dc80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
dc90: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
dca0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dcb0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
dcc0: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
dcd0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
dce0: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
dcf0: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
dd00: 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41  .        if(i<nA
dd10: 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74  rg-1) utf8_print
dd20: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
dd30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
dd40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dd50: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
dd60: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
dd70: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
dd80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
dd90: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
dda0: 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e  : {.      setBin
ddb0: 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  aryMode(p->out, 
ddc0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
ddd0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
dde0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
ddf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
de00: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
de10: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
de20: 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20  v(p, azCol[i] ? 
de30: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69  azCol[i] : "", i
de40: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
de50: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
de60: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
de70: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
de80: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
de90: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30        if( nArg>0
dea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
deb0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
dec0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
ded0: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67  put_csv(p, azArg
dee0: 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a  [i], i<nArg-1);.
def0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df00: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
df10: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
df20: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
df30: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54      }.      setT
df40: 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
df50: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
df60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
df70: 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20  MODE_Insert: {. 
df80: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
df90: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
dfa0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
dfb0: 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f  out,"INSERT INTO
dfc0: 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62   %s",p->zDestTab
dfd0: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
dfe0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
dff0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e000: 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a  tf(p->out,"(");.
e010: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e020: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e030: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
e040: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
e050: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
e060: 20 20 20 20 20 20 69 66 28 20 71 75 6f 74 65 43        if( quoteC
e070: 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b  har(azCol[i]) ){
e080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
e090: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  r *z = sqlite3_m
e0a0: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
e0b0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
e0c0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e0d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e0e0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
e0f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e110: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e120: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e130: 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69  t, "%s", azCol[i
e140: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
e150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e160: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e170: 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  out,")");.      
e180: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
e190: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
e1a0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e1b0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e1c0: 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20  f(p->out, i>0 ? 
e1d0: 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22  "," : " VALUES("
e1e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
e1f0: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
e200: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
e210: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
e220: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
e230: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e240: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
e250: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
e260: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
e270: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
e280: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e290: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
e2a0: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20  SHFLG_Newlines) 
e2b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
e2c0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
e2d0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e2e0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
e2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e300: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
e310: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
e320: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
e330: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
e340: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e350: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
e360: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
e370: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
e380: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e390: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
e3a0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
e3b0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
e3c0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
e3d0: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
e3e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
e3f0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
e400: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
e410: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
e420: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
e440: 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21  nprintf(50,z,"%!
e450: 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20  .20g", r);.     
e460: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e470: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
e480: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e490: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
e4a0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
e4b0: 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74  BLOB && p->pStmt
e4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
e4d0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20  nst void *pBlob 
e4e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e4f0: 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20  _blob(p->pStmt, 
e500: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  i);.          in
e510: 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65  t nBlob = sqlite
e520: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
e530: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
e540: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65         output_he
e550: 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70  x_blob(p->out, p
e560: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
e570: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e580: 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69  isNumber(azArg[i
e590: 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 0) ){.       
e5a0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e5b0: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
e5c0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
e5d0: 65 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61  else if( ShellHa
e5e0: 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  sFlag(p, SHFLG_N
e5f0: 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20  ewlines) ){.    
e600: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
e610: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
e620: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
e630: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e640: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
e650: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
e660: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e670: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
e680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e690: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e6a0: 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ,");\n");.      
e6b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e6c0: 20 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65   case MODE_Quote
e6d0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  : {.      if( az
e6e0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e6f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
e700: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
e710: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
e720: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e730: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e740: 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70   if( i>0 ) raw_p
e750: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c  rintf(p->out, ",
e760: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e770: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
e780: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
e790: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
e7a0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e7b0: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
e7c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e7d0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66  ->cnt++;.      f
e7e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e7f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
e800: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
e810: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
e820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
e830: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
e840: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
e850: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
e860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
e870: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e880: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
e890: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e8a0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e8b0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
e8c0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e8d0: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
e8e0: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
e8f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e900: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
e910: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
e920: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
e930: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e940: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
e950: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
e960: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
e970: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e980: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
e990: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
e9a0: 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [50];.          
e9b0: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
e9c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
e9d0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
e9e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e9f0: 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22  _snprintf(50,z,"
ea00: 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20  %!.20g", r);.   
ea10: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
ea20: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ea30: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z);.        }els
ea40: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ea50: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ea60: 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74  E_BLOB && p->pSt
ea70: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
ea80: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
ea90: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
eaa0: 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74  mn_blob(p->pStmt
eab0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
eac0: 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  int nBlob = sqli
ead0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
eae0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
eaf0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
eb00: 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c  hex_blob(p->out,
eb10: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a   pBlob, nBlob);.
eb20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
eb30: 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67  ( isNumber(azArg
eb40: 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  [i], 0) ){.     
eb50: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
eb60: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
eb70: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
eb80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eb90: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
eba0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
ebb0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
ebc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ebd0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ebe0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
ebf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ec00: 20 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69    case MODE_Asci
ec10: 69 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  i: {.      if( p
ec20: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
ec30: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
ec40: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
ec50: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
ec60: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
ec70: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
ec80: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
ec90: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
eca0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ecb0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
ecc0: 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c  azCol[i] ? azCol
ecd0: 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  [i] : "");.     
ece0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
ecf0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ed00: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
ed10: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
ed20: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
ed30: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ed40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
ed50: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
ed60: 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38    if( i>0 ) utf8
ed70: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ed80: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
ed90: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
eda0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
edb0: 75 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d  ut,"%s",azArg[i]
edc0: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
edd0: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
ede0: 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f     }.      utf8_
edf0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ee00: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
ee10: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65  ator);.      bre
ee20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ee30: 73 65 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20  se MODE_EQP: {. 
ee40: 20 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28       eqp_append(
ee50: 70 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d  p, atoi(azArg[0]
ee60: 29 2c 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20  ), azArg[3]);.  
ee70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ee80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ee90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
eea0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
eeb0: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
eec0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a  SQLite library.*
eed0: 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61  * invokes for ea
eee0: 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72  ch row of a quer
eef0: 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  y result..*/.sta
ef00: 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b  tic int callback
ef10: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
ef20: 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
ef30: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f  Arg, char **azCo
ef40: 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77  l){.  /* since w
ef50: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70  e don't have typ
ef60: 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65  e info, call the
ef70: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20   shell_callback 
ef80: 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
ef90: 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68  e */.  return sh
efa0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72  ell_callback(pAr
efb0: 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20  g, nArg, azArg, 
efc0: 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a  azCol, NULL);.}.
efd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
efe0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
eff0: 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ine from sqlite3
f000: 5f 65 78 65 63 28 29 20 74 68 61 74 20 61 70 70  _exec() that app
f010: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70  ends all.** outp
f020: 75 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ut onto the end 
f030: 6f 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f  of a ShellText o
f040: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
f050: 20 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70   int captureOutp
f060: 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  utCallback(void 
f070: 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c  *pArg, int nArg,
f080: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63   char **azArg, c
f090: 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65  har **az){.  She
f0a0: 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65  llText *p = (She
f0b0: 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20  llText*)pArg;.  
f0c0: 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f  int i;.  UNUSED_
f0d0: 50 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20  PARAMETER(az);. 
f0e0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
f0f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f100: 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78  p->n ) appendTex
f110: 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20  t(p, "|", 0);.  
f120: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f130: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
f140: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
f150: 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66   ",", 0);.    if
f160: 28 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70  ( azArg[i] ) app
f170: 65 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67  endText(p, azArg
f180: 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  [i], 0);.  }.  r
f190: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f1a0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70  * Generate an ap
f1b0: 70 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45  propriate SELFTE
f1c0: 53 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ST table in the 
f1d0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a  main database..*
f1e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
f1f0: 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c  eateSelftestTabl
f200: 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  e(ShellState *p)
f210: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  {.  char *zErrMs
f220: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
f230: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
f240: 20 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66   "SAVEPOINT self
f250: 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20  test_init;\n".  
f260: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
f270: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65  IF NOT EXISTS se
f280: 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22  lftest(\n".    "
f290: 20 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52    tno INTEGER PR
f2a0: 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20  IMARY KEY,\n"   
f2b0: 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a  /* Test number *
f2c0: 2f 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58 54  /.    "  op TEXT
f2d0: 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ,\n"            
f2e0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74         /* Operat
f2f0: 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f  or:  memo run */
f300: 0a 20 20 20 20 22 20 20 63 6d 64 20 54 45 58 54  .    "  cmd TEXT
f310: 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ,\n"            
f320: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64        /* Command
f330: 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20   text */.    "  
f340: 61 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20  ans TEXT\n"     
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f360: 20 44 65 73 69 72 65 64 20 61 6e 73 77 65 72 20   Desired answer 
f370: 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20  */.    ");".    
f380: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
f390: 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  LE [_shell$self]
f3a0: 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22  (op,cmd,ans);\n"
f3b0: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
f3c0: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28  O [_shell$self](
f3d0: 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22  rowid,op,cmd)\n"
f3e0: 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 63  .    "  VALUES(c
f3f0: 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20  oalesce((SELECT 
f400: 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31  (max(tno)+100)/1
f410: 30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29  0 FROM selftest)
f420: 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20  ,10),\n".    "  
f430: 20 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54         'memo','T
f440: 65 73 74 73 20 67 65 6e 65 72 61 74 65 64 20 62  ests generated b
f450: 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20  y --init');\n". 
f460: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
f470: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22  [_shell$self]\n"
f480: 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27  .    "  SELECT '
f490: 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  run',\n".    "  
f4a0: 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68    'SELECT hex(sh
f4b0: 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43  a3_query(''SELEC
f4c0: 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f  T type,name,tbl_
f4d0: 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20  name,sql ".     
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
f500: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
f510: 4f 52 44 45 52 20 42 59 20 32 27 27 2c 32 32 34  ORDER BY 2'',224
f520: 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  ))',\n".    "   
f530: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
f540: 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  'SELECT type,nam
f550: 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22  e,tbl_name,sql "
f560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f570: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
f580: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
f590: 52 44 45 52 20 42 59 20 32 27 2c 32 32 34 29 29  RDER BY 2',224))
f5a0: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
f5b0: 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65   INTO [_shell$se
f5c0: 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45  lf]\n".    "  SE
f5d0: 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20  LECT 'run',".   
f5e0: 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65   "    'SELECT he
f5f0: 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53  x(sha3_query(''S
f600: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27  ELECT * FROM \"'
f610: 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
f620: 20 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61    printf('%w',na
f630: 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49  me) || '\" NOT I
f640: 4e 44 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c  NDEXED'',224))',
f650: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78  \n".    "    hex
f660: 28 73 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e  (sha3_query(prin
f670: 74 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf('SELECT * FRO
f680: 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44  M \"%w\" NOT IND
f690: 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29  EXED',name),224)
f6a0: 29 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  )\n".    "  FROM
f6b0: 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53   (\n".    "    S
f6c0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
f6d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22  sqlite_master\n"
f6e0: 0a 20 20 20 20 22 20 20 20 20 20 57 48 45 52 45  .    "     WHERE
f6f0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22   type='table'\n"
f700: 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44  .    "       AND
f710: 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74   name<>'selftest
f720: 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  '\n".    "      
f730: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f   AND coalesce(ro
f740: 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20  otpage,0)>0\n". 
f750: 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22     "  )\n".    "
f760: 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c   ORDER BY name;\
f770: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
f780: 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  NTO [_shell$self
f790: 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55  ]\n".    "  VALU
f7a0: 45 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41  ES('run','PRAGMA
f7b0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
f7c0: 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20  ','ok');\n".    
f7d0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c  "INSERT INTO sel
f7e0: 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64  ftest(tno,op,cmd
f7f0: 2c 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45  ,ans)".    "  SE
f800: 4c 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70  LECT rowid*10,op
f810: 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f  ,cmd,ans FROM [_
f820: 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a  shell$self];\n".
f830: 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
f840: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a  [_shell$self];".
f850: 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73      ,0,0,&zErrMs
f860: 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73  g);.  if( zErrMs
f870: 67 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  g ){.    utf8_pr
f880: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 45  intf(stderr, "SE
f890: 4c 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a  LFTEST initializ
f8a0: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25  ation failure: %
f8b0: 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
f8c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f8d0: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  (zErrMsg);.  }. 
f8e0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
f8f0: 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65  >db, "RELEASE se
f900: 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30  lftest_init",0,0
f910: 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  ,0);.}.../*.** S
f920: 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  et the destinati
f930: 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f  on table field o
f940: 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65  f the ShellState
f950: 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a   structure to.**
f960: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f970: 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45   table given.  E
f980: 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20  scape any quote 
f990: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
f9a0: 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e  e.** table name.
f9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f9c0: 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53  set_table_name(S
f9d0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
f9e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
f9f0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
fa00: 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63  char cQuote;.  c
fa10: 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70  har *z;..  if( p
fa20: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a  ->zDestTable ){.
fa30: 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73      free(p->zDes
fa40: 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e  tTable);.    p->
fa50: 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a  zDestTable = 0;.
fa60: 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d    }.  if( zName=
fa70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63  =0 ) return;.  c
fa80: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
fa90: 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  r(zName);.  n = 
faa0: 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  strlen30(zName);
fab0: 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20  .  if( cQuote ) 
fac0: 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20  n += n+2;.  z = 
fad0: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
fae0: 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20  malloc( n+1 );. 
faf0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c   if( z==0 ) shel
fb00: 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
fb10: 29 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66  );.  n = 0;.  if
fb20: 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  ( cQuote ) z[n++
fb30: 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f  ] = cQuote;.  fo
fb40: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
fb50: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b   i++){.    z[n++
fb60: 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20  ] = zName[i];.  
fb70: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d    if( zName[i]==
fb80: 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
fb90: 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20  = cQuote;.  }.  
fba0: 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e  if( cQuote ) z[n
fbb0: 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20  ++] = cQuote;.  
fbc0: 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  z[n] = 0;.}.../*
fbd0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75  .** Execute a qu
fbe0: 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ery statement th
fbf0: 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  at will generate
fc00: 20 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72   SQL output.  Pr
fc10: 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  int.** the resul
fc20: 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61  t columns, comma
fc30: 2d 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61  -separated, on a
fc40: 20 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61   line and then a
fc50: 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f  dd a.** semicolo
fc60: 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20  n terminator to 
fc70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
fc80: 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  line..**.** If t
fc90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
fca0: 75 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68  umns is 1 and th
fcb0: 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  at column contai
fcc0: 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20  ns text "--".** 
fcd0: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 73  then write the s
fce0: 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65  emicolon on a se
fcf0: 70 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68  parate line.  Th
fd00: 61 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20  at way, if a.** 
fd10: 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63  "--" comment occ
fd20: 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  urs at the end o
fd30: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  f the statement,
fd40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20   the comment.** 
fd50: 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68  won't consume th
fd60: 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d  e semicolon term
fd70: 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  inator..*/.stati
fd80: 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f  c int run_table_
fd90: 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68  dump_query(.  Sh
fda0: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20  ellState *p,    
fdb0: 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
fdc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
fdd0: 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74  st char *zSelect
fde0: 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  ,     /* SELECT 
fdf0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74  statement to ext
fe00: 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ract content */.
fe10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
fe20: 69 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72  irstRow    /* Pr
fe30: 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74  int before first
fe40: 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c   row, if not NUL
fe50: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
fe60: 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b  3_stmt *pSelect;
fe70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
fe80: 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20   nResult;.  int 
fe90: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
fea0: 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  *z;.  rc = sqlit
feb0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
fec0: 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31  >db, zSelect, -1
fed0: 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  , &pSelect, 0);.
fee0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fef0: 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  _OK || !pSelect 
ff00: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
ff10: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
ff20: 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73  * ERROR: (%d) %s
ff30: 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a   *****/\n", rc,.
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
ff60: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20  ->db));.    if( 
ff70: 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54  (rc&0xff)!=SQLIT
ff80: 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e  E_CORRUPT ) p->n
ff90: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
ffa0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  n rc;.  }.  rc =
ffb0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
ffc0: 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c  elect);.  nResul
ffd0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
ffe0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74  mn_count(pSelect
fff0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
10000 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
10010 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20    if( zFirstRow 
10020 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
10030 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
10040 22 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20  ", zFirstRow);. 
10050 20 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d       zFirstRow =
10060 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20   0;.    }.    z 
10070 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
10080 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
10090 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  xt(pSelect, 0);.
100a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
100b0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
100c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
100d0 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
100e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
100f0 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c  f(p->out, ",%s",
10100 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10110 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29  text(pSelect, i)
10120 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10130 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
10140 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20      while( z[0] 
10150 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c  && (z[0]!='-' ||
10160 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b   z[1]!='-') ) z+
10170 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20  +;.    if( z[0] 
10180 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
10190 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b  ntf(p->out, "\n;
101a0 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  \n");.    }else{
101b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
101c0 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29  f(p->out, ";\n")
101d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
101e0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
101f0 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63  elect);.  }.  rc
10200 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
10210 69 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ize(pSelect);.  
10220 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10230 4b 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  K ){.    utf8_pr
10240 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
10250 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20  *** ERROR: (%d) 
10260 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63  %s *****/\n", rc
10270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10280 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
10290 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66  (p->db));.    if
102a0 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c  ( (rc&0xff)!=SQL
102b0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d  ITE_CORRUPT ) p-
102c0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
102d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
102e0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
102f0 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63  e and save off c
10300 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72  urrent error str
10310 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
10320 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73  har *save_err_ms
10330 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  g(.  sqlite3 *db
10340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
10350 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
10360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
10370 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33  rMsg = 1+strlen3
10380 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  0(sqlite3_errmsg
10390 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a  (db));.  char *z
103a0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
103b0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73  _malloc64(nErrMs
103c0 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73  g);.  if( zErrMs
103d0 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  g ){.    memcpy(
103e0 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33  zErrMsg, sqlite3
103f0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72  _errmsg(db), nEr
10400 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rMsg);.  }.  ret
10410 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a  urn zErrMsg;.}..
10420 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
10430 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
10440 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74  o display I/O st
10450 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69  ats on Linux usi
10460 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a  ng /proc/PID/io.
10470 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
10480 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61  isplayLinuxIoSta
10490 74 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20  ts(FILE *out){. 
104a0 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61   FILE *in;.  cha
104b0 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69  r z[200];.  sqli
104c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
104d0 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f  eof(z), z, "/pro
104e0 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64  c/%d/io", getpid
104f0 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65  ());.  in = fope
10500 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  n(z, "rb");.  if
10510 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
10520 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
10530 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69  (z, sizeof(z), i
10540 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)!=0 ){.    sta
10550 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
10560 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
10570 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20  har *zPattern;. 
10580 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10590 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54  *zDesc;.    } aT
105a0 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rans[] = {.     
105b0 20 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20   { "rchar: ",   
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
105d0 42 79 74 65 73 20 72 65 63 65 69 76 65 64 20 62  Bytes received b
105e0 79 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20  y read():" },.  
105f0 20 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c      { "wchar: ",
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f    "Bytes sent to
10620 20 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c   write():"    },
10630 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a  .      { "syscr:
10640 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
10650 20 20 20 20 20 22 52 65 61 64 28 29 20 73 79 73       "Read() sys
10660 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20  tem calls:"     
10670 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73   },.      { "sys
10680 63 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  cw: ",          
10690 20 20 20 20 20 20 20 20 22 57 72 69 74 65 28 29          "Write()
106a0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20   system calls:" 
106b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
106c0 72 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20  read_bytes: ",  
106d0 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
106e0 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72  s read from stor
106f0 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20  age:"  },.      
10700 7b 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20  { "write_bytes: 
10710 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ",            "B
10720 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ytes written to 
10730 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20  storage:" },.   
10740 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f     { "cancelled_
10750 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
10760 20 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74   "Cancelled writ
10770 65 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a  e bytes:"    },.
10780 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
10790 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
107a0 3c 41 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e  <ArraySize(aTran
107b0 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  s); i++){.      
107c0 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
107d0 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74  (aTrans[i].zPatt
107e0 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ern);.      if( 
107f0 73 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69  strncmp(aTrans[i
10800 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e  ].zPattern, z, n
10810 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10820 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
10830 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72   "%-36s %s", aTr
10840 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a  ans[i].zDesc, &z
10850 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [n]);.        br
10860 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10870 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28   }.  }.  fclose(
10880 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  in);.}.#endif../
10890 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73  *.** Display a s
108a0 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74  ingle line of st
108b0 61 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69  atus using 64-bi
108c0 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  t values..*/.sta
108d0 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
108e0 53 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c  StatLine(.  Shel
108f0 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20  lState *p,      
10900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65        /* The she
10910 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
10920 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20  char *zLabel,   
10930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
10940 65 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20  el for this one 
10950 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  line */.  char *
10960 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20  zFormat,        
10970 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f      /* Format fo
10980 72 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  r the result */.
10990 20 20 69 6e 74 20 69 53 74 61 74 75 73 43 74 72    int iStatusCtr
109a0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
109b0 68 69 63 68 20 73 74 61 74 75 73 20 74 6f 20 64  hich status to d
109c0 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20  isplay */.  int 
109d0 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
109e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
109f0 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73   reset the stats
10a00 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
10a10 5f 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31  _int64 iCur = -1
10a20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
10a30 34 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20  4 iHiwtr = -1;. 
10a40 20 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74   int i, nPercent
10a50 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32  ;.  char zLine[2
10a60 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
10a70 74 61 74 75 73 36 34 28 69 53 74 61 74 75 73 43  tatus64(iStatusC
10a80 74 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69  trl, &iCur, &iHi
10a90 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
10aa0 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e  for(i=0, nPercen
10ab0 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b  t=0; zFormat[i];
10ac0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
10ad0 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29  Format[i]=='%' )
10ae0 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d   nPercent++;.  }
10af0 0a 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e  .  if( nPercent>
10b00 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
10b10 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10b20 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20  (zLine), zLine, 
10b30 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69  zFormat, iCur, i
10b40 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Hiwtr);.  }else{
10b50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
10b60 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
10b70 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72  ne), zLine, zFor
10b80 6d 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  mat, iHiwtr);.  
10b90 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  }.  raw_printf(p
10ba0 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  ->out, "%-36s %s
10bb0 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69  \n", zLabel, zLi
10bc0 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  ne);.}../*.** Di
10bd0 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61  splay memory sta
10be0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
10bf0 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28  t display_stats(
10c00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c20 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75  * Database to qu
10c30 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74  ery */.  ShellSt
10c40 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
10c50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
10c60 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f  to ShellState */
10c70 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20  .  int bReset   
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c90 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
10ca0 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a  the stats */.){.
10cb0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
10cc0 74 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c 45  t iHiwtr;.  FILE
10cd0 20 2a 6f 75 74 3b 0a 20 20 69 66 28 20 70 41 72   *out;.  if( pAr
10ce0 67 3d 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75  g==0 || pArg->ou
10cf0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
10d00 0a 20 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f  .  out = pArg->o
10d10 75 74 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 2d  ut;..  if( pArg-
10d20 3e 70 53 74 6d 74 20 26 26 20 28 70 41 72 67 2d  >pStmt && (pArg-
10d30 3e 73 74 61 74 73 4f 6e 20 26 20 32 29 20 29 7b  >statsOn & 2) ){
10d40 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  .    int nCol, i
10d50 2c 20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  , x;.    sqlite3
10d60 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
10d70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
10d80 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20  char z[100];.   
10d90 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
10da0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
10db0 6d 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  mt);.    raw_pri
10dc0 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10dd0 25 64 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f  %d\n", "Number o
10de0 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
10df0 3a 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66  :", nCol);.    f
10e00 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
10e10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
10e20 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
10e30 65 6f 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e  eof(z),z,"Column
10e40 20 25 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c   %d %nname:", i,
10e50 20 26 78 29 3b 0a 20 20 20 20 20 20 75 74 66 38   &x);.      utf8
10e60 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
10e70 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
10e80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
10e90 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66  e(pStmt,i));.#if
10ea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10eb0 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 20  _DECLTYPE.      
10ec0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
10ed0 28 33 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61  (30, z+x, "decla
10ee0 72 65 64 20 74 79 70 65 3a 22 29 3b 0a 20 20 20  red type:");.   
10ef0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
10f00 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
10f10 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
10f20 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28 70 53 74  umn_decltype(pSt
10f30 6d 74 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a  mt, i));.#endif.
10f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10f50 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
10f60 44 41 54 41 0a 20 20 20 20 20 20 73 71 6c 69 74  DATA.      sqlit
10f70 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
10f80 7a 2b 78 2c 20 22 64 61 74 61 62 61 73 65 20 6e  z+x, "database n
10f90 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74  ame:");.      ut
10fa0 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
10fb0 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20  %-36s %s\n", z, 
10fc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
10fd0 61 74 61 62 61 73 65 5f 6e 61 6d 65 28 70 53 74  atabase_name(pSt
10fe0 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71  mt,i));.      sq
10ff0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
11000 30 2c 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e  0, z+x, "table n
11010 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74  ame:");.      ut
11020 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
11030 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20  %-36s %s\n", z, 
11040 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
11050 61 62 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  able_name(pStmt,
11060 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i));.      sqlit
11070 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11080 7a 2b 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d  z+x, "origin nam
11090 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  e:");.      utf8
110a0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
110b0 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
110c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
110d0 67 69 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  gin_name(pStmt,i
110e0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ));.#endif.    }
110f0 0a 20 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53  .  }..  displayS
11100 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d  tatLine(pArg, "M
11110 65 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20  emory 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 62 79 74 65 73 22 2c 20 53 51 4c 49  ld) bytes", SQLI
11140 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
11150 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a  _USED, bReset);.
11160 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11170 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
11180 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41  of Outstanding A
11190 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20  llocations:",.  
111a0 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
111b0 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ld)", SQLITE_STA
111c0 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54  TUS_MALLOC_COUNT
111d0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 69 66 28  , bReset);.  if(
111e0 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73   pArg->shellFlgs
111f0 20 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63   & SHFLG_Pagecac
11200 68 65 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61  he ){.    displa
11210 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11220 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
11230 65 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a  e Pages Used:",.
11240 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61         "%lld (ma
11250 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20  x %lld) pages", 
11260 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
11270 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52  GECACHE_USED, bR
11280 65 73 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73  eset);.  }.  dis
11290 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
112a0 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63  g, "Number of Pc
112b0 61 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79  ache Overflow By
112c0 74 65 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  tes:",.     "%ll
112d0 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74  d (max %lld) byt
112e0 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
112f0 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45  US_PAGECACHE_OVE
11300 52 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a  RFLOW, bReset);.
11310 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11320 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74  e(pArg, "Largest
11330 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20   Allocation:",. 
11340 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22      "%lld bytes"
11350 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11360 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65  MALLOC_SIZE, bRe
11370 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53  set);.  displayS
11380 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c  tatLine(pArg, "L
11390 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c  argest Pcache Al
113a0 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
113b0 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
113c0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
113d0 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65  ECACHE_SIZE, bRe
113e0 73 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54  set);.#ifdef YYT
113f0 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54  RACKMAXSTACKDEPT
11400 48 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  H.  displayStatL
11410 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65  ine(pArg, "Deepe
11420 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a  st Parser Stack:
11430 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11440 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54  ax %lld)", SQLIT
11450 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f  E_STATUS_PARSER_
11460 53 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a  STACK, bReset);.
11470 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64 62  #endif..  if( db
11480 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 67   ){.    if( pArg
11490 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48  ->shellFlgs & SH
114a0 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b  FLG_Lookaside ){
114b0 0a 20 20 20 20 20 20 69 48 69 77 74 72 20 3d 20  .      iHiwtr = 
114c0 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iCur = -1;.     
114d0 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
114e0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
114f0 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
11500 5f 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20 20  _USED,.         
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
11520 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
11530 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
11540 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11550 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
11560 20 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f    "Lookaside Slo
11570 74 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20  ts Used:        
11580 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20          %d (max 
11590 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %d)\n",.        
115a0 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77        iCur, iHiw
115b0 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
115c0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
115d0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
115e0 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a  _LOOKASIDE_HIT,.
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
11610 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
11620 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
11630 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75  f(pArg->out, "Su
11640 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69  ccessful lookasi
11650 64 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20  de attempts:    
11660 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
11670 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
11680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
11690 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
116a0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
116b0 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45  KASIDE_MISS_SIZE
116c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
116d0 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
116e0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
116f0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
11700 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
11710 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72  Lookaside failur
11720 65 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20  es due to size: 
11730 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20       %d\n",.    
11740 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72            iHiwtr
11750 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11760 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11770 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
11780 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55  OOKASIDE_MISS_FU
11790 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
117a0 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
117b0 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
117c0 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
117d0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
117e0 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c   "Lookaside fail
117f0 75 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a  ures due to OOM:
11800 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20         %d\n",.  
11810 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77              iHiw
11820 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  tr);.    }.    i
11830 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11840 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11850 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11860 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
11870 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  HE_USED, &iCur, 
11880 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
11890 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
118a0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
118b0 65 72 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  er Heap Usage:  
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
118e0 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29             iCur)
118f0 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
11900 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
11910 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11920 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11930 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26  TUS_CACHE_HIT, &
11940 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
11950 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11960 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
11970 67 65 20 63 61 63 68 65 20 68 69 74 73 3a 20 20  ge cache hits:  
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
119a0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
119b0 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
119c0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
119d0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
119e0 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26  US_CACHE_MISS, &
119f0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
11a00 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11a10 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
11a20 67 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a  ge cache misses:
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
11a50 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
11a60 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
11a70 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
11a80 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
11a90 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20  US_CACHE_WRITE, 
11aa0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11ab0 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
11ac0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
11ad0 61 67 65 20 63 61 63 68 65 20 77 72 69 74 65 73  age cache writes
11ae0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11af0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
11b00 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
11b10 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
11b20 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11b30 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11b40 54 55 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c  TUS_CACHE_SPILL,
11b50 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11b60 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69   1);.    raw_pri
11b70 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
11b80 50 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c  Page cache spill
11b90 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
11ba0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
11bb0 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
11bc0 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
11bd0 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11be0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11bf0 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44  ATUS_SCHEMA_USED
11c00 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11c10 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
11c20 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11c30 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48 65 61  out, "Schema Hea
11c40 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
11c50 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79             %d by
11c60 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
11c70 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69      iCur);.    i
11c80 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11c90 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11ca0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11cb0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d  ITE_DBSTATUS_STM
11cc0 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  T_USED, &iCur, &
11cd0 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
11ce0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
11cf0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74  pArg->out, "Stat
11d00 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61  ement Heap/Looka
11d10 73 69 64 65 20 55 73 61 67 65 3a 20 20 20 20 20  side Usage:     
11d20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
11d30 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
11d40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67  .  }..  if( pArg
11d50 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ->pStmt ){.    i
11d60 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
11d70 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
11d80 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
11d90 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
11da0 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20  N_STEP,.        
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 20 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a         bReset);.
11dd0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11de0 41 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73  Arg->out, "Fulls
11df0 63 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20  can Steps:      
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
11e20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
11e30 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
11e40 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
11e50 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
11e60 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
11e70 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11e80 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61  out, "Sort Opera
11e90 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20  tions:          
11ea0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11eb0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
11ec0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
11ed0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
11ee0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
11ef0 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
11f00 2c 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61  ,bReset);.    ra
11f10 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11f20 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49  ut, "Autoindex I
11f30 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20  nserts:         
11f40 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
11f50 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
11f60 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
11f70 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
11f80 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
11f90 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62  TATUS_VM_STEP, b
11fa0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
11fb0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
11fc0 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69  , "Virtual Machi
11fd0 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  ne Steps:       
11fe0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
11ff0 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12000 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12010 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12020 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12030 54 55 53 5f 52 45 50 52 45 50 41 52 45 2c 20 62  TUS_REPREPARE, b
12040 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12050 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12060 2c 20 22 52 65 70 72 65 70 61 72 65 20 6f 70 65  , "Reprepare ope
12070 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20  rations:        
12080 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12090 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
120a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
120b0 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
120c0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
120d0 54 55 53 5f 52 55 4e 2c 20 62 52 65 73 65 74 29  TUS_RUN, bReset)
120e0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
120f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d  (pArg->out, "Num
12100 62 65 72 20 6f 66 20 74 69 6d 65 73 20 72 75 6e  ber of times run
12110 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12120 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12130 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
12140 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
12150 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
12160 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45  TE_STMTSTATUS_ME
12170 4d 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a  MUSED, bReset);.
12180 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12190 41 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72  Arg->out, "Memor
121a0 79 20 75 73 65 64 20 62 79 20 70 72 65 70 61 72  y used by prepar
121b0 65 64 20 73 74 6d 74 3a 20 20 20 20 20 20 20 20  ed stmt:        
121c0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
121d0 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75  }..#ifdef __linu
121e0 78 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e  x__.  displayLin
121f0 75 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e  uxIoStats(pArg->
12200 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  out);.#endif..  
12210 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65  /* Do not remove
12220 20 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65   this machine re
12230 61 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20  adable comment: 
12240 65 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70  extra-stats-outp
12250 75 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65  ut-here */..  re
12260 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
12270 20 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74   Display scan st
12280 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ats..*/.static v
12290 6f 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e  oid display_scan
122a0 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33  stats(.  sqlite3
122b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
122c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
122d0 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
122e0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
122f0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
12300 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
12310 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29   ShellState */.)
12320 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
12330 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
12340 4e 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44  NSTATUS.  UNUSED
12350 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
12360 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12370 45 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a  ER(pArg);.#else.
12380 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d    int i, k, n, m
12390 78 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  x;.  raw_printf(
123a0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
123b0 2d 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d  ---- scanstats -
123c0 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d  -------\n");.  m
123d0 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30  x = 0;.  for(k=0
123e0 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20  ; k<=mx; k++){. 
123f0 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f     double rEstLo
12400 6f 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f  op = 1.0;.    fo
12410 72 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29  r(i=n=0; 1; i++)
12420 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
12430 73 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e  stmt *p = pArg->
12440 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  pStmt;.      sql
12450 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70  ite3_int64 nLoop
12460 2c 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20  , nVisit;.      
12470 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20  double rEst;.   
12480 20 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20     int iSid;.   
12490 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
124a0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69  Explain;.      i
124b0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
124c0 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
124d0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
124e0 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26  _NLOOP, (void*)&
124f0 6e 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  nLoop) ){.      
12500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12520 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
12530 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
12540 53 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28  STAT_SELECTID, (
12550 76 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20  void*)&iSid);.  
12560 20 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20      if( iSid>mx 
12570 29 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20  ) mx = iSid;.   
12580 20 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29     if( iSid!=k )
12590 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
125a0 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
125b0 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20       rEstLoop = 
125c0 28 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20  (double)nLoop;. 
125d0 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29         if( k>0 )
125e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
125f0 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
12600 20 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d   subquery %d ---
12610 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20  ----\n", k);.   
12620 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a     }.      n++;.
12630 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12640 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
12650 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
12660 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69  TAT_NVISIT, (voi
12670 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20  d*)&nVisit);.   
12680 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
12690 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
126a0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
126b0 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45  _EST, (void*)&rE
126c0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
126d0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
126e0 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
126f0 53 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e  SCANSTAT_EXPLAIN
12700 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61  , (void*)&zExpla
12710 69 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  in);.      utf8_
12720 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12730 2c 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c  , "Loop %2d: %s\
12740 6e 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29  n", n, zExplain)
12750 3b 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70  ;.      rEstLoop
12760 20 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20   *= rEst;.      
12770 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12780 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  >out,.          
12790 22 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d  "         nLoop=
127a0 25 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c  %-8lld nRow=%-8l
127b0 6c 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64  ld estRow=%-8lld
127c0 20 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38   estRow/Loop=%-8
127d0 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
127e0 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28  nLoop, nVisit, (
127f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72  sqlite3_int64)(r
12800 45 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45  EstLoop+0.5), rE
12810 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
12820 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  }.  }.  raw_prin
12830 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d  tf(pArg->out, "-
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a  ----------\n");.
12860 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12870 50 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61  Parameter azArra
12880 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65  y points to a ze
12890 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72  ro-terminated ar
128a0 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20  ray of strings. 
128b0 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  zStr.** points t
128c0 6f 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74  o a single nul-t
128d0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
128e0 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
128f0 6f 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20  o if zStr.** is 
12900 65 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67  equal, according
12910 20 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f   to strcmp(), to
12920 20 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69   any of the stri
12930 6e 67 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  ngs in the array
12940 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
12950 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a  return zero..*/.
12960 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69  static int str_i
12970 6e 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68  n_array(const ch
12980 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
12990 63 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b  char **azArray){
129a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
129b0 69 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b  i=0; azArray[i];
129c0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
129d0 3d 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61  ==strcmp(zStr, a
129e0 7a 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74  zArray[i]) ) ret
129f0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
12a00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12a10 49 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  If compiled stat
12a20 65 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61  ement pSql appea
12a30 72 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c  rs to be an EXPL
12a40 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61  AIN statement, a
12a50 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70  llocate.** and p
12a60 6f 70 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c  opulate the Shel
12a70 6c 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b  lState.aiIndent[
12a80 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  ] array with the
12a90 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70   number of.** sp
12aa0 61 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65  aces each opcode
12ab0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
12ac0 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ted before it is
12ad0 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54   output..**.** T
12ae0 68 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c  he indenting rul
12af0 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
12b00 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65    * For each "Ne
12b10 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e  xt", "Prev", "VN
12b20 65 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20  ext" or "VPrev" 
12b30 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64  instruction, ind
12b40 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c  ent.**       all
12b50 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63   opcodes that oc
12b60 63 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20  cur between the 
12b70 70 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  p2 jump destinat
12b80 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  ion and the opco
12b90 64 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65  de.**       itse
12ba0 6c 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a  lf by 2 spaces..
12bb0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20  **.**     * For 
12bc0 65 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20  each "Goto", if 
12bd0 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  the jump destina
12be0 74 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20  tion is earlier 
12bf0 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a  in the program.*
12c00 2a 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73  *       and ends
12c10 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20   on one of:.**  
12c20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53          Yield  S
12c30 65 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52  eekGt  SeekLt  R
12c40 6f 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e  owSetRead  Rewin
12c50 64 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66  d.**       or if
12c60 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65   the P1 paramete
12c70 72 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64  r is one instead
12c80 20 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20   of zero,.**    
12c90 20 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61     then indent a
12ca0 6c 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65  ll opcodes betwe
12cb0 65 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69  en the earlier i
12cc0 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20  nstruction.**   
12cd0 20 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62      and "Goto" b
12ce0 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73  y 2 spaces..*/.s
12cf0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
12d00 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
12d10 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73  ShellState *p, s
12d20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
12d30 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l){.  const char
12d40 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
12d50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
12d60 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
12d70 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
12d80 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20  t char *z;      
12d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
12da0 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
12db0 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
12dc0 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59  IN */.  int *abY
12dd0 69 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ield = 0;       
12de0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12df0 69 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59  if op is an OP_Y
12e00 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ield */.  int nA
12e10 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20  lloc = 0;       
12e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
12e30 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70  ocated size of p
12e40 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62  ->aiIndent[], ab
12e50 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69  Yield */.  int i
12e60 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Op;             
12e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12e80 64 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  dex of operation
12e90 20 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   in p->aiIndent[
12ea0 5d 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68  ] */..  const ch
12eb0 61 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b  ar *azNext[] = {
12ec0 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c   "Next", "Prev",
12ed0 20 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74   "VPrev", "VNext
12ee0 22 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c  ", "SorterNext",
12ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f00 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 65 78              "Nex
12f10 74 49 66 4f 70 65 6e 22 2c 20 22 50 72 65 76 49  tIfOpen", "PrevI
12f20 66 4f 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63  fOpen", 0 };.  c
12f30 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65  onst char *azYie
12f40 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22  ld[] = { "Yield"
12f50 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65  , "SeekLT", "See
12f60 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61  kGT", "RowSetRea
12f70 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f90 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20  "Rewind", 0 };. 
12fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47   const char *azG
12fb0 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22  oto[] = { "Goto"
12fc0 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79  , 0 };..  /* Try
12fd0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69   to figure out i
12fe0 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79  f this is really
12ff0 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
13000 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20  ement. If this. 
13010 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65   ** cannot be ve
13020 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65  rified, return e
13030 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20  arly.  */.  if( 
13040 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
13050 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b  ount(pSql)!=8 ){
13060 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
13070 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74  p->mode;.    ret
13080 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20  urn;.  }.  zSql 
13090 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
130a0 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ql);.  if( zSql=
130b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
130c0 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27  or(z=zSql; *z=='
130d0 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c   ' || *z=='\t' |
130e0 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a  | *z=='\n' || *z
130f0 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\f' || *z=='\
13100 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20  r'; z++);.  if( 
13110 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
13120 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37  (z, "explain", 7
13130 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64  ) ){.    p->cMod
13140 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
13150 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
13160 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54  for(iOp=0; SQLIT
13170 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
13180 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b  tep(pSql); iOp++
13190 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
131a0 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
131b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
131c0 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63  (pSql, 0);.    c
131d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
131e0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
131f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
13200 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20  t(pSql, 1);..   
13210 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68   /* Set p2 to th
13220 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68  e P2 field of th
13230 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65  e current opcode
13240 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67  . Then, assuming
13250 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20   that.    ** p2 
13260 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  is an instructio
13270 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20 76  n address, set v
13280 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20  ariable p2op to 
13290 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
132a0 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63  t.    ** instruc
132b0 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e  tion in the aiIn
132c0 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32  dent[] array. p2
132d0 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65   and p2op may be
132e0 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20   different if.  
132f0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
13300 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
13310 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72  part of a sub-pr
13320 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20  ogram generated 
13330 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  by an.    ** SQL
13340 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
13350 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20  ign key.  */.   
13360 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65   int p2 = sqlite
13370 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
13380 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70  l, 3);.    int p
13390 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70  2op = (p2 + (iOp
133a0 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f  -iAddr));..    /
133b0 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69  * Grow the p->ai
133c0 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73 20  Indent array as 
133d0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
133e0 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20  if( iOp>=nAlloc 
133f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70  ){.      if( iOp
13400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
13410 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65 72  * Do further ver
13420 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68  fication that th
13430 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75  is is explain ou
13440 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a  tput.  Abort if.
13450 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73          ** it is
13460 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20   not */.        
13470 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
13480 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d  r *explainCols[]
13490 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
134a0 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22  "addr", "opcode"
134b0 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70  , "p1", "p2", "p
134c0 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20  3", "p4", "p5", 
134d0 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20  "comment" };.   
134e0 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
134f0 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a       for(jj=0; j
13500 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c  j<ArraySize(expl
13510 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b  ainCols); jj++){
13520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
13530 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f  trcmp(sqlite3_co
13540 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a  lumn_name(pSql,j
13550 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a  j),explainCols[j
13560 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
13570 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d        p->cMode =
13580 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
13590 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
135a0 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20  set(pSql);.     
135b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
135c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
135d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
135e0 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30     nAlloc += 100
135f0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64  ;.      p->aiInd
13600 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  ent = (int*)sqli
13610 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
13620 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f  >aiIndent, nAllo
13630 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
13640 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20        abYield = 
13650 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
13660 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c  alloc64(abYield,
13670 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
13680 6e 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt));.    }.    
13690 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73  abYield[iOp] = s
136a0 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
136b0 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70   azYield);.    p
136c0 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20  ->aiIndent[iOp] 
136d0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64  = 0;.    p->nInd
136e0 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20  ent = iOp+1;..  
136f0 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
13700 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20  ay(zOp, azNext) 
13710 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
13720 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
13730 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
13740 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  += 2;.    }.    
13750 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
13760 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26  (zOp, azGoto) &&
13770 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74   p2op<p->nIndent
13780 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c  .     && (abYiel
13790 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74  d[p2op] || sqlit
137a0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
137b0 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20  ql, 2)).    ){. 
137c0 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b       for(i=p2op;
137d0 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e   i<iOp; i++) p->
137e0 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32  aiIndent[i] += 2
137f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
13800 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->iIndent = 0;. 
13810 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62   sqlite3_free(ab
13820 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65  Yield);.  sqlite
13830 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d  3_reset(pSql);.}
13840 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
13850 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64   array allocated
13860 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61   by explain_data
13870 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73  _prepare()..*/.s
13880 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
13890 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53  in_data_delete(S
138a0 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
138b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
138c0 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d  >aiIndent);.  p-
138d0 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  >aiIndent = 0;. 
138e0 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b   p->nIndent = 0;
138f0 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20  .  p->iIndent = 
13900 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  0;.}../*.** Disa
13910 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20  ble and restore 
13920 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64 20  .wheretrace and 
13930 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65 74  .selecttrace set
13940 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  tings..*/.#if de
13950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
13960 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
13970 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
13980 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ECTTRACE).extern
13990 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65   int sqlite3Sele
139a0 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20  ctTrace;.static 
139b0 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74 54  int savedSelectT
139c0 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
139d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
139e0 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
139f0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
13a00 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74 65  WHERETRACE).exte
13a10 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
13a20 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ereTrace;.static
13a30 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65 54   int savedWhereT
13a40 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61  race;.#endif.sta
13a50 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
13a60 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
13a70 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
13a80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
13a90 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
13aa0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
13ab0 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76 65  ECTTRACE).  save
13ac0 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73  dSelectTrace = s
13ad0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
13ae0 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  e;.  sqlite3Sele
13af0 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  ctTrace = 0;.#en
13b00 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
13b10 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
13b20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13b30 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43  ENABLE_WHERETRAC
13b40 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65 54  E).  savedWhereT
13b50 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68  race = sqlite3Wh
13b60 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69  ereTrace;.  sqli
13b70 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
13b80 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74  0;.#endif.}.stat
13b90 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f  ic void restore_
13ba0 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
13bb0 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  s(void){.#if def
13bc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
13bd0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
13be0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
13bf0 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  CTTRACE).  sqlit
13c00 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
13c10 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
13c20 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
13c30 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
13c40 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
13c50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
13c60 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65  ETRACE).  sqlite
13c70 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 61  3WhereTrace = sa
13c80 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23  vedWhereTrace;.#
13c90 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
13ca0 75 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74  un a prepared st
13cb0 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  atement.*/.stati
13cc0 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70  c void exec_prep
13cd0 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65  ared_stmt(.  She
13ce0 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20  llState *pArg,  
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d10 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
13d20 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69  lState */.  sqli
13d30 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d60 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20  Statment to run 
13d70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
13d80 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74 68  .  /* perform th
13d90 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20 74  e first step.  t
13da0 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75 73  his will tell us
13db0 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76 65   if we.  ** have
13dc0 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72   a result set or
13dd0 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64   not and how wid
13de0 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20 20  e it is..  */.  
13df0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
13e00 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 69  p(pStmt);.  /* i
13e10 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73 75  f we have a resu
13e20 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69  lt set... */.  i
13e30 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
13e40 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c   rc ){.    /* al
13e50 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
13e60 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76   col name ptr, v
13e70 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79  alue ptr, and ty
13e80 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  pe */.    int nC
13e90 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
13ea0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
13eb0 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  ;.    void *pDat
13ec0 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  a = sqlite3_mall
13ed0 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65  oc64(3*nCol*size
13ee0 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20  of(const char*) 
13ef0 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70  + 1);.    if( !p
13f00 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63  Data ){.      rc
13f10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13f30 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20    char **azCols 
13f40 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61  = (char **)pData
13f50 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20  ;      /* Names 
13f60 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
13f70 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  s */.      char 
13f80 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f  **azVals = &azCo
13f90 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20  ls[nCol];       
13fa0 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20  /* Results */.  
13fb0 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65 73      int *aiTypes
13fc0 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c   = (int *)&azVal
13fd0 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75  s[nCol]; /* Resu
13fe0 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20  lt types */.    
13ff0 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20    int i, x;.    
14000 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
14010 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63  int) <= sizeof(c
14020 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 2f  har *));.      /
14030 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73 20  * save off ptrs 
14040 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  to column names 
14050 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
14060 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
14070 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69          azCols[i
14080 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  ] = (char *)sqli
14090 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
140a0 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
140b0 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20   }.      do{.   
140c0 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20       /* extract 
140d0 74 68 65 20 64 61 74 61 20 61 6e 64 20 64 61 74  the data and dat
140e0 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20  a types */.     
140f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14100 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
14110 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d      aiTypes[i] =
14120 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   x = sqlite3_col
14130 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
14140 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i);.          if
14150 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ( x==SQLITE_BLOB
14160 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72 67   && pArg && pArg
14170 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e  ->cMode==MODE_In
14180 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sert ){.        
14190 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20      azVals[i] = 
141a0 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  "";.          }e
141b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
141c0 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68   azVals[i] = (ch
141d0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
141e0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
14200 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 7a           if( !az
14210 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79  Vals[i] && (aiTy
14220 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e  pes[i]!=SQLITE_N
14230 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ULL) ){.        
14240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14250 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
14260 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f     break; /* fro
14270 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  m for */.       
14280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f     }.        } /
14290 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20 20  * end for */..  
142a0 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61        /* if data
142b0 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72 61   and types extra
142c0 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  cted successfull
142d0 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  y... */.        
142e0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  if( SQLITE_ROW =
142f0 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  = rc ){.        
14300 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75    /* call the su
14310 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20  pplied callback 
14320 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  with the result 
14330 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  row data */.    
14340 20 20 20 20 20 20 69 66 28 20 73 68 65 6c 6c 5f        if( shell_
14350 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  callback(pArg, n
14360 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43  Col, azVals, azC
14370 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b  ols, aiTypes) ){
14380 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
14390 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  = SQLITE_ABORT;.
143a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
143b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
143c0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
143d0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
143e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
143f0 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c 49     } while( SQLI
14400 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a  TE_ROW == rc );.
14410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14420 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  ee(pData);.    }
14430 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
14440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14450 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
14460 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14470 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
14480 73 20 53 51 4c 20 69 66 20 74 68 65 20 70 72 65  s SQL if the pre
14490 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d  vious shell comm
144a0 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70  and.** was ".exp
144b0 65 72 74 22 2e 20 49 74 20 70 61 73 73 65 73 20  ert". It passes 
144c0 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65 20 73  the SQL in the s
144d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64  econd argument d
144e0 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68  irectly to.** th
144f0 65 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20  e sqlite3expert 
14500 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  object..**.** If
14510 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
14520 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14530 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
14540 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
14550 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  * code. In this 
14560 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d  case, (*pzErr) m
14570 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
14580 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
14590 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20  ontaining.** an 
145a0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
145b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
145c0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
145d0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
145e0 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
145f0 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69  ntually free thi
14600 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
14610 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
14620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
14630 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20  ertHandleSQL(.  
14640 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
14650 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  te, .  const cha
14660 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72  r *zSql, .  char
14670 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73   **pzErr.){.  as
14680 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
14690 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 3b 0a  pert.pExpert );.
146a0 20 20 61 73 73 65 72 74 28 20 70 7a 45 72 72 3d    assert( pzErr=
146b0 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20  =0 || *pzErr==0 
146c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
146d0 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 70  te3_expert_sql(p
146e0 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
146f0 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45  xpert, zSql, pzE
14700 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rr);.}../*.** Th
14710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14720 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74 6f 20  alled either to 
14730 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75  silently clean u
14740 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  p the object.** 
14750 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 22  created by the "
14760 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64  .expert" command
14770 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29   (if bCancel==1)
14780 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61 74 65  , or to generate
14790 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72   a .** report fr
147a0 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e 20 63  om it and then c
147b0 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66 20 62  lean it up (if b
147c0 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a  Cancel==0)..**.*
147d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
147e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
147f0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
14800 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
14810 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
14820 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
14830 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
14840 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14850 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
14860 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
14870 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
14880 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
14890 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
148a0 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
148b0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
148c0 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
148d0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
148e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
148f0 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 0a 20   expertFinish(. 
14900 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
14910 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63  ate,.  int bCanc
14920 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  el,.  char **pzE
14930 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rr.){.  int rc =
14940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
14950 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 20 3d  lite3expert *p =
14960 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
14970 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73 65 72  pExpert;.  asser
14980 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
14990 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45  ( bCancel || pzE
149a0 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d  rr==0 || *pzErr=
149b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43 61 6e  =0 );.  if( bCan
149c0 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  cel==0 ){.    FI
149d0 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65  LE *out = pState
149e0 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20 62  ->out;.    int b
149f0 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61 74 65  Verbose = pState
14a00 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73  ->expert.bVerbos
14a10 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e;..    rc = sql
14a20 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c  ite3_expert_anal
14a30 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20  yze(p, pzErr);. 
14a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
14a60 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c 69 74  t nQuery = sqlit
14a70 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28  e3_expert_count(
14a80 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  p);.      int i;
14a90 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56 65 72  ..      if( bVer
14aa0 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
14ab0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 6e  const char *zCan
14ac0 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  d = sqlite3_expe
14ad0 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45 58  rt_report(p,0,EX
14ae0 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44  PERT_REPORT_CAND
14af0 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20 20 20  IDATES);.       
14b00 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
14b10 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65 73 20   "-- Candidates 
14b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
14b40 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
14b50 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
14b60 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20  ", zCand);.     
14b70 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
14b80 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29  ; i<nQuery; i++)
14b90 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
14ba0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
14bb0 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
14bc0 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f  rt(p, i, EXPERT_
14bd0 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20  REPORT_SQL);.   
14be0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14bf0 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zIdx = sqlite3_
14c00 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
14c10 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52   i, EXPERT_REPOR
14c20 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20 20 20  T_INDEXES);.    
14c30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14c40 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 65  zEQP = sqlite3_e
14c50 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
14c60 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
14c70 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20 20  _PLAN);.        
14c80 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49  if( zIdx==0 ) zI
14c90 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e  dx = "(no new in
14ca0 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20  dexes)\n";.     
14cb0 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20     if( bVerbose 
14cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
14cd0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
14ce0 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d   Query %d ------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b  ----------\n",i+
14d10 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  1);.          ra
14d20 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
14d30 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20  s\n\n", zSql);. 
14d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14d50 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
14d60 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a   "%s\n", zIdx);.
14d70 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
14d80 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
14d90 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zEQP);.      }. 
14da0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
14db0 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f  e3_expert_destro
14dc0 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e  y(p);.  pState->
14dd0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
14de0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
14df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
14e00 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65 78  entation of ".ex
14e10 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e  pert" dot comman
14e20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14e30 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e   expertDotComman
14e40 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
14e50 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
14e60 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
14e70 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
14e80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
14e90 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
14ea0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
14eb0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
14ec0 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
14ed0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14f00 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
14f10 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69  zArg[] */.){.  i
14f20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14f30 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  K;.  char *zErr 
14f40 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
14f50 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20 30 3b  int iSample = 0;
14f60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61  ..  assert( pSta
14f70 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
14f80 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  rt==0 );.  memse
14f90 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70 65 72  t(&pState->exper
14fa0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
14fb0 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f  ertInfo));..  fo
14fc0 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
14fd0 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20  E_OK && i<nArg; 
14fe0 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
14ff0 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
15000 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
15010 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[0]=='-' && z[
15020 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
15030 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
15040 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 32  z);.    if( n>=2
15050 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
15060 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e 29  , "-verbose", n)
15070 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65   ){.      pState
15080 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73  ->expert.bVerbos
15090 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
150a0 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20 26   else if( n>=2 &
150b0 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20  & 0==strncmp(z, 
150c0 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29 7b  "-sample", n) ){
150d0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6e  .      if( i==(n
150e0 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
150f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
15100 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71  err, "option req
15110 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
15120 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  t: %s\n", z);.  
15130 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15140 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
15150 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 53  else{.        iS
15160 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e 74  ample = (int)int
15170 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
15180 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  ++i]);.        i
15190 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c 20  f( iSample<0 || 
151a0 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a 20  iSample>100 ){. 
151b0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
151c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76 61 6c  ntf(stderr, "val
151d0 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a  ue out of range:
151e0 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d   %s\n", azArg[i]
151f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
15200 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15220 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  }.    }.    else
15230 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
15240 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
15250 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
15260 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 63 20  ", z);.      rc 
15270 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15280 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
15290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
152a0 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78  {.    pState->ex
152b0 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 73  pert.pExpert = s
152c0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65  qlite3_expert_ne
152d0 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 7a  w(pState->db, &z
152e0 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  Err);.    if( pS
152f0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15300 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pert==0 ){.     
15310 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
15320 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65 78 70  rr, "sqlite3_exp
15330 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c 20  ert_new: %s\n", 
15340 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 63 20  zErr);.      rc 
15350 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15370 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15380 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20 20 20  config(.        
15390 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
153a0 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45 52 54  .pExpert, EXPERT
153b0 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20  _CONFIG_SAMPLE, 
153c0 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 29 3b  iSample.      );
153d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
153e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
153f0 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
15400 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15410 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  ABLE */../*.** E
15420 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d 65  xecute a stateme
15430 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73 74 61  nt or set of sta
15440 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a  tements.  Print.
15450 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20 72 6f  ** any result ro
15460 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e  ws/columns depen
15470 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75 72 72  ding on the curr
15480 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20  ent mode.** set 
15490 76 69 61 20 74 68 65 20 73 75 70 70 6c 69 65 64  via the supplied
154a0 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   callback..**.**
154b0 20 54 68 69 73 20 69 73 20 76 65 72 79 20 73 69   This is very si
154c0 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27  milar to SQLite'
154d0 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74  s built-in sqlit
154e0 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e  e3_exec().** fun
154f0 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20  ction except it 
15500 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79  takes a slightly
15510 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
15520 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62  ack.** and callb
15530 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e  ack data argumen
15540 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
15550 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 53   shell_exec(.  S
15560 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
15590 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
155a0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
155b0 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155d0 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65 76   /* SQL to be ev
155e0 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  aluated */.  cha
155f0 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
15620 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
15630 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
15640 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
15650 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  ULL;     /* Stat
15660 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
15670 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
15680 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
15690 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
156a0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72   Code */.  int r
156b0 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c2;.  const char
156c0 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20   *zLeftover;    
156d0 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66        /* Tail of
156e0 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c   unprocessed SQL
156f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
15700 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a 0a 20  b = pArg->db;.. 
15710 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
15720 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
15730 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e   NULL;.  }..#ifn
15740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15750 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
15760 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e  f( pArg->expert.
15770 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72  pExpert ){.    r
15780 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65  c = expertHandle
15790 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20  SQL(pArg, zSql, 
157a0 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  pzErrMsg);.    r
157b0 65 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69  eturn expertFini
157c0 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51  sh(pArg, (rc!=SQ
157d0 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d  LITE_OK), pzErrM
157e0 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sg);.  }.#endif.
157f0 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30  .  while( zSql[0
15800 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20  ] && (SQLITE_OK 
15810 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74  == rc) ){.    st
15820 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
15830 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72  *zStmtSql;.    r
15840 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
15850 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
15860 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
15870 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66  eftover);.    if
15880 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72  ( SQLITE_OK != r
15890 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
158a0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
158b0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
158c0 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b  ave_err_msg(db);
158d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
158e0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  se{.      if( !p
158f0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
15900 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  /* this happens 
15910 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72  for a comment or
15920 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a   white-space */.
15930 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
15940 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
15950 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
15960 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
15970 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
15980 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
15990 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73      zStmtSql = s
159a0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
159b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74  );.      if( zSt
159c0 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74  mtSql==0 ) zStmt
159d0 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sql = "";.      
159e0 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
159f0 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53  StmtSql[0]) ) zS
15a00 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20  tmtSql++;..     
15a10 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65   /* save off the
15a20 20 70 72 65 70 61 72 65 64 20 73 74 61 74 6d 65   prepared statme
15a30 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65  nt handle and re
15a40 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f  set row count */
15a50 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
15a60 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
15a70 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
15a80 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e          pArg->cn
15a90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  t = 0;.      }..
15aa0 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68        /* echo th
15ab0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
15ac0 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20  if echo on */.  
15ad0 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
15ae0 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72  ShellHasFlag(pAr
15af0 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29  g, SHFLG_Echo) )
15b00 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
15b10 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
15b20 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71   "%s\n", zStmtSq
15b30 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a  l ? zStmtSql : z
15b40 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Sql);.      }.. 
15b50 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65       /* Show the
15b60 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
15b70 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f  LAN if .eqp is o
15b80 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  n */.      if( p
15b90 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74  Arg && pArg->aut
15ba0 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f  oEQP && sqlite3_
15bb0 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e  strlike("EXPLAIN
15bc0 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d  %",zStmtSql,0)!=
15bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
15be0 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
15bf0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ain;.        cha
15c00 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20  r *zEQP;.       
15c10 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20   int triggerEQP 
15c20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73  = 0;.        dis
15c30 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
15c40 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
15c50 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
15c60 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
15c70 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
15c80 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65  EQP, -1, &trigge
15c90 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69  rEQP);.        i
15ca0 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
15cb0 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  >=AUTOEQP_trigge
15cc0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
15cd0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
15ce0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
15cf0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
15d00 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
15d10 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20   }.        zEQP 
15d20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15d30 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  f("EXPLAIN QUERY
15d40 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74   PLAN %s", zStmt
15d50 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Sql);.        rc
15d60 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
15d70 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
15d80 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
15d90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15db0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
15dc0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45   sqlite3_step(pE
15dd0 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f  xplain)==SQLITE_
15de0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
15df0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15e00 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74  EQPLine = (const
15e10 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
15e20 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
15e30 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20  ain,3);.        
15e40 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 49      int iSelectI
15e50 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
15e60 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
15e70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
15e80 20 69 66 28 20 7a 45 51 50 4c 69 6e 65 5b 30 5d   if( zEQPLine[0]
15e90 3d 3d 27 2d 27 20 29 20 65 71 70 5f 72 65 6e 64  =='-' ) eqp_rend
15ea0 65 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20  er(pArg);.      
15eb0 20 20 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64        eqp_append
15ec0 28 70 41 72 67 2c 20 69 53 65 6c 65 63 74 49 64  (pArg, iSelectId
15ed0 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20 20  , zEQPLine);.   
15ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ef0 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41     eqp_render(pA
15f00 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rg);.        }. 
15f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
15f20 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
15f30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15f40 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20  e3_free(zEQP);. 
15f50 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
15f60 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51  >autoEQP>=AUTOEQ
15f70 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  P_full ){.      
15f80 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61      /* Also do a
15f90 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e  n EXPLAIN for ".
15fa0 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a  eqp full" mode *
15fb0 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51 50  /.          zEQP
15fc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15fd0 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c  tf("EXPLAIN %s",
15fe0 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20   zStmtSql);.    
15ff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16000 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
16010 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78  , zEQP, -1, &pEx
16020 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
16030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16050 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
16060 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
16070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
16080 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
16090 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69  re(pArg, pExplai
160a0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
160b0 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74  exec_prepared_st
160c0 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69  mt(pArg, pExplai
160d0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
160e0 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
160f0 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20  ete(pArg);.     
16100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16110 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
16120 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
16130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16140 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20  ree(zEQP);.     
16150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16160 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
16170 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
16180 26 26 20 74 72 69 67 67 65 72 45 51 50 3d 3d 30  && triggerEQP==0
16190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
161a0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
161b0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
161c0 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
161d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
161e0 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20 70    /* Reprepare p
161f0 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65 61 63  Stmt before reac
16200 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d 6f 64  tiving trace mod
16210 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
16220 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
16230 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
16240 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
16250 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
16260 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
16270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16280 20 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f    restore_debug_
16290 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20  trace_modes();. 
162a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
162b0 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
162c0 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
162d0 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20  pArg->mode;.    
162e0 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
162f0 74 6f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  toExplain ){.   
16300 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16310 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
16320 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20  pStmt)==8.      
16330 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
16340 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e  strlike("EXPLAIN
16350 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
16360 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
16370 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
16380 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
16390 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
163a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
163b0 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
163c0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34  _count(pStmt)==4
163d0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
163e0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
163f0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
16400 41 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30  AN%", zStmtSql,0
16410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
16420 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
16430 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20  = MODE_EQP;.    
16440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16450 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  }..        /* If
16460 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75   the shell is cu
16470 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70  rrently in ".exp
16480 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68  lain" mode, gath
16490 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20  er the extra.   
164a0 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71       ** data req
164b0 75 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64  uired to add ind
164c0 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ents to the outp
164d0 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ut.*/.        if
164e0 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d  ( pArg->cMode==M
164f0 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
16500 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
16510 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
16520 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  rg, pStmt);.    
16530 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
16540 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
16550 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
16560 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  tmt);.      expl
16570 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
16580 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70  pArg);.      eqp
16590 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a  _render(pArg);..
165a0 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
165b0 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
165c0 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
165d0 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
165e0 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
165f0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
16600 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
16610 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16620 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
16630 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
16640 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
16650 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
16660 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
16670 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
16680 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
16690 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
166a0 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
166b0 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
166c0 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
166d0 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
166e0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
166f0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
16700 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
16710 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
16720 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16730 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
16740 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
16750 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
16760 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
16770 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
16780 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
16790 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
167a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
167b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
167c0 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
167d0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
167e0 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
167f0 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
16800 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
16810 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
16820 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
16830 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
16840 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
16850 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
16860 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
16870 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
16880 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
16890 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
168a0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
168b0 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
168c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
168d0 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
168e0 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
168f0 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
16900 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
16910 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
16920 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
16930 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
16940 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
16950 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
16960 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
16970 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
16980 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
16990 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
169a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
169b0 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
169c0 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
169d0 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
169e0 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
169f0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
16a00 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
16a10 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
16a20 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
16a30 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
16a40 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
16a50 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
16a60 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
16a70 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
16a80 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
16a90 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
16aa0 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
16ab0 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
16ac0 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
16ad0 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
16ae0 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
16af0 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
16b00 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
16b10 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
16b20 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
16b30 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
16b40 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
16b50 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
16b60 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
16b70 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
16b80 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
16b90 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
16ba0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
16bb0 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
16bc0 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
16bd0 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
16be0 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
16bf0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
16c00 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
16c10 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
16c20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
16c30 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
16c40 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
16c50 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
16c60 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
16c70 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
16c80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
16c90 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
16ca0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
16cb0 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
16cc0 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
16cd0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
16ce0 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
16cf0 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
16d00 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
16d10 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
16d20 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
16d30 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
16d40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16d50 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
16d60 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
16d70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16d80 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
16d90 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
16da0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
16db0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
16dc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16dd0 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
16de0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
16df0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
16e00 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
16e10 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
16e20 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
16e30 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
16e40 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
16e50 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
16e60 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
16e70 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
16e80 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
16e90 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
16ea0 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
16eb0 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
16ec0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16ed0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
16ee0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
16ef0 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
16f00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
16f10 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
16f20 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
16f30 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
16f40 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
16f50 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
16f60 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
16f70 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
16f80 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
16fa0 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
16fb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
16fc0 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
16fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
16fe0 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
16ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
17000 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17010 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
17020 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17030 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
17040 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
17050 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
17060 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
17070 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
17080 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
17090 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
170a0 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
170b0 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
170c0 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
170d0 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
170e0 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
170f0 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
17100 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
17110 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
17120 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
17130 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
17140 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
17150 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
17160 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
17170 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
17180 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
17190 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
171a0 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
171b0 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
171c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
171d0 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
171e0 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
171f0 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
17200 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
17210 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
17220 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
17230 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
17240 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
17250 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
17260 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
17270 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
17280 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
17290 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
172a0 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
172b0 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
172c0 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
172d0 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
172e0 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
172f0 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
17300 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
17310 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
17320 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
17330 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
17340 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
17350 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
17360 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
17370 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
17380 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
17390 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
173a0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
173b0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
173c0 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
173d0 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
17400 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
17410 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
17420 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
17430 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
17440 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
17450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17460 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
17470 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
17480 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
17490 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
174a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
174b0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
174c0 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
174d0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
174e0 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
174f0 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
17500 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
17510 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
17520 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
17530 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
17540 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
17550 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
17560 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
17570 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
17580 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
17590 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
175a0 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
175b0 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
175c0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
175d0 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
175e0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
175f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
17600 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
17610 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
17620 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
17630 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17640 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
17650 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
17660 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
17670 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
17680 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
17690 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
176a0 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
176b0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
176c0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
176d0 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
176e0 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
176f0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
17700 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
17710 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
17720 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
17730 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
17740 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
17750 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
17760 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17770 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
17780 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
17790 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
177a0 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
177b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
177c0 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
177d0 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
177e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
177f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17800 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
17810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
17820 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
17830 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
17840 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
17850 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
17860 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
17870 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
17880 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
17890 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
178a0 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
178b0 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
178c0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
178d0 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
178e0 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
178f0 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
17900 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
17910 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17920 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
17930 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
17940 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17950 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
17960 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
17970 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
17980 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
17990 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
179a0 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
179b0 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
179c0 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
179d0 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
179e0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
179f0 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
17a00 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
17a10 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
17a20 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
17a30 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
17a40 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
17a50 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
17a60 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
17a70 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
17a80 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
17a90 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
17aa0 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
17ab0 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
17ac0 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
17ad0 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
17ae0 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
17af0 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
17b00 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
17b10 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
17b20 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
17b30 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
17b40 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
17b50 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
17b60 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
17b70 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
17b80 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
17b90 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
17ba0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17bb0 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
17bc0 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
17bd0 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
17be0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
17bf0 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
17c00 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
17c10 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
17c20 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
17c30 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
17c40 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
17c50 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
17c60 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
17c70 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
17c80 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
17c90 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
17ca0 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
17cb0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
17cc0 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
17cd0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
17ce0 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
17cf0 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
17d00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
17d10 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
17d20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
17d30 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
17d40 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
17d50 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
17d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
17d70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
17d80 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
17d90 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
17da0 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
17db0 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
17dc0 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
17dd0 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
17de0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
17df0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
17e00 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
17e10 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
17e20 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
17e30 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
17e40 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
17e50 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
17e60 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
17e70 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
17e80 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
17e90 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
17ea0 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
17eb0 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
17ec0 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
17ed0 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
17ee0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
17ef0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
17f00 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
17f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
17f20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
17f40 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
17f50 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
17f60 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
17f70 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
17f80 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
17f90 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
17fa0 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
17fb0 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
17fc0 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
17fd0 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
17fe0 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
17ff0 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
18000 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
18010 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
18020 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
18030 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
18040 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
18050 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
18060 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
18070 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
18080 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
18090 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
180a0 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
180b0 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
180c0 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
180d0 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
180e0 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
180f0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
18100 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
18110 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
18120 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
18130 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
18140 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
18150 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
18160 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
18170 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
18180 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
18190 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
181a0 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
181b0 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
181c0 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
181d0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
181e0 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
181f0 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
18200 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
18210 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
18220 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18230 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
18240 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
18250 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
18260 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
18270 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
18280 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
18290 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
182a0 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
182b0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
182c0 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
182d0 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
182e0 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
182f0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
18300 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
18310 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
18320 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
18330 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
18340 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
18350 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
18360 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
18370 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
18380 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
18390 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
183a0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
183b0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
183c0 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
183d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
183e0 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
183f0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
18400 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
18410 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18420 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
18430 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
18440 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
18450 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
18460 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
18470 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
18480 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
18490 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
184a0 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
184b0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
184c0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
184d0 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
184e0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
184f0 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
18500 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
18510 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
18520 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
18530 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
18540 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
18550 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
18560 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
18570 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
18580 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
18590 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
185a0 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
185b0 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
185c0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
185d0 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
185e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
185f0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
18600 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
18610 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
18620 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
18630 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
18640 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
18650 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
18660 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
18670 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
18680 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
18690 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
186a0 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
186b0 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
186c0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
186d0 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
186e0 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
186f0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
18700 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
18710 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18720 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
18730 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
18740 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
18750 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
18760 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
18770 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
18780 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
18790 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
187a0 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
187b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
187c0 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
187d0 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
187e0 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
187f0 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
18800 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
18810 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
18820 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
18830 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
18840 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18850 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
18860 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
18870 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
18880 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
18890 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
188a0 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
188b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
188c0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
188d0 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
188e0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
188f0 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
18900 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18910 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
18920 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
18930 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
18940 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
18950 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
18960 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
18970 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
18980 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
18990 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
189a0 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
189b0 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
189c0 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
189d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
189e0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
189f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
18a00 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
18a10 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
18a20 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
18a30 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
18a40 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
18a50 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
18a60 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18a70 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18a80 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
18a90 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
18aa0 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
18ab0 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
18ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
18ae0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
18af0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
18b00 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
18b10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
18b30 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61   of a help messa
18b40 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ge.*/.static cha
18b50 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20  r zHelp[] =.#if 
18b60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
18b70 41 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65  AVE_ZLIB) && !de
18b80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18b90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
18ba0 20 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20    ".archive ... 
18bb0 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65            Manage
18bc0 20 53 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c   SQL archives: \
18bd0 22 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70  ".archive --help
18be0 5c 22 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e  \" for details\n
18bf0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
18c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18c10 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
18c20 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
18c30 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72       Show author
18c40 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e  izer callbacks\n
18c50 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ".#endif.  ".bac
18c60 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
18c70 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64 65     Backup DB (de
18c80 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
18c90 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62  to FILE\n".  ".b
18ca0 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
18cb0 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
18cc0 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
18cd0 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e  .  Default OFF\n
18ce0 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ".  ".binary on|
18cf0 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72 6e  off         Turn
18d00 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f   binary output o
18d10 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75  n or off.  Defau
18d20 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64  lt OFF\n".  ".cd
18d30 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
18d40 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 77      Change the w
18d50 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
18d60 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22   to DIRECTORY\n"
18d70 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c  .  ".changes on|
18d80 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77 20  off        Show 
18d90 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63  number of rows c
18da0 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22  hanged by SQL\n"
18db0 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20  .  ".check GLOB 
18dc0 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20             Fail 
18dd0 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20  if output since 
18de0 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e  .testcase does n
18df0 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e  ot match\n".  ".
18e00 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20  clone NEWDB     
18e10 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61        Clone data
18e20 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d   into NEWDB from
18e30 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
18e40 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61  tabase\n".  ".da
18e50 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20  tabases         
18e60 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
18e70 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
18e80 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e  ched databases\n
18e90 22 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f  ".  ".dbconfig ?
18ea0 6f 70 3f 20 3f 76 61 6c 3f 20 20 20 4c 69 73 74  op? ?val?   List
18eb0 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c 69 74   or change sqlit
18ec0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 6f  e3_db_config() o
18ed0 70 74 69 6f 6e 73 5c 6e 22 0a 20 20 22 2e 64 62  ptions\n".  ".db
18ee0 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20  info ?DB?       
18ef0 20 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20      Show status 
18f00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
18f10 74 20 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e  t the database\n
18f20 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c  ".  ".dump ?TABL
18f30 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70  E? ...      Dump
18f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
18f50 20 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72   an SQL text for
18f60 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  mat\n".  "      
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
18f90 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70  ified, only dump
18fa0 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
18fb0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
18fe0 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20  LE.\n".  ".echo 
18ff0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
19000 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63   Turn command ec
19010 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  ho on or off\n".
19020 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66    ".eqp on|off|f
19030 75 6c 6c 20 20 20 20 20 20 20 45 6e 61 62 6c 65  ull       Enable
19040 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f   or disable auto
19050 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55  matic EXPLAIN QU
19060 45 52 59 20 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e  ERY PLAN\n".  ".
19070 65 78 63 65 6c 20 20 20 20 20 20 20 20 20 20 20  excel           
19080 20 20 20 20 20 20 44 69 73 70 6c 61 79 20 74 68        Display th
19090 65 20 6f 75 74 70 75 74 20 6f 66 20 6e 65 78 74  e output of next
190a0 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61 20 73 70   command in a sp
190b0 72 65 61 64 73 68 65 65 74 5c 6e 22 0a 20 20 22  readsheet\n".  "
190c0 2e 65 78 69 74 20 20 20 20 20 20 20 20 20 20 20  .exit           
190d0 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73         Exit this
190e0 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e   program\n".  ".
190f0 65 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20  expert          
19100 20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54        EXPERIMENT
19110 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65  AL. Suggest inde
19120 78 65 73 20 66 6f 72 20 73 70 65 63 69 66 69 65  xes for specifie
19130 64 20 71 75 65 72 69 65 73 5c 6e 22 0a 2f 2a 20  d queries\n"./* 
19140 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20  Because explain 
19150 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75  mode comes on au
19160 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c  tomatically now,
19170 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20   the ".explain" 
19180 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76  mode.** is remov
19190 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70  ed from the help
191a0 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20   screen.  It is 
191b0 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20  still supported 
191c0 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65  for legacy, howe
191d0 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61  ver */./*".expla
191e0 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f  in ?on|off|auto?
191f0 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75   Turn EXPLAIN ou
19200 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20  tput mode on or 
19210 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61  off or to automa
19220 74 69 63 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c  tic\n"*/.  ".ful
19230 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e  lschema ?--inden
19240 74 3f 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61  t? Show schema a
19250 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nd the content o
19260 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61  f sqlite_stat ta
19270 62 6c 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64  bles\n".  ".head
19280 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ers on|off      
19290 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f    Turn display o
192a0 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20  f headers on or 
192b0 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20  off\n".  ".help 
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61   Show this messa
192e0 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74  ge\n".  ".import
192f0 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20   FILE TABLE     
19300 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d  Import data from
19310 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45   FILE into TABLE
19320 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  \n".#ifndef SQLI
19330 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e  TE_OMIT_TEST_CON
19340 54 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65  TROL.  ".imposte
19350 72 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20 43  r INDEX TABLE  C
19360 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74  reate imposter t
19370 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e  able TABLE on in
19380 64 65 78 20 49 4e 44 45 58 5c 6e 22 0a 23 65 6e  dex INDEX\n".#en
19390 64 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20  dif.  ".indexes 
193a0 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68  ?TABLE?       Sh
193b0 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  ow names of all 
193c0 69 6e 64 65 78 65 73 5c 6e 22 0a 20 20 22 20 20  indexes\n".  "  
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
193f0 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
19400 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72  show indexes for
19410 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20   tables\n".  "  
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20         matching 
19440 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
19450 4c 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51  LE.\n".#ifdef SQ
19460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
19470 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20  ACE.  ".iotrace 
19480 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e  FILE          En
19490 61 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73  able I/O diagnos
194a0 74 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46  tic logging to F
194b0 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ILE\n".#endif.  
194c0 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20  ".limit ?LIMIT? 
194d0 3f 56 41 4c 3f 20 20 20 44 69 73 70 6c 61 79 20  ?VAL?   Display 
194e0 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  or change the va
194f0 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45  lue of an SQLITE
19500 5f 4c 49 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c 69  _LIMIT\n".  ".li
19510 6e 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20  nt OPTIONS      
19520 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e      Report poten
19530 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75  tial schema issu
19540 65 73 2e 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a  es. Options:\n".
19550 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19560 20 20 20 20 20 20 20 20 20 20 20 20 66 6b 65 79              fkey
19570 2d 69 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e  -indexes     Fin
19580 64 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67  d missing foreig
19590 6e 20 6b 65 79 20 69 6e 64 65 78 65 73 5c 6e 22  n key indexes\n"
195a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
195b0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
195c0 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c  ION.  ".load FIL
195d0 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f  E ?ENTRY?     Lo
195e0 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20  ad an extension 
195f0 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69  library\n".#endi
19600 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f  f.  ".log FILE|o
19610 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
19620 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f   logging on or o
19630 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65  ff.  FILE can be
19640 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e   stderr/stdout\n
19650 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20  ".  ".mode MODE 
19660 3f 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20  ?TABLE?     Set 
19670 6f 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72  output mode wher
19680 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66  e MODE is one of
19690 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  :\n".  "        
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e   ascii    Column
196c0 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64  s/rows delimited
196d0 20 62 79 20 30 78 31 46 20 61 6e 64 20 30 78 31   by 0x1F and 0x1
196e0 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  E\n".  "        
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
19710 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
19720 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c  column   Left-al
19750 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20  igned columns.  
19760 28 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a  (See .width)\n".
19770 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19780 20 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c              html
19790 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65       HTML <table
197a0 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20  > code\n".  "   
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53        insert   S
197d0 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d  QL insert statem
197e0 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e  ents for TABLE\n
197f0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
19810 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65  ne     One value
19820 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22   per line\n".  "
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 20 20 20 6c 69 73 74 20 20 20           list   
19850 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74    Values delimit
19860 65 64 20 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20  ed by \"|\"\n". 
19870 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
19880 20 20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65             quote
19890 20 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65      Escape answe
198a0 72 73 20 61 73 20 66 6f 72 20 53 51 4c 5c 6e 22  rs as for SQL\n"
198b0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
198d0 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61  s     Tab-separa
198e0 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ted values\n".  
198f0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19900 20 20 20 20 20 20 20 20 20 20 74 63 6c 20 20 20            tcl   
19910 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d     TCL list elem
19920 65 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c  ents\n".  ".null
19930 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20  value STRING    
19940 20 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e 20    Use STRING in 
19950 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61  place of NULL va
19960 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65  lues\n".  ".once
19970 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20 20   (-e|-x|FILE)   
19980 20 20 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65    Output for the
19990 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e   next SQL comman
199a0 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 5c 6e  d only to FILE\n
199b0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
199d0 20 69 6e 76 6f 6b 65 20 73 79 73 74 65 6d 20 74   invoke system t
199e0 65 78 74 20 65 64 69 74 6f 72 20 28 2d 65 29 20  ext editor (-e) 
199f0 6f 72 20 73 70 72 65 61 64 73 68 65 65 74 20 28  or spreadsheet (
19a00 2d 78 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  -x)\n".  "      
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74     on the output
19a30 2e 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f  .\n".  ".open ?O
19a40 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 43  PTIONS? ?FILE? C
19a50 6c 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61  lose existing da
19a60 74 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65  tabase and reope
19a70 6e 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20  n FILE\n".  "   
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 20 20 20 20 54 68 65 20 2d 2d 6e 65 77 20        The --new 
19aa0 6f 70 74 69 6f 6e 20 73 74 61 72 74 73 20 77 69  option starts wi
19ab0 74 68 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  th an empty file
19ac0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73 3a 20 2d  Other options: -
19af0 2d 72 65 61 64 6f 6e 6c 79 20 2d 2d 61 70 70 65  -readonly --appe
19b00 6e 64 20 2d 2d 7a 69 70 5c 6e 22 0a 20 20 22 2e  nd --zip\n".  ".
19b10 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20  output ?FILE?   
19b20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
19b30 74 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64  t to FILE or std
19b40 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74  out\n".  ".print
19b50 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20   STRING...      
19b60 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53   Print literal S
19b70 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f  TRING\n".  ".pro
19b80 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55  mpt MAIN CONTINU
19b90 45 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73  E  Replace the s
19ba0 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c  tandard prompts\
19bb0 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20  n".  ".quit     
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
19bd0 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e  t this program\n
19be0 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e  ".  ".read FILEN
19bf0 41 4d 45 20 20 20 20 20 20 20 20 20 45 78 65 63  AME         Exec
19c00 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e  ute SQL in FILEN
19c10 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f  AME\n".  ".resto
19c20 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  re ?DB? FILE    
19c30 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74   Restore content
19c40 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20   of DB (default 
19c50 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46  \"main\") from F
19c60 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61 76 65 20  ILE\n".  ".save 
19c70 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
19c80 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79   Write in-memory
19c90 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46   database into F
19ca0 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 61 6e 73  ILE\n".  ".scans
19cb0 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  tats on|off     
19cc0 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74   Turn sqlite3_st
19cd0 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20  mt_scanstatus() 
19ce0 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66  metrics on or of
19cf0 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20  f\n".  ".schema 
19d00 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20 53  ?PATTERN?      S
19d10 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73  how the CREATE s
19d20 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69  tatements matchi
19d30 6e 67 20 50 41 54 54 45 52 4e 5c 6e 22 0a 20 20  ng PATTERN\n".  
19d40 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19d50 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20 2d             Add -
19d60 2d 69 6e 64 65 6e 74 20 66 6f 72 20 70 72 65 74  -indent for pret
19d70 74 79 2d 70 72 69 6e 74 69 6e 67 5c 6e 22 0a 20  ty-printing\n". 
19d80 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 2d 2d 69   ".selftest ?--i
19d90 6e 69 74 3f 20 20 20 20 20 52 75 6e 20 74 65 73  nit?     Run tes
19da0 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ts defined in th
19db0 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
19dc0 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72 61 74 6f  \n".  ".separato
19dd0 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 43 68  r COL ?ROW?   Ch
19de0 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ange the column 
19df0 73 65 70 61 72 61 74 6f 72 20 61 6e 64 20 6f 70  separator and op
19e00 74 69 6f 6e 61 6c 6c 79 20 74 68 65 20 72 6f 77  tionally the row
19e10 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 73 65 70 61 72 61 74 6f 72 20 66 6f 72 20 62 6f  separator for bo
19e40 74 68 20 74 68 65 20 6f 75 74 70 75 74 20 6d 6f  th the output mo
19e50 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e  de and .import\n
19e60 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ".#if defined(SQ
19e70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
19e80 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f 6e  ION).  ".session
19e90 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 43   CMD ...       C
19ea0 72 65 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c  reate or control
19eb0 20 73 65 73 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e   sessions\n".#en
19ec0 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20  dif.  ".sha3sum 
19ed0 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f  ?OPTIONS...?  Co
19ee0 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61 73  mpute a SHA3 has
19ef0 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  h of database co
19f00 6e 74 65 6e 74 5c 6e 22 0a 23 69 66 6e 64 65 66  ntent\n".#ifndef
19f10 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
19f20 59 53 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20  YSTEM.  ".shell 
19f30 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20  CMD ARGS...     
19f40 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
19f50 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
19f60 6c 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  l\n".#endif.  ".
19f70 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  show            
19f80 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63        Show the c
19f90 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
19fa0 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e  r various settin
19fb0 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20  gs\n".  ".stats 
19fc0 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20  ?on|off?        
19fd0 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75  Show stats or tu
19fe0 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f  rn stats on or o
19ff0 66 66 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51  ff\n".#ifndef SQ
1a000 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1a010 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d  EM.  ".system CM
1a020 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52 75 6e  D ARGS...    Run
1a030 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20   CMD ARGS... in 
1a040 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e  a system shell\n
1a050 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62  ".#endif.  ".tab
1a060 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  les ?TABLE?     
1a070 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66     List names of
1a080 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20   tables\n".  "  
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
1a0b0 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
1a0c0 6c 69 73 74 20 74 61 62 6c 65 73 20 6d 61 74 63  list tables matc
1a0d0 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  hing\n".  "     
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e      LIKE pattern
1a100 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74   TABLE.\n".  ".t
1a110 65 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20  estcase NAME    
1a120 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72       Begin redir
1a130 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f  ecting output to
1a140 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74   'testcase-out.t
1a150 78 74 27 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f  xt'\n".  ".timeo
1a160 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
1a170 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
1a180 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
1a190 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e  S milliseconds\n
1a1a0 22 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f  ".  ".timer on|o
1a1b0 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
1a1c0 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72   SQL timer on or
1a1d0 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63   off\n".  ".trac
1a1e0 65 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  e FILE|off      
1a1f0 20 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51    Output each SQ
1a200 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  L statement as i
1a210 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e  t is run\n".  ".
1a220 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20  vfsinfo ?AUX?   
1a230 20 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f        Informatio
1a240 6e 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d  n about the top-
1a250 6c 65 76 65 6c 20 56 46 53 5c 6e 22 0a 20 20 22  level VFS\n".  "
1a260 2e 76 66 73 6c 69 73 74 20 20 20 20 20 20 20 20  .vfslist        
1a270 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20         List all 
1a280 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 5c  available VFSes\
1a290 6e 22 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f  n".  ".vfsname ?
1a2a0 41 55 58 3f 20 20 20 20 20 20 20 20 20 50 72 69  AUX?         Pri
1a2b0 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nt the name of t
1a2c0 68 65 20 56 46 53 20 73 74 61 63 6b 5c 6e 22 0a  he VFS stack\n".
1a2d0 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e    ".width NUM1 N
1a2e0 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f  UM2 ...   Set co
1a2f0 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
1a300 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c  \"column\" mode\
1a310 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
1a330 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 72  egative values r
1a340 69 67 68 74 2d 6a 75 73 74 69 66 79 5c 6e 22 0a  ight-justify\n".
1a350 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
1a360 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1a370 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  SION)./*.** Prin
1a380 74 20 68 65 6c 70 20 69 6e 66 6f 72 6d 61 74 69  t help informati
1a390 6f 6e 20 66 6f 72 20 74 68 65 20 22 2e 73 65 73  on for the ".ses
1a3a0 73 69 6f 6e 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a  sions" command.*
1a3b0 2f 0a 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 68  /.void session_h
1a3c0 65 6c 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  elp(ShellState *
1a3d0 70 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  p){.  raw_printf
1a3e0 28 70 2d 3e 6f 75 74 2c 0a 20 20 20 20 22 2e 73  (p->out,.    ".s
1a3f0 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55  ession ?NAME? SU
1a400 42 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 2e 2e  BCOMMAND ?ARGS..
1a410 2e 3f 5c 6e 22 0a 20 20 20 20 22 49 66 20 3f 4e  .?\n".    "If ?N
1a420 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c  AME? is omitted,
1a430 20 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e   the first defin
1a440 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73  ed session is us
1a450 65 64 2e 5c 6e 22 0a 20 20 20 20 22 53 75 62 63  ed.\n".    "Subc
1a460 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a 20 20 20 20  ommands:\n".    
1a470 22 20 20 20 61 74 74 61 63 68 20 54 41 42 4c 45  "   attach TABLE
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74 74               Att
1a490 61 63 68 20 54 41 42 4c 45 5c 6e 22 0a 20 20 20  ach TABLE\n".   
1a4a0 20 22 20 20 20 63 68 61 6e 67 65 73 65 74 20 46   "   changeset F
1a4b0 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72  ILE           Wr
1a4c0 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ite a changeset 
1a4d0 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 20  into FILE\n".   
1a4e0 20 22 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20   "   close      
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c                Cl
1a500 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 5c  ose one session\
1a510 6e 22 0a 20 20 20 20 22 20 20 20 65 6e 61 62 6c  n".    "   enabl
1a520 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  e ?BOOLEAN?     
1a530 20 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79      Set or query
1a540 20 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 5c   the enable bit\
1a550 6e 22 0a 20 20 20 20 22 20 20 20 66 69 6c 74 65  n".    "   filte
1a560 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20  r GLOB...       
1a570 20 20 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65      Reject table
1a580 73 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73  s matching GLOBs
1a590 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 6e 64 69  \n".    "   indi
1a5a0 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20  rect ?BOOLEAN?  
1a5b0 20 20 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65       Mark or que
1a5c0 72 79 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  ry the indirect 
1a5d0 73 74 61 74 75 73 5c 6e 22 0a 20 20 20 20 22 20  status\n".    " 
1a5e0 20 20 69 73 65 6d 70 74 79 20 20 20 20 20 20 20    isempty       
1a5f0 20 20 20 20 20 20 20 20 20 20 20 51 75 65 72 79             Query
1a600 20 77 68 65 74 68 65 72 20 74 68 65 20 73 65 73   whether the ses
1a610 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 5c 6e 22  sion is empty\n"
1a620 0a 20 20 20 20 22 20 20 20 6c 69 73 74 20 20 20  .    "   list   
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74 6c 79    List currently
1a650 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61   open session na
1a660 6d 65 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 6f  mes\n".    "   o
1a670 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20  pen DB NAME     
1a680 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e          Open a n
1a690 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42  ew session on DB
1a6a0 5c 6e 22 0a 20 20 20 20 22 20 20 20 70 61 74 63  \n".    "   patc
1a6b0 68 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  hset FILE       
1a6c0 20 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74       Write a pat
1a6d0 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c  chset into FILE\
1a6e0 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  n".  );.}.#endif
1a6f0 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  .../* Forward re
1a700 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
1a710 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e  c int process_in
1a720 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  put(ShellState *
1a730 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f  p, FILE *in);../
1a740 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1a750 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e  ntent of file zN
1a760 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ame into memory 
1a770 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1a780 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1a790 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61  .** and return a
1a7a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a7b0 62 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c 6c  buffer. The call
1a7c0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1a7d0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a  e for freeing.**
1a7e0 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a   the memory..**.
1a7f0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1a800 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55  pnByte is not NU
1a810 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73  LL, (*pnByte) is
1a820 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1a830 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72  er of bytes.** r
1a840 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63  ead..**.** For c
1a850 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75  onvenience, a nu
1a860 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
1a870 65 20 69 73 20 61 6c 77 61 79 73 20 61 70 70 65  e is always appe
1a880 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1a890 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68   read.** from th
1a8a0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  e file before th
1a8b0 65 20 62 75 66 66 65 72 20 69 73 20 72 65 74 75  e buffer is retu
1a8c0 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65 20  rned. This byte 
1a8d0 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20  is not included 
1a8e0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  in.** the final 
1a8f0 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74  value of (*pnByt
1a900 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c  e), if applicabl
1a910 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73  e..**.** NULL is
1a920 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79   returned if any
1a930 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1a940 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c  tered. The final
1a950 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74   value of *pnByt
1a960 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65  e.** is undefine
1a970 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1a980 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1a990 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  readFile(const c
1a9a0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
1a9b0 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45  *pnByte){.  FILE
1a9c0 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61   *in = fopen(zNa
1a9d0 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e  me, "rb");.  lon
1a9e0 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20  g nIn;.  size_t 
1a9f0 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a 70  nRead;.  char *p
1aa00 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  Buf;.  if( in==0
1aa10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
1aa20 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b  seek(in, 0, SEEK
1aa30 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66  _END);.  nIn = f
1aa40 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69  tell(in);.  rewi
1aa50 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d  nd(in);.  pBuf =
1aa60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1aa70 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66  4( nIn+1 );.  if
1aa80 28 20 70 42 75 66 3d 3d 30 20 29 20 72 65 74 75  ( pBuf==0 ) retu
1aa90 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64 20 3d 20  rn 0;.  nRead = 
1aaa0 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c  fread(pBuf, nIn,
1aab0 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73   1, in);.  fclos
1aac0 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65  e(in);.  if( nRe
1aad0 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  ad!=1 ){.    sql
1aae0 69 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b  ite3_free(pBuf);
1aaf0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1ab00 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d   }.  pBuf[nIn] =
1ab10 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65   0;.  if( pnByte
1ab20 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e   ) *pnByte = nIn
1ab30 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
1ab40 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1ab50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1ab60 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f  SSION)./*.** Clo
1ab70 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e  se a single Open
1ab80 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  Session object a
1ab90 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f  nd release all o
1aba0 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  f its associated
1abb0 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  .** resources..*
1abc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1abd0 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e  ssion_close(Open
1abe0 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  Session *pSessio
1abf0 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  n){.  int i;.  s
1ac00 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65  qlite3session_de
1ac10 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  lete(pSession->p
1ac20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1ac30 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d  e(pSession->zNam
1ac40 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
1ac50 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
1ac60 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  er; i++){.    sq
1ac70 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1ac80 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1ac90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1aca0 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1acb0 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d  azFilter);.  mem
1acc0 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c  set(pSession, 0,
1acd0 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73   sizeof(OpenSess
1ace0 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ion));.}.#endif.
1acf0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
1ad00 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a   OpenSession obj
1ad10 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65  ects and release
1ad20 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
1ad30 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69  resources..*/.#i
1ad40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ad50 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1ad60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
1ad70 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53  sion_close_all(S
1ad80 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
1ad90 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1ada0 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
1adb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73  ; i++){.    sess
1adc0 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53  ion_close(&p->aS
1add0 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a  ession[i]);.  }.
1ade0 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20    p->nSession = 
1adf0 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  0;.}.#else.# def
1ae00 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  ine session_clos
1ae10 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a  e_all(X).#endif.
1ae20 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1ae30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69  ation of the xFi
1ae40 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lter function fo
1ae50 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f  r an open sessio
1ae60 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20  n.  Omit.** any 
1ae70 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20  tables named by 
1ae80 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72  ".session filter
1ae90 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74  " but let all ot
1aea0 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67  her table throug
1aeb0 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  h..*/.#if define
1aec0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1aed0 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20  SESSION).static 
1aee0 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74  int session_filt
1aef0 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63  er(void *pCtx, c
1af00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
1af10 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  {.  OpenSession 
1af20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65  *pSession = (Ope
1af30 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a  nSession*)pCtx;.
1af40 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1af50 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  =0; i<pSession->
1af60 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nFilter; i++){. 
1af70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1af80 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d  trglob(pSession-
1af90 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54  >azFilter[i], zT
1afa0 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
1afb0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1afc0 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
1afd0 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63 65  ** Try to deduce
1afe0 20 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c   the type of fil
1aff0 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65  e for zName base
1b000 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  d on its content
1b010 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65  .  Return.** one
1b020 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50   of the SHELL_OP
1b030 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a  EN_* constants..
1b040 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1b050 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1b060 20 6f 72 20 69 73 20 65 6d 70 74 79 20 62 75 74   or is empty but
1b070 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20   its name looks 
1b080 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61 72  like a ZIP.** ar
1b090 63 68 69 76 65 20 61 6e 64 20 74 68 65 20 64 66  chive and the df
1b0a0 6c 74 5a 69 70 20 66 6c 61 67 20 69 73 20 74 72  ltZip flag is tr
1b0b0 75 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  ue, then assume 
1b0c0 69 74 20 69 73 20 61 20 5a 49 50 20 61 72 63 68  it is a ZIP arch
1b0d0 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ive..** Otherwis
1b0e0 65 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f 72 64  e, assume an ord
1b0f0 69 6e 61 72 79 20 64 61 74 61 62 61 73 65 20 72  inary database r
1b100 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
1b110 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a 20   filename if.** 
1b120 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20  the type cannot 
1b130 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72  be determined fr
1b140 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73  om content..*/.s
1b150 74 61 74 69 63 20 69 6e 74 20 64 65 64 75 63 65  tatic int deduce
1b160 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e  DatabaseType(con
1b170 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1b180 69 6e 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20  int dfltZip){.  
1b190 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28  FILE *f = fopen(
1b1a0 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
1b1b0 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20  size_t n;.  int 
1b1c0 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1b1d0 55 4e 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a  UNSPEC;.  char z
1b1e0 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20  Buf[100];.  if( 
1b1f0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
1b200 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74  dfltZip && sqlit
1b210 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69  e3_strlike("%.zi
1b220 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29  p",zName,0)==0 )
1b230 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
1b240 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1b250 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45  return SHELL_OPE
1b260 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  N_NORMAL;.  }.  
1b270 66 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45  fseek(f, -25, SE
1b280 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66  EK_END);.  n = f
1b290 72 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31  read(zBuf, 25, 1
1b2a0 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31  , f);.  if( n==1
1b2b0 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   && memcmp(zBuf,
1b2c0 20 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74   "Start-Of-SQLit
1b2d0 65 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  e3-", 17)==0 ){.
1b2e0 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1b2f0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20  PEN_APPENDVFS;. 
1b300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65   }else{.    fsee
1b310 6b 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45  k(f, -22, SEEK_E
1b320 4e 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65  ND);.    n = fre
1b330 61 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20  ad(zBuf, 22, 1, 
1b340 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31  f);.    if( n==1
1b350 20 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35   && zBuf[0]==0x5
1b360 30 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78  0 && zBuf[1]==0x
1b370 34 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30  4b && zBuf[2]==0
1b380 78 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42  x05.       && zB
1b390 75 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20  uf[3]==0x06 ){. 
1b3a0 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f       rc = SHELL_
1b3b0 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20  OPEN_ZIPFILE;.  
1b3c0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30    }else if( n==0
1b3d0 20 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73   && dfltZip && s
1b3e0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
1b3f0 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d  %.zip",zName,0)=
1b400 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1b410 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  rn SHELL_OPEN_ZI
1b420 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  PFILE;.    }.  }
1b430 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20  .  fclose(f);.  
1b440 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a  return rc;  .}..
1b450 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1b460 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1b470 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20  open.  If it is 
1b480 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69  not, then open i
1b490 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61  t.  If.** the da
1b4a0 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20  tabase fails to 
1b4b0 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65  open, print an e
1b4c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
1b4d0 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   exit..*/.static
1b4e0 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68   void open_db(Sh
1b4f0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
1b500 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20 69   keepAlive){.  i
1b510 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
1b520 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f     if( p->openMo
1b530 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  de==SHELL_OPEN_U
1b540 4e 53 50 45 43 20 26 26 20 61 63 63 65 73 73 28  NSPEC && access(
1b550 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 30  p->zDbFilename,0
1b560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
1b570 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29  >openMode = (u8)
1b580 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79  deduceDatabaseTy
1b590 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  pe(p->zDbFilenam
1b5a0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
1b5b0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e   switch( p->open
1b5c0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Mode ){.      ca
1b5d0 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  se SHELL_OPEN_AP
1b5e0 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20  PENDVFS: {.     
1b5f0 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
1b600 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
1b610 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20  e, &p->db, .    
1b620 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b630 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1b640 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1b650 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20   "apndvfs");.   
1b660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b670 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1b680 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1b690 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1b6a0 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f  ite3_open(":memo
1b6b0 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  ry:", &p->db);. 
1b6c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1b6e0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44   SHELL_OPEN_READ
1b6f0 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20  ONLY: {.        
1b700 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
1b710 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1b720 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f  &p->db, SQLITE_O
1b730 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29  PEN_READONLY, 0)
1b740 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1b750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1b760 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  ase SHELL_OPEN_U
1b770 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73  NSPEC:.      cas
1b780 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  e SHELL_OPEN_NOR
1b790 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MAL: {.        s
1b7a0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a  qlite3_open(p->z
1b7b0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
1b7c0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1b7d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b7e0 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d  }.    globalDb =
1b7f0 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
1b800 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49  p->db==0 || SQLI
1b810 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
1b820 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
1b830 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1b840 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
1b850 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  : unable to open
1b860 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1b870 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %s\n",.       
1b880 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
1b890 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
1b8a0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
1b8b0 20 69 66 28 20 6b 65 65 70 41 6c 69 76 65 20 29   if( keepAlive )
1b8c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 65   return;.      e
1b8d0 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69  xit(1);.    }.#i
1b8e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b8f0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1b900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61  .    sqlite3_ena
1b910 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
1b920 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65  on(p->db, 1);.#e
1b930 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
1b940 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e  _fileio_init(p->
1b950 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
1b960 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f  qlite3_shathree_
1b970 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1b980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1b990 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70  ompletion_init(p
1b9a0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66  ->db, 0, 0);.#if
1b9b0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
1b9c0 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33  ZLIB.    sqlite3
1b9d0 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d  _zipfile_init(p-
1b9e0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
1b9f0 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e  sqlite3_sqlar_in
1ba00 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1ba10 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
1ba20 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1ba30 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
1ba40 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 33  l_add_schema", 3
1ba50 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1ba60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
1ba80 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65  ellAddSchemaName
1ba90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1baa0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1bab0 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
1bac0 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
1bad0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1bae0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68    shellModuleSch
1bb10 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ema, 0, 0);.    
1bb20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1bb30 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1bb40 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31  shell_putsnl", 1
1bb50 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70  , SQLITE_UTF8, p
1bb60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
1bb80 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20  ellPutsFunc, 0, 
1bb90 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
1bba0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
1bbb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
1bbc0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
1bbd0 64 62 2c 20 22 65 64 69 74 22 2c 20 31 2c 20 53  db, "edit", 1, S
1bbe0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46             editF
1bc10 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
1bc20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1bc30 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1bc40 65 64 69 74 22 2c 20 32 2c 20 53 51 4c 49 54 45  edit", 2, SQLITE
1bc50 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20        editFunc, 
1bc80 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
1bc90 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
1bca0 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  e==SHELL_OPEN_ZI
1bcb0 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 63  PFILE ){.      c
1bcc0 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
1bcd0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
1bce0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49        "CREATE VI
1bcf0 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69 70 20  RTUAL TABLE zip 
1bd00 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51  USING zipfile(%Q
1bd10 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  );", p->zDbFilen
1bd20 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
1bd30 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
1bd40 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
1bd50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1bd60 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
1bd70 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f    }.}..#if HAVE_
1bd80 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45  READLINE || HAVE
1bd90 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20  _EDITLINE./*.** 
1bda0 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74  Readline complet
1bdb0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f  ion callbacks.*/
1bdc0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
1bdd0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
1bde0 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73  n_generator(cons
1bdf0 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e  t char *text, in
1be00 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74  t state){.  stat
1be10 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
1be20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1be30 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20  ar *zRet;.  if( 
1be40 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  state==0 ){.    
1be50 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
1be60 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1be70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71  (pStmt);.    zSq
1be80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1be90 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
1bea0 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
1beb0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
1bee0 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29  M completion(%Q)
1bef0 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65   ORDER BY 1", te
1bf00 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
1bf10 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62  _prepare_v2(glob
1bf20 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  alDb, zSql, -1, 
1bf30 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
1bf40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1bf50 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  l);.  }.  if( sq
1bf60 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1bf70 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1bf80 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64  .    zRet = strd
1bf90 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  up((const char*)
1bfa0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1bfb0 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
1bfc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1bfd0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1bfe0 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
1bff0 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  = 0;.    zRet = 
1c000 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c010 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63  zRet;.}.static c
1c020 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63  har **readline_c
1c030 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20  ompletion(const 
1c040 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
1c050 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e   iStart, int iEn
1c060 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74  d){.  rl_attempt
1c070 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76  ed_completion_ov
1c080 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  er = 1;.  return
1c090 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d   rl_completion_m
1c0a0 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65  atches(zText, re
1c0b0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
1c0c0 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a  n_generator);.}.
1c0d0 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45  .#elif HAVE_LINE
1c0e0 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65  NOISE./*.** Line
1c0f0 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  noise completion
1c100 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
1c110 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69  tic void linenoi
1c120 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  se_completion(co
1c130 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  nst char *zLine,
1c140 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65   linenoiseComple
1c150 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e  tions *lc){.  in
1c160 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e  t nLine = strlen
1c170 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74  30(zLine);.  int
1c180 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71   i, iStart;.  sq
1c190 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c1a0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
1c1b0 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1c1c0 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e  [1000];..  if( n
1c1d0 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66  Line>sizeof(zBuf
1c1e0 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )-30 ) return;. 
1c1f0 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
1c200 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  .' ) return;.  f
1c210 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e  or(i=nLine-1; i>
1c220 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a  =0 && (isalnum(z
1c230 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e  Line[i]) || zLin
1c240 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29  e[i]=='_'); i--)
1c250 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e  {}.  if( i==nLin
1c260 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  e-1 ) return;.  
1c270 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
1c280 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
1c290 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a  ne, iStart);.  z
1c2a0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1c2b0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
1c2c0 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
1c2d0 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
1c2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c2f0 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
1c300 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c  M completion(%Q,
1c310 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
1c320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c330 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65            &zLine
1c340 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29  [iStart], zLine)
1c350 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1c360 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c  are_v2(globalDb,
1c370 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1c380 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
1c390 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73  _free(zSql);.  s
1c3a0 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62  qlite3_exec(glob
1c3b0 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61  alDb, "PRAGMA pa
1c3c0 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c  ge_count", 0, 0,
1c3d0 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65   0); /* Load the
1c3e0 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69   schema */.  whi
1c3f0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
1c400 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
1c410 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
1c420 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69   char *zCompleti
1c430 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  on = (const char
1c440 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1c450 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
1c460 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65  .    int nComple
1c470 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  tion = sqlite3_c
1c480 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1c490 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  t, 0);.    if( i
1c4a0 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f  Start+nCompletio
1c4b0 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  n < sizeof(zBuf)
1c4c0 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -1 ){.      memc
1c4d0 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20  py(zBuf+iStart, 
1c4e0 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f  zCompletion, nCo
1c4f0 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20  mpletion+1);.   
1c500 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43     linenoiseAddC
1c510 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42  ompletion(lc, zB
1c520 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
1c530 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1c540 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64  e(pStmt);.}.#end
1c550 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  if../*.** Do C-l
1c560 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
1c570 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
1c580 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d    \a    -> alarm
1c590 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20  .**    \b    -> 
1c5a0 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20  backspace.**    
1c5b0 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20  \t    -> tab.** 
1c5c0 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c     \n    -> newl
1c5d0 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20  ine.**    \v    
1c5e0 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a  -> vertical tab.
1c5f0 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66  **    \f    -> f
1c600 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c  orm feed.**    \
1c610 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65  r    -> carriage
1c620 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73   return.**    \s
1c630 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20      -> space.** 
1c640 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a     \"    -> ".**
1c650 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a      \'    -> '.*
1c660 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61  *    \\    -> ba
1c670 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e  ckslash.**    \N
1c680 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61  NN  -> ascii cha
1c690 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63  racter NNN in oc
1c6a0 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  tal.*/.static vo
1c6b0 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73  id resolve_backs
1c6c0 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b  lashes(char *z){
1c6d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
1c6e0 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20  har c;.  while( 
1c6f0 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29  *z && *z!='\\' )
1c700 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d   z++;.  for(i=j=
1c710 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
1c720 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1c730 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20   if( c=='\\' && 
1c740 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  z[i+1]!=0 ){.   
1c750 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
1c760 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20       if( c=='a' 
1c770 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1c780 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \a';.      }else
1c790 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20   if( c=='b' ){. 
1c7a0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b         c = '\b';
1c7b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c7c0 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20   c=='t' ){.     
1c7d0 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20     c = '\t';.   
1c7e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1c7f0 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'n' ){.        c
1c800 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d   = '\n';.      }
1c810 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20  else if( c=='v' 
1c820 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1c830 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \v';.      }else
1c840 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20   if( c=='f' ){. 
1c850 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b         c = '\f';
1c860 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c870 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
1c880 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
1c890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1c8a0 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '"' ){.        c
1c8b0 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65   = '"';.      }e
1c8c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
1c8d0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1c8e0 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \'';.      }else
1c8f0 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
1c900 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27          c = '\\'
1c910 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c920 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
1c930 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  7' ){.        c 
1c940 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20  -= '0';.        
1c950 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
1c960 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
1c970 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  {.          i++;
1c980 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28  .          c = (
1c990 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
1c9a0 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0';.          if
1c9b0 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
1c9c0 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
1c9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
1c9f0 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
1ca00 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
1ca10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ca20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
1ca30 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66  j] = c;.  }.  if
1ca40 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30  ( j<i ) z[j] = 0
1ca50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
1ca60 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74  pret zArg as eit
1ca70 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  her an integer o
1ca80 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  r a boolean valu
1ca90 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20  e.  Return 1 or 
1caa0 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e  0.** for TRUE an
1cab0 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e  d FALSE.  Return
1cac0 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
1cad0 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ue if appropriat
1cae0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1caf0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f   booleanValue(co
1cb00 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
1cb10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1cb20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20  zArg[0]=='0' && 
1cb30 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a  zArg[1]=='x' ){.
1cb40 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78      for(i=2; hex
1cb50 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
1cb60 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20  i])>=0; i++){}. 
1cb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
1cb80 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30  i=0; zArg[i]>='0
1cb90 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39  ' && zArg[i]<='9
1cba0 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20  '; i++){}.  }.  
1cbb0 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b  if( i>0 && zArg[
1cbc0 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  i]==0 ) return (
1cbd0 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75  int)(integerValu
1cbe0 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66 66  e(zArg) & 0xffff
1cbf0 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c  ffff);.  if( sql
1cc00 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
1cc10 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73  g, "on")==0 || s
1cc20 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1cc30 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b  Arg,"yes")==0 ){
1cc40 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
1cc50 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1cc60 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
1cc70 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  off")==0 || sqli
1cc80 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1cc90 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"no")==0 ){.   
1cca0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1ccb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1ccc0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74  err, "ERROR: Not
1ccd0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1cce0 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69  : \"%s\". Assumi
1ccf0 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20  ng \"no\".\n",. 
1cd00 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a           zArg);.
1cd10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1cd20 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61  *.** Set or clea
1cd30 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61  r a shell flag a
1cd40 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f  ccording to a bo
1cd50 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
1cd60 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f  static void setO
1cd70 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c  rClearFlag(Shell
1cd80 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e  State *p, unsign
1cd90 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20  ed mFlag, const 
1cda0 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69  char *zArg){.  i
1cdb0 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
1cdc0 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65  zArg) ){.    She
1cdd0 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c  llSetFlag(p, mFl
1cde0 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ag);.  }else{.  
1cdf0 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
1ce00 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a  (p, mFlag);.  }.
1ce10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1ce20 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61  n output file, a
1ce30 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f  ssuming it is no
1ce40 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f  t stderr or stdo
1ce50 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
1ce60 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c  d output_file_cl
1ce70 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  ose(FILE *f){.  
1ce80 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f  if( f && f!=stdo
1ce90 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20  ut && f!=stderr 
1cea0 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a  ) fclose(f);.}..
1ceb0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65  /*.** Try to ope
1cec0 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  n an output file
1ced0 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73  .   The names "s
1cee0 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65  tdout" and "stde
1cef0 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67  rr" are.** recog
1cf00 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65  nized and do the
1cf10 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e   right thing.  N
1cf20 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1cf30 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  if the output.**
1cf40 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66   filename is "of
1cf50 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49  f"..*/.static FI
1cf60 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f  LE *output_file_
1cf70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
1cf80 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78  *zFile, int bTex
1cf90 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a  tMode){.  FILE *
1cfa0 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  f;.  if( strcmp(
1cfb0 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d  zFile,"stdout")=
1cfc0 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
1cfd0 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  dout;.  }else if
1cfe0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
1cff0 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
1d000 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a      f = stderr;.
1d010 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1d020 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29  mp(zFile, "off")
1d030 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30  ==0 ){.    f = 0
1d040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1d050 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
1d060 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20  bTextMode ? "w" 
1d070 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28  : "wb");.    if(
1d080 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75   f==0 ){.      u
1d090 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1d0a0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
1d0b0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
1d0c0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
1d0d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a    }.  return f;.
1d0e0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
1d0f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1d100 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
1d110 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1d120 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a  ING_POINT)./*.**
1d130 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68   A routine for h
1d140 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66  andling output f
1d150 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63  rom sqlite3_trac
1d160 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1d170 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  nt sql_trace_cal
1d180 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65  lback(.  unsigne
1d190 64 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69 64 20  d mType,.  void 
1d1a0 2a 70 41 72 67 2c 0a 20 20 76 6f 69 64 20 2a 70  *pArg,.  void *p
1d1b0 50 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a 29 7b  P,.  void *pX.){
1d1c0 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 28 46 49  .  FILE *f = (FI
1d1d0 4c 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e 55 53  LE*)pArg;.  UNUS
1d1e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 54 79  ED_PARAMETER(mTy
1d1f0 70 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  pe);.  UNUSED_PA
1d200 52 41 4d 45 54 45 52 28 70 50 29 3b 0a 20 20 69  RAMETER(pP);.  i
1d210 66 28 20 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73  f( f ){.    cons
1d220 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
1d230 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 20  st char*)pX;.   
1d240 20 69 6e 74 20 69 20 3d 20 73 74 72 6c 65 6e 33   int i = strlen3
1d250 30 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  0(z);.    while(
1d260 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d   i>0 && z[i-1]==
1d270 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ';' ){ i--; }.  
1d280 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c    utf8_printf(f,
1d290 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a   "%.*s;\n", i, z
1d2a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d2b0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
1d2c0 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  ** A no-op routi
1d2d0 6e 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74  ne that runs wit
1d2e0 68 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69  h the ".breakpoi
1d2f0 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e  nt" doc-command.
1d300 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75    This is.** a u
1d310 73 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65  seful spot to se
1d320 74 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65  t a debugger bre
1d330 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
1d340 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65  ic void test_bre
1d350 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20  akpoint(void){. 
1d360 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c   static int nCal
1d370 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b  l = 0;.  nCall++
1d380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  ;.}../*.** An ob
1d390 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61  ject used to rea
1d3a0 64 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65  d a CSV and othe
1d3b0 72 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f  r files for impo
1d3c0 72 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  rt..*/.typedef s
1d3d0 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20  truct ImportCtx 
1d3e0 49 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  ImportCtx;.struc
1d3f0 74 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20  t ImportCtx {.  
1d400 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1d410 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
1d420 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
1d430 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
1d440 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
1d450 68 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d  he CSV text from
1d460 20 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65   this input stre
1d470 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  am */.  char *z;
1d480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d490 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20  ccumulated text 
1d4a0 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20  for a field */. 
1d4b0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
1d4c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d4d0 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a  f bytes in z */.
1d4e0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
1d4f0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
1d500 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d  llocated for z[]
1d510 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b   */.  int nLine;
1d520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1d530 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  rent line number
1d540 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69   */.  int bNotFi
1d550 72 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  rst;      /* Tru
1d560 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e if one or more
1d570 20 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72   bytes already r
1d580 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65  ead */.  int cTe
1d590 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
1d5a0 43 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  Character that t
1d5b0 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f  erminated the mo
1d5c0 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20  st recent field 
1d5d0 2a 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70  */.  int cColSep
1d5e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1d5f0 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
1d600 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73   character.  (Us
1d610 75 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20  ually ",") */.  
1d620 69 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20  int cRowSep;    
1d630 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73      /* The row s
1d640 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
1d650 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c  er.  (Usually "\
1d660 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70  n") */.};../* Ap
1d670 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79  pend a single by
1d680 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61  te to z[] */.sta
1d690 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f  tic void import_
1d6a0 61 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f  append_char(Impo
1d6b0 72 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29  rtCtx *p, int c)
1d6c0 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d  {.  if( p->n+1>=
1d6d0 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
1d6e0 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d   p->nAlloc += p-
1d6f0 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20  >nAlloc + 100;. 
1d700 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65     p->z = sqlite
1d710 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a  3_realloc64(p->z
1d720 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20  , p->nAlloc);.  
1d730 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20    if( p->z==0 ) 
1d740 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
1d750 6f 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ory();.  }.  p->
1d760 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61  z[p->n++] = (cha
1d770 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20  r)c;.}../* Read 
1d780 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f  a single field o
1d790 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d  f CSV text.  Com
1d7a0 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63  patible with rfc
1d7b0 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65  4180 and extende
1d7c0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70  d.** with the op
1d7d0 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61  tion of having a
1d7e0 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72   separator other
1d7f0 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a   than ","..**.**
1d800 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
1d810 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
1d820 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
1d830 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
1d840 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
1d850 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
1d860 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
1d870 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
1d880 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
1d890 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
1d8a0 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
1d8b0 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
1d8c0 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20   is ","..**   + 
1d8d0 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20   Use p->rSep as 
1d8e0 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
1d8f0 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
1d900 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20  is "\n"..**   + 
1d910 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
1d920 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
1d930 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
1d940 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
1d950 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
1d960 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
1d970 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
1d980 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
1d990 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
1d9a0 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
1d9b0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
1d9c0 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
1d9d0 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
1d9e0 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f  CDECL csv_read_o
1d9f0 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
1da00 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
1da10 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
1da20 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
1da30 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
1da40 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
1da50 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1da60 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
1da70 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
1da80 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
1da90 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
1daa0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1dab0 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e  c=='"' ){.    in
1dac0 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69  t pc, ppc;.    i
1dad0 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70  nt startLine = p
1dae0 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74  ->nLine;.    int
1daf0 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20   cQuote = c;.   
1db00 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20   pc = ppc = 0;. 
1db10 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
1db20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
1db30 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
1db40 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c   c==rSep ) p->nL
1db50 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
1db60 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20   c==cQuote ){.  
1db70 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
1db80 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
1db90 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    pc = 0;.      
1dba0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1dbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1dbc0 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53        if( (c==cS
1dbd0 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
1dbe0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1dbf0 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  rSep && pc==cQuo
1dc00 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
1dc10 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c  ==rSep && pc=='\
1dc20 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74  r' && ppc==cQuot
1dc30 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
1dc40 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f  =EOF && pc==cQuo
1dc50 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  te).      ){.   
1dc60 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b       do{ p->n--;
1dc70 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d   }while( p->z[p-
1dc80 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20  >n]!=cQuote );. 
1dc90 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
1dca0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
1dcb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1dcc0 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
1dcd0 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20   && c!='\r' ){. 
1dce0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1dcf0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
1dd00 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20  d: unescaped %c 
1dd10 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20  character\n",.  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1dd30 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65  >zFile, p->nLine
1dd40 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20  , cQuote);.     
1dd50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
1dd60 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75  EOF ){.        u
1dd70 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1dd80 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72  r, "%s:%d: unter
1dd90 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65  minated %c-quote
1dda0 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20  d field\n",.    
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
1ddc0 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
1ddd0 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
1dde0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
1ddf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1de00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70       }.      imp
1de10 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
1de20 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63  p, c);.      ppc
1de30 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20   = pc;.      pc 
1de40 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = c;.    }.  }el
1de50 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1de60 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1de70 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73  field being pars
1de80 65 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73  ed and it begins
1de90 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a   with the.    **
1dea0 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45   UTF-8 BOM  (0xE
1deb0 46 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b  F BB BF) then sk
1dec0 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20  ip the BOM */.  
1ded0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1dee0 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46  0xef && p->bNotF
1def0 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
1df00 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1df10 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
1df20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1df30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26  );.      if( (c&
1df40 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20  0xff)==0xbb ){. 
1df50 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70         import_ap
1df60 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
1df70 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65  .        c = fge
1df80 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
1df90 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d     if( (c&0xff)=
1dfa0 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20  =0xbf ){.       
1dfb0 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20     p->bNotFirst 
1dfc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
1dfd0 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
1dfe0 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65     return csv_re
1dff0 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b  ad_one_field(p);
1e000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e010 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69   }.    }.    whi
1e020 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
1e030 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
1e040 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
1e050 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
1e060 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
1e070 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1e080 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65  }.    if( c==rSe
1e090 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  p ){.      p->nL
1e0a0 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
1e0b0 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b   p->n>0 && p->z[
1e0c0 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  p->n-1]=='\r' ) 
1e0d0 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  p->n--;.    }.  
1e0e0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
1e0f0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29    }.  if( p->z )
1e100 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
1e110 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20  .  p->bNotFirst 
1e120 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 1;.  return p-
1e130 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  >z;.}../* Read a
1e140 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
1e150 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64   ASCII delimited
1e160 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b   text..**.**   +
1e170 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
1e180 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
1e190 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1e1a0 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
1e1b0 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
1e1c0 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
1e1d0 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
1e1e0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1e1f0 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
1e200 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
1e210 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
1e220 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
1e230 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1F"..**   +  
1e240 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
1e250 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
1e260 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1e270 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b  s "\x1E"..**   +
1e280 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
1e290 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69  the row number i
1e2a0 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
1e2b0 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
1e2c0 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
1e2d0 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
1e2e0 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
1e2f0 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
1e300 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
1e310 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
1e320 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
1e330 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
1e340 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
1e350 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64  CDECL ascii_read
1e360 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
1e370 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
1e380 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
1e390 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
1e3a0 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
1e3b0 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
1e3c0 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
1e3d0 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
1e3e0 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
1e3f0 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
1e400 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
1e410 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68  turn 0;.  }.  wh
1e420 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63  ile( c!=EOF && c
1e430 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65  !=cSep && c!=rSe
1e440 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f  p ){.    import_
1e450 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1e460 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63  );.    c = fgetc
1e470 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69  (p->in);.  }.  i
1e480 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
1e490 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
1e4a0 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63  }.  p->cTerm = c
1e4b0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  ;.  if( p->z ) p
1e4c0 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
1e4d0 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a   return p->z;.}.
1e4e0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
1e4f0 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20  ansfer data for 
1e500 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49  table zTable.  I
1e510 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
1e520 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69  en while.** movi
1e530 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20  ng forward, try 
1e540 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e  to go backwards.
1e550 20 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20    The backwards 
1e560 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a  movement won't.*
1e570 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f  * work for WITHO
1e580 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e  UT ROWID tables.
1e590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e5a0 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a  tryToCloneData(.
1e5b0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
1e5c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
1e5d0 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
1e5e0 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c  *zTable.){.  sql
1e5f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72  ite3_stmt *pQuer
1e600 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
1e610 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
1e620 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
1e630 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
1e640 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69  zInsert = 0;.  i
1e650 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
1e660 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62  j, n;.  int nTab
1e670 6c 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54  le = strlen30(zT
1e680 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d  able);.  int k =
1e690 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   0;.  int cnt = 
1e6a0 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  0;.  const int s
1e6b0 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b  pinRate = 10000;
1e6c0 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
1e6d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1e6e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
1e6f0 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  \"", zTable);.  
1e700 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1e710 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
1e720 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
1e730 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ry, 0);.  if( rc
1e740 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1e750 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1e760 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73  or %d: %s on [%s
1e770 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1e780 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
1e790 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
1e7a0 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
1e7b0 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
1e7c0 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1e7d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61     goto end_data
1e7e0 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d  _xfer;.  }.  n =
1e7f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e800 63 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20  count(pQuery);. 
1e810 20 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74   zInsert = sqlit
1e820 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20  e3_malloc64(200 
1e830 2b 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b  + nTable + n*3);
1e840 0a 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d  .  if( zInsert==
1e850 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
1e860 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c  _memory();.  sql
1e870 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
1e880 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74  0+nTable,zInsert
1e890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e8a0 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
1e8b0 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73  IGNORE INTO \"%s
1e8c0 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54  \" VALUES(?", zT
1e8d0 61 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72  able);.  i = str
1e8e0 6c 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a  len30(zInsert);.
1e8f0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20    for(j=1; j<n; 
1e900 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  j++){.    memcpy
1e910 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22  (zInsert+i, ",?"
1e920 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32  , 2);.    i += 2
1e930 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a  ;.  }.  memcpy(z
1e940 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20  Insert+i, ");", 
1e950 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  3);.  rc = sqlit
1e960 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65  e3_prepare_v2(ne
1e970 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31  wDb, zInsert, -1
1e980 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a  , &pInsert, 0);.
1e990 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e9a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e9b0 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
1e9c0 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
1e9d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e9e0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1e9f0 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74  de(newDb), sqlit
1ea00 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
1ea10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51  ,.            zQ
1ea20 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20  uery);.    goto 
1ea30 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
1ea40 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c   }.  for(k=0; k<
1ea50 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69  2; k++){.    whi
1ea60 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
1ea70 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
1ea80 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1ea90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1eaa0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1eab0 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
1eac0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75  _column_type(pQu
1ead0 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  ery, i) ){.     
1eae0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1eaf0 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
1eb00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1eb10 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20  d_null(pInsert, 
1eb20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
1eb30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1eb40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
1eb50 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
1eb60 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
1eb70 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1eb80 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b  nt64(pInsert, i+
1eb90 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  1, sqlite3_colum
1eba0 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69  n_int64(pQuery,i
1ebb0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1ebc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1ebd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
1ebe0 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
1ebf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1ec00 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
1ec10 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  e(pInsert, i+1, 
1ec20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1ec30 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29  ouble(pQuery,i))
1ec40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1ec50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1ec60 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1ec70 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
1ec80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ec90 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e  e3_bind_text(pIn
1eca0 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20  sert, i+1,.     
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
1ecd0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1ece0 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1ecf0 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1ed20 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
1ed30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ed40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
1ed50 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
1ed60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1ed70 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
1ed80 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
1ed90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1eda0 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  b(pQuery,i),.   
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ede0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51  _column_bytes(pQ
1edf0 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54       SQLITE_STAT
1ee30 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
1ee40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ee50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1ee60 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72      } /* End for
1ee70 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1ee80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
1ee90 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ert);.      if( 
1eea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1eeb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1eec0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  && rc!=SQLITE_DO
1eed0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  NE ){.        ut
1eee0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1eef0 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c  , "Error %d: %s\
1ef00 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65  n", sqlite3_exte
1ef10 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77  nded_errcode(new
1ef20 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Db),.           
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1ef40 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44  ite3_errmsg(newD
1ef50 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b));.      }.   
1ef60 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
1ef70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
1ef80 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
1ef90 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29  ( (cnt%spinRate)
1efa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1efb0 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c  rintf("%c\b", "|
1efc0 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52  /-\\"[(cnt/spinR
1efd0 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20  ate)%4]);.      
1efe0 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
1eff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1f000 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* End while */.
1f010 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f020 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b  TE_DONE ) break;
1f030 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
1f040 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
1f050 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f060 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75  zQuery);.    zQu
1f070 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1f080 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
1f090 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45  FROM \"%w\" ORDE
1f0a0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b  R BY rowid DESC;
1f0b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20  zTable);.    rc 
1f0e0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1f0f0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
1f100 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
1f110 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1f120 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
1f130 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
1f140 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74  rning: cannot st
1f150 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61  ep \"%s\" backwa
1f160 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  rds", zTable);. 
1f170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f180 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72  }.  } /* End for
1f190 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64  (k=0...) */..end
1f1a0 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71  _data_xfer:.  sq
1f1b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1f1c0 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65  Query);.  sqlite
1f1d0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65  3_finalize(pInse
1f1e0 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rt);.  sqlite3_f
1f1f0 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73  ree(zQuery);.  s
1f200 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
1f210 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ert);.}.../*.** 
1f220 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
1f230 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
1f240 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63  schema that matc
1f250 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a  h zWhere.  For.*
1f260 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f  * each row, invo
1f270 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e  ke xForEach() on
1f280 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69   the object defi
1f290 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e  ned by that row.
1f2a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1f2b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
1f2c0 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77  hile moving forw
1f2d0 61 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a  ard through the.
1f2e0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
1f2f0 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69   table, try agai
1f300 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72  n moving backwar
1f310 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
1f320 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68  id tryToCloneSch
1f330 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ema(.  ShellStat
1f340 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20  e *p,.  sqlite3 
1f350 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20  *newDb,.  const 
1f360 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20  char *zWhere,.  
1f370 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29  void (*xForEach)
1f380 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c  (ShellState*,sql
1f390 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ite3*,const char
1f3a0 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
1f3b0 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
1f3c0 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
1f3d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1f3e0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1f3f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
1f400 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1f410 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
1f420 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
1f430 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
1f440 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1f450 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
1f460 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1f470 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
1f490 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65  HERE %s", zWhere
1f4a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1f4b0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1f4c0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1f4d0 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
1f4e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1f4f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1f500 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73   "Error: (%d) %s
1f510 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1f540 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1f550 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1f560 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
1f580 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1f590 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a  nd_schema_xfer;.
1f5a0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63    }.  while( (rc
1f5b0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1f5c0 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
1f5d0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  _ROW ){.    zNam
1f5e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
1f5f0 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
1f600 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0);.    zSql = s
1f610 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1f620 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20  xt(pQuery, 1);. 
1f630 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e     printf("%s...
1f640 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75   ", zName); fflu
1f650 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
1f660 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1f670 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1f680 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
1f690 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
1f6a0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
1f6b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1f6c0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
1f6d0 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  nSQL: [%s]\n", z
1f6e0 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20  ErrMsg, zSql);. 
1f6f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1f700 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
1f710 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
1f720 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f     }.    if( xFo
1f730 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78  rEach ){.      x
1f740 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62  ForEach(p, newDb
1f750 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
1f760 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
1f770 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22   printf("done\n"
1f780 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1f790 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1f7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1f7b0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1f7c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f7d0 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
1f7e0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1f7f0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
1f800 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
1f810 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
1f840 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
1f850 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29  d DESC", zWhere)
1f860 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f870 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1f880 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1f890 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1f8a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f8b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1f8c0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25  derr, "Error: (%
1f8d0 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d) %s on [%s]\n"
1f8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1f900 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1f910 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
1f920 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1f950 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63       goto end_sc
1f960 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d  hema_xfer;.    }
1f970 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
1f980 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1f990 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
1f9a0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ROW ){.      zNa
1f9b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  me = sqlite3_col
1f9c0 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1f9d0 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20   0);.      zSql 
1f9e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1f9f0 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29  _text(pQuery, 1)
1fa00 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
1fa10 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b  %s... ", zName);
1fa20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
1fa30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
1fa40 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73  xec(newDb, (cons
1fa50 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c  t char*)zSql, 0,
1fa60 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
1fa70 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
1fa80 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1fa90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1faa0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a  "Error: %s\nSQL:
1fab0 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73   [%s]\n", zErrMs
1fac0 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  g, zSql);.      
1fad0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1fae0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
1faf0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
1fb00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1fb10 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20  xForEach ){.    
1fb20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20      xForEach(p, 
1fb30 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
1fb40 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ar*)zName);.    
1fb50 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
1fb60 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20  ("done\n");.    
1fb70 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61  }.  }.end_schema
1fb80 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33  _xfer:.  sqlite3
1fb90 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
1fba0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1fbb0 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a  e(zQuery);.}../*
1fbc0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
1fbd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1fbe0 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72  ed "zNewDb".  Tr
1fbf0 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20  y to recover as 
1fc00 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  much information
1fc10 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20  .** as possible 
1fc20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
1fc30 64 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20  database (which 
1fc40 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74  might be corrupt
1fc50 29 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a  ) and write it.*
1fc60 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a  * into zNewDb..*
1fc70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
1fc80 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74  yToClone(ShellSt
1fc90 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
1fca0 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69  ar *zNewDb){.  i
1fcb0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1fcc0 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69   *newDb = 0;.  i
1fcd0 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62  f( access(zNewDb
1fce0 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ,0)==0 ){.    ut
1fcf0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1fd00 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61  , "File \"%s\" a
1fd10 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e  lready exists.\n
1fd20 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20  ", zNewDb);.    
1fd30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
1fd40 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
1fd50 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b  zNewDb, &newDb);
1fd60 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1fd70 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1fd80 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65  err, "Cannot cre
1fd90 61 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62  ate output datab
1fda0 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ase: %s\n",.    
1fdb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1fdc0 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a  errmsg(newDb));.
1fdd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1fde0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1fdf0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
1fe00 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30  e_schema=ON;", 0
1fe10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1fe20 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1fe30 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
1fe40 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  E;", 0, 0, 0);. 
1fe50 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68     tryToCloneSch
1fe60 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74  ema(p, newDb, "t
1fe70 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72  ype='table'", tr
1fe80 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20  yToCloneData);. 
1fe90 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68     tryToCloneSch
1fea0 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74  ema(p, newDb, "t
1feb0 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30  ype!='table'", 0
1fec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
1fed0 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d  xec(newDb, "COMM
1fee0 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  IT;", 0, 0, 0);.
1fef0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1ff00 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
1ff10 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
1ff20 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  OFF;", 0, 0, 0);
1ff30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63  .  }.  sqlite3_c
1ff40 6c 6f 73 65 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a  lose(newDb);.}..
1ff50 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1ff60 20 6f 75 74 70 75 74 20 66 69 6c 65 20 62 61 63   output file bac
1ff70 6b 20 74 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a  k to stdout..**.
1ff80 2a 2a 20 49 66 20 74 68 65 20 70 2d 3e 64 6f 58  ** If the p->doX
1ff90 64 67 4f 70 65 6e 20 66 6c 61 67 20 69 73 20 73  dgOpen flag is s
1ffa0 65 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  et, that means t
1ffb0 68 65 20 6f 75 74 70 75 74 20 77 61 73 20 62 65  he output was be
1ffc0 69 6e 67 0a 2a 2a 20 72 65 64 69 72 65 63 74 65  ing.** redirecte
1ffd0 64 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  d to a temporary
1ffe0 20 66 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 70   file named by p
1fff0 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e  ->zTempFile.  In
20000 20 74 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c   that case,.** l
20010 61 75 6e 63 68 20 73 74 61 72 74 2f 6f 70 65 6e  aunch start/open
20020 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61  /xdg-open on tha
20030 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
20040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20050 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68   output_reset(Sh
20060 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
20070 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30  if( p->outfile[0
20080 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65  ]=='|' ){.#ifnde
20090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
200a0 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70  PEN.    pclose(p
200b0 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20  ->out);.#endif. 
200c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70   }else{.    outp
200d0 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
200e0 3e 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  >out);.#ifndef S
200f0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
20100 54 45 4d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  TEM.    if( p->d
20110 6f 58 64 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20  oXdgOpen ){.    
20120 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58    const char *zX
20130 64 67 4f 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20  dgOpenCmd =.#if 
20140 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
20150 20 20 20 20 20 20 22 73 74 61 72 74 22 3b 0a 23        "start";.#
20160 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
20170 50 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f  PPLE__).      "o
20180 70 65 6e 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  pen";.#else.    
20190 20 20 22 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65    "xdg-open";.#e
201a0 6e 64 69 66 0a 20 20 20 20 20 20 63 68 61 72 20  ndif.      char 
201b0 2a 7a 43 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d  *zCmd;.      zCm
201c0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
201d0 6e 74 66 28 22 25 73 20 25 73 22 2c 20 7a 58 64  ntf("%s %s", zXd
201e0 67 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65  gOpenCmd, p->zTe
201f0 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  mpFile);.      i
20200 66 28 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20  f( system(zCmd) 
20210 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
20220 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20230 46 61 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c  Failed: [%s]\n",
20240 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a   zCmd);.      }.
20250 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20260 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20  ee(zCmd);.      
20270 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 70 29  outputModePop(p)
20280 3b 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67  ;.      p->doXdg
20290 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Open = 0;.    }.
202a0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
202b0 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ed(SQLITE_NOHAVE
202c0 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a  _SYSTEM) */.  }.
202d0 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20    p->outfile[0] 
202e0 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20  = 0;.  p->out = 
202f0 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stdout;.}../*.**
20300 20 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d   Run an SQL comm
20310 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74  and and return t
20320 68 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65  he single intege
20330 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  r result..*/.sta
20340 74 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53  tic int db_int(S
20350 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
20360 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
20370 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20380 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65  *pStmt;.  int re
20390 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  s = 0;.  sqlite3
203a0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
203b0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
203c0 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  tmt, 0);.  if( p
203d0 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f  Stmt && sqlite3_
203e0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
203f0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72  ITE_ROW ){.    r
20400 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  es = sqlite3_col
20410 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29  umn_int(pStmt,0)
20420 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
20430 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
20440 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
20450 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
20460 61 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79  a 2-byte or 4-by
20470 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
20480 74 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74  teger into a nat
20490 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73  ive integer.*/.s
204a0 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
204b0 6e 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75  nt get2byteInt(u
204c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29  nsigned char *a)
204d0 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d  {.  return (a[0]
204e0 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73  <<8) + a[1];.}.s
204f0 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
20500 6e 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75  nt get4byteInt(u
20510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29  nsigned char *a)
20520 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d  {.  return (a[0]
20530 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31  <<24) + (a[1]<<1
20540 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b  6) + (a[2]<<8) +
20550 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   a[3];.}../*.** 
20560 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
20570 66 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f  f the ".info" co
20580 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  mmand..**.** Ret
20590 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20  urn 1 on error, 
205a0 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30  2 to exit, and 0
205b0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
205c0 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
205d0 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53  dbinfo_command(S
205e0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
205f0 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
20600 7a 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20  zArg){.  static 
20610 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63  const struct { c
20620 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
20630 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46  ; int ofst; } aF
20640 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ield[] = {.     
20650 7b 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63  { "file change c
20660 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d  ounter:",  24  }
20670 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61  ,.     { "databa
20680 73 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c  se page count:",
20690 20 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    28  },.     { 
206a0 22 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63  "freelist page c
206b0 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a  ount:",  36  },.
206c0 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63       { "schema c
206d0 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20  ookie:",        
206e0 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  40  },.     { "s
206f0 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20  chema format:", 
20700 20 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20         44  },.  
20710 20 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61     { "default ca
20720 63 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38  che size:",   48
20730 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74    },.     { "aut
20740 6f 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74  ovacuum top root
20750 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20  :",  52  },.    
20760 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20   { "incremental 
20770 76 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20  vacuum:",   64  
20780 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20  },.     { "text 
20790 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20  encoding:",     
207a0 20 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b     56  },.     {
207b0 20 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22   "user version:"
207c0 2c 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c  ,         60  },
207d0 0a 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61  .     { "applica
207e0 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20  tion id:",      
207f0 20 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   68  },.     { "
20800 73 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e  software version
20810 3a 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20  :",     96  },. 
20820 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
20830 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73  st struct { cons
20840 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63  t char *zName; c
20850 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
20860 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a   } aQuery[] = {.
20870 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f       { "number o
20880 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20  f tables:",.    
20890 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
208a0 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
208b0 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20  E type='table'" 
208c0 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65  },.     { "numbe
208d0 72 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a  r of indexes:",.
208e0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
208f0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
20900 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
20910 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  x'" },.     { "n
20920 75 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72  umber of trigger
20930 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  s:",.       "SEL
20940 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
20950 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d  M %s WHERE type=
20960 27 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20  'trigger'" },.  
20970 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
20980 76 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20  views:",.       
20990 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
209a0 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
209b0 79 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20  ype='view'" },. 
209c0 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69      { "schema si
209d0 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  ze:",.       "SE
209e0 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74  LECT total(lengt
209f0 68 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22  h(sql)) FROM %s"
20a00 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
20a10 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  ;.  char *zSchem
20a20 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44  aTab;.  char *zD
20a30 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  b = nArg>=2 ? az
20a40 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b  Arg[1] : "main";
20a50 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20a60 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e  *pStmt = 0;.  un
20a70 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64 72  signed char aHdr
20a80 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62  [100];.  open_db
20a90 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d  (p, 0);.  if( p-
20aa0 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
20ab0 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  1;.  sqlite3_pre
20ac0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53  pare_v2(p->db,"S
20ad0 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20  ELECT data FROM 
20ae0 73 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31  sqlite_dbpage(?1
20af0 29 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c  ) WHERE pgno=1",
20b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20b10 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
20b20 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
20b30 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
20b40 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c   1, zDb, -1, SQL
20b50 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69  ITE_STATIC);.  i
20b60 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
20b70 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
20b80 4f 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  OW.   && sqlite3
20b90 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
20ba0 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a  tmt,0)>100.  ){.
20bb0 20 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c      memcpy(aHdr,
20bc0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
20bd0 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31  blob(pStmt,0), 1
20be0 30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00);.    sqlite3
20bf0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
20c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20c10 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
20c20 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61  , "unable to rea
20c30 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
20c40 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  r\n");.    sqlit
20c50 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
20c60 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  t);.    return 1
20c70 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32  ;.  }.  i = get2
20c80 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29  byteInt(aHdr+16)
20c90 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69  ;.  if( i==1 ) i
20ca0 20 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38   = 65536;.  utf8
20cb0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
20cc0 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64  "%-20s %d\n", "d
20cd0 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
20ce0 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f  e:", i);.  utf8_
20cf0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
20d00 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72  %-20s %d\n", "wr
20d10 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48  ite format:", aH
20d20 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f  dr[18]);.  utf8_
20d30 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
20d40 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65  %-20s %d\n", "re
20d50 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  ad format:", aHd
20d60 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[19]);.  utf8_p
20d70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
20d80 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73  -20s %d\n", "res
20d90 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61  erved bytes:", a
20da0 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28  Hdr[20]);.  for(
20db0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
20dc0 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a  (aField); i++){.
20dd0 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61      int ofst = a
20de0 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20  Field[i].ofst;. 
20df0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
20e00 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e  val = get4byteIn
20e10 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a  t(aHdr + ofst);.
20e20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
20e30 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
20e40 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e  u", aField[i].zN
20e50 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73  ame, val);.    s
20e60 77 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20  witch( ofst ){. 
20e70 20 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a       case 56: {.
20e80 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
20e90 3d 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =1 ) raw_printf(
20ea0 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29  p->out, " (utf8)
20eb0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
20ec0 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69  val==2 ) raw_pri
20ed0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
20ee0 74 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20  tf16le)");.     
20ef0 20 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20     if( val==3 ) 
20f00 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
20f10 74 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29  t, " (utf16be)")
20f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20f30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
20f40 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
20f50 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29  }.  if( zDb==0 )
20f60 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
20f70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
20f80 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  tf("main.sqlite_
20f90 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73  master");.  }els
20fa0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62  e if( strcmp(zDb
20fb0 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20  ,"temp")==0 ){. 
20fc0 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
20fd0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20fe0 22 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65  "%s", "sqlite_te
20ff0 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d  mp_master");.  }
21000 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d  else{.    zSchem
21010 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTab = sqlite3_m
21020 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73  printf("\"%w\".s
21030 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a  qlite_master", z
21040 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Db);.  }.  for(i
21050 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
21060 61 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20  aQuery); i++){. 
21070 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
21080 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
21090 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20  aQuery[i].zSql, 
210a0 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20  zSchemaTab);.   
210b0 20 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e   int val = db_in
210c0 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  t(p, zSql);.    
210d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
210e0 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
210f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
21100 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79  0s %d\n", aQuery
21110 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b  [i].zName, val);
21120 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
21130 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b  ree(zSchemaTab);
21140 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21150 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
21160 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
21170 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74  errmsg() value t
21180 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
21190 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 1..*/.static
211a0 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61   int shellDataba
211b0 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20  seError(sqlite3 
211c0 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
211d0 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74  ar *zErr = sqlit
211e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20  e3_errmsg(db);. 
211f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
21200 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
21210 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74  n", zErr);.  ret
21220 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
21230 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74  Compare the patt
21240 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61  ern in zGlob[] a
21250 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20  gainst the text 
21260 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20  in z[].  Return 
21270 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20  TRUE.** if they 
21280 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20  match and FALSE 
21290 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e  (0) if they do n
212a0 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20  ot match..**.** 
212b0 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
212c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
212d0 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
212e0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
212f0 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
21300 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
21310 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
21320 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
21330 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
21340 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
21350 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
21360 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
21370 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
21380 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21390 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
213a0 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
213b0 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
213c0 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
213d0 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
213e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27  ..**.**      '#'
213f0 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
21400 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f  ny sequence of o
21410 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
21420 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20  s with an.**    
21430 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
21440 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e  onal + or - sign
21450 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20   in front.**.** 
21460 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41       ' '       A
21470 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65  ny span of white
21480 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e  space matches an
21490 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a  y other span of.
214a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
214b0 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a    whitespace..**
214c0 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73  .** Extra whites
214d0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
214e0 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65  of z[] is ignore
214f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21500 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63   testcase_glob(c
21510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
21520 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
21530 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
21540 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
21550 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c  nt seen;..  whil
21560 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62  e( (c = (*(zGlob
21570 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
21580 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
21590 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53  {.      if( !IsS
215a0 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72  pace(*z) ) retur
215b0 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  n 0;.      while
215c0 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62  ( IsSpace(*zGlob
215d0 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20  ) ) zGlob++;.   
215e0 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
215f0 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
21600 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a   }else if( c=='*
21610 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ' ){.      while
21620 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29  ( (c=(*(zGlob++)
21630 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d  )) == '*' || c==
21640 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '?' ){.        i
21650 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28  f( c=='?' && (*(
21660 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
21670 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
21680 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
21690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
216a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
216b0 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
216c0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
216d0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
216e0 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20  lob-1,z)==0 ){. 
216f0 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20           z++;.  
21700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21710 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a  return (*z)!=0;.
21720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
21730 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b  ile( (c2 = (*(z+
21740 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  +)))!=0 ){.     
21750 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20     while( c2!=c 
21760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
21770 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
21780 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
21790 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
217a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
217b0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
217c0 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20  lob,z) ) return 
217d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
217e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
217f0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20  else if( c=='?' 
21800 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28  ){.      if( (*(
21810 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
21820 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
21830 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
21840 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
21850 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   0;.      seen =
21860 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74   0;.      invert
21870 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 0;.      c = 
21880 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  *(z++);.      if
21890 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
218a0 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28  0;.      c2 = *(
218b0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
218c0 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
218d0 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
218e0 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
218f0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
21900 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
21910 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
21920 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
21930 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
21940 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
21950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
21960 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d  hile( c2 && c2!=
21970 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
21980 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47  f( c2=='-' && zG
21990 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  lob[0]!=']' && z
219a0 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72  Glob[0]!=0 && pr
219b0 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
219c0 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
219d0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b++);.          
219e0 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
219f0 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
21a00 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
21a10 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
21a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21a30 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
21a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
21a50 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
21a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
21a70 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
21a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
21a90 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
21aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21ab0 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e  c2==0 || (seen ^
21ac0 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65   invert)==0 ) re
21ad0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
21ae0 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a  e if( c=='#' ){.
21af0 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d        if( (z[0]=
21b00 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b  ='-' || z[0]=='+
21b10 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b  ') && IsDigit(z[
21b20 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  1]) ) z++;.     
21b30 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b   if( !IsDigit(z[
21b40 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  0]) ) return 0;.
21b50 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
21b60 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
21b70 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[0]) ){ z++; }.
21b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21b90 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29   if( c!=(*(z++))
21ba0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
21bb0 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
21bc0 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a  IsSpace(*z) ){ z
21bd0 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ++; }.  return *
21be0 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  z==0;.}.../*.** 
21bf0 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69  Compare the stri
21c00 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d  ng as a command-
21c10 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68  line option with
21c20 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74   either one or t
21c30 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d  wo.** initial "-
21c40 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  " characters..*/
21c50 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69  .static int opti
21c60 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
21c70 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
21c80 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69  char *zOpt){.  i
21c90 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20  f( zStr[0]!='-' 
21ca0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53  ) return 0;.  zS
21cb0 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72  tr++;.  if( zStr
21cc0 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b  [0]=='-' ) zStr+
21cd0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63  +;.  return strc
21ce0 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d  mp(zStr, zOpt)==
21cf0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
21d00 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  te a file..*/.in
21d10 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  t shellDeleteFil
21d20 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
21d30 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
21d40 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  rc;.#ifdef _WIN3
21d50 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d  2.  wchar_t *z =
21d60 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
21d70 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a  tf8_to_unicode(z
21d80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20  Filename);.  rc 
21d90 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20  = _wunlink(z);. 
21da0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
21db0 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75  ;.#else.  rc = u
21dc0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
21dd0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
21de0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
21df0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ry to delete the
21e00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
21e10 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65  (if there is one
21e20 29 20 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a  ) and free the.*
21e30 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f  * memory used to
21e40 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f   hold the name o
21e50 66 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e  f the temp file.
21e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21e70 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68  clearTempFile(Sh
21e80 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
21e90 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
21ea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
21eb0 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  if( p->doXdgOpen
21ec0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
21ed0 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
21ee0 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29  (p->zTempFile) )
21ef0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
21f00 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
21f10 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
21f20 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pFile = 0;.}../*
21f30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
21f40 20 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20   temp file name 
21f50 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
21f60 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffix..*/.static
21f70 20 76 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c   void newTempFil
21f80 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
21f90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
21fa0 66 66 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65  ffix){.  clearTe
21fb0 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c  mpFile(p);.  sql
21fc0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65  ite3_free(p->zTe
21fd0 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54  mpFile);.  p->zT
21fe0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
21ff0 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
22000 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
22010 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53  trol(p->db, 0, S
22020 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
22030 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54  FILENAME, &p->zT
22040 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  empFile);.  }.  
22050 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
22060 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
22070 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20  e3_uint64 r;.   
22080 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
22090 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
220a0 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70  r);.    p->zTemp
220b0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
220c0 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
220d0 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78  .%s", r, zSuffix
220e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
220f0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73  p->zTempFile = s
22100 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
22110 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70  %z.%s", p->zTemp
22120 46 69 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a  File, zSuffix);.
22130 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65    }.  if( p->zTe
22140 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
22150 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
22160 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "out of memo
22170 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
22180 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (1);.  }.}.../*.
22190 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
221a0 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61  ation of SQL sca
221b0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65  lar function fke
221c0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
221d0 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74  (), used.** by t
221e0 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69  he ".lint fkey-i
221f0 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e  ndexes" command.
22200 20 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e   This scalar fun
22210 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a  ction is always.
22220 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66  ** called with f
22230 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20  our arguments - 
22240 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
22250 20 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e   name, the paren
22260 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a  t column name,.*
22270 2a 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  * the child tabl
22280 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63  e name and the c
22290 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hild column name
222a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63  ..**.**   fkey_c
222b0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70  ollate_clause('p
222c0 61 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72  arent-tab', 'par
222d0 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64  ent-col', 'child
222e0 2d 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f  -tab', 'child-co
222f0 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  l').**.** If eit
22300 68 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  her of the named
22310 20 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d   tables or colum
22320 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c  ns do not exist,
22330 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
22340 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70  * returns an emp
22350 74 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d  ty string. An em
22360 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c  pty string is al
22370 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 62  so returned if b
22380 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e  oth tables.** an
22390 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20  d columns exist 
223a0 62 75 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  but have the sam
223b0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
223c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72  ion sequence. Or
223d0 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69  ,.** if both exi
223e0 73 74 20 62 75 74 20 74 68 65 20 64 65 66 61 75  st but the defau
223f0 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
22400 75 65 6e 63 65 73 20 61 72 65 20 64 69 66 66 65  uences are diffe
22410 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75  rent, this.** fu
22420 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
22430 68 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c  he string " COLL
22440 41 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c  ATE <parent-coll
22450 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a  ation>", where.*
22460 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  * <parent-collat
22470 69 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61  ion> is the defa
22480 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
22490 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61  quence of the pa
224a0 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  rent column..*/.
224b0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
224c0 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
224d0 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  se(.  sqlite3_co
224e0 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
224f0 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
22500 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
22510 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
22520 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
22530 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
22540 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx);.  const cha
22550 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f  r *zParent;.  co
22560 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
22570 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tCol;.  const ch
22580 61 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a  ar *zParentSeq;.
22590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
225a0 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  hild;.  const ch
225b0 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20  ar *zChildCol;. 
225c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
225d0 69 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20  ildSeq = 0;  /* 
225e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76  Initialize to av
225f0 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  oid false-positi
22600 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  ve warning */.  
22610 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
22620 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20  t( nVal==4 );.  
22630 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74  zParent = (const
22640 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
22650 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
22660 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f  0]);.  zParentCo
22670 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
22680 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
22690 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
226a0 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74   zChild = (const
226b0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
226c0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
226d0 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c  2]);.  zChildCol
226e0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
226f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
22700 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20  xt(apVal[3]);.. 
22710 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
22720 74 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d  text(pCtx, "", -
22730 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
22740 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22750 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
22760 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64  etadata(.      d
22770 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65  b, "main", zPare
22780 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20  nt, zParentCol, 
22790 30 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20  0, &zParentSeq, 
227a0 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  0, 0, 0.  );.  i
227b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
227c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
227d0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
227e0 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
227f0 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
22800 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f  zChild, zChildCo
22810 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71  l, 0, &zChildSeq
22820 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  , 0, 0, 0.    );
22830 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
22840 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
22850 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
22860 72 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53  rentSeq, zChildS
22870 65 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  eq) ){.    char 
22880 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
22890 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25  intf(" COLLATE %
228a0 73 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b  s", zParentSeq);
228b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
228c0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
228d0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
228e0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
228f0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
22900 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
22910 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
22920 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e  f dot-command ".
22930 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65  lint fkey-indexe
22940 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s"..*/.static in
22950 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  t lintFkeyIndexe
22960 73 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  s(.  ShellState 
22970 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
22980 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
22990 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
229a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
229b0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
229c0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
229d0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
229e0 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
229f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22a20 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
22a30 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73  zArg[] */.){.  s
22a40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74  qlite3 *db = pSt
22a50 61 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  ate->db;       /
22a60 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
22a70 65 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e  e to query "main
22a80 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c  " db of */.  FIL
22a90 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d  E *out = pState-
22aa0 3e 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  >out;        /* 
22ab0 53 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20  Stream to write 
22ac0 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74  non-error output
22ad0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65   to */.  int bVe
22ae0 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20  rbose = 0;      
22af0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d           /* If -
22b00 76 65 72 62 6f 73 65 20 69 73 20 70 72 65 73 65  verbose is prese
22b10 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f  nt */.  int bGro
22b20 75 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20  upByParent = 0; 
22b30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67          /* If -g
22b40 72 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73 20  roupbyparent is 
22b50 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
22b60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b80 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
22b90 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  gh azArg[] */.  
22ba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64  const char *zInd
22bb0 65 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20  ent = "";       
22bc0 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69  /* How much to i
22bd0 6e 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44  ndent CREATE IND
22be0 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72  EX by */.  int r
22bf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
22c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22c10 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
22c20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
22c30 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
22c40 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69  * Compiled versi
22c50 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  on of SQL statem
22c60 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
22c70 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c  /*.  ** This SEL
22c80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
22c90 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f  turns one row fo
22ca0 72 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b  r each foreign k
22cb0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ey constraint.  
22cc0 2a 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ** in the schema
22cd0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
22ce0 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d  abase. The colum
22cf0 6e 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20  n values are:.  
22d00 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74  **.  ** 0. The t
22d10 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  ext of an SQL st
22d20 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20  atement similar 
22d30 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
22d40 20 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52     "EXPLAIN QUER
22d50 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
22d60 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65  FROM child_table
22d70 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79   WHERE child_key
22d80 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  =?".  **.  **   
22d90 20 54 68 69 73 20 53 45 4c 45 43 54 20 69 73 20   This SELECT is 
22da0 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f  similar to the o
22db0 6e 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  ne that the fore
22dc0 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65  ign keys impleme
22dd0 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ntation.  **    
22de0 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74  needs to run int
22df0 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64  ernally on child
22e00 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72   tables. If ther
22e10 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  e is an index th
22e20 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62  at can.  **    b
22e30 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  e used to optimi
22e40 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ze this query, t
22e50 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20  hen it can also 
22e60 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 46  be used by the F
22e70 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d  K.  **    implem
22e80 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69  entation to opti
22e90 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55  mize DELETE or U
22ea0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
22eb0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20   on the parent. 
22ec0 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20   **    table..  
22ed0 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f  **.  ** 1. A GLO
22ee0 42 20 70 61 74 74 65 72 6e 20 73 75 69 74 61 62  B pattern suitab
22ef0 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73  le for sqlite3_s
22f00 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65  trglob(). If the
22f10 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a   plan output by.
22f20 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c    **    the EXPL
22f30 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
22f40 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74  ommand matches t
22f50 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
22f60 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a  n the schema.  *
22f70 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e  *    contains an
22f80 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20   index that can 
22f90 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  be used to optim
22fa0 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ize the query.. 
22fb0 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61   **.  ** 2. Huma
22fc0 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20  n readable text 
22fd0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
22fe0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61  he child table a
22ff0 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
23000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
23010 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68   "child_table(ch
23020 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f  ild_key1, child_
23030 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
23040 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62   3. Human readab
23050 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73  le text that des
23060 63 72 69 62 65 73 20 74 68 65 20 70 61 72 65 6e  cribes the paren
23070 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
23080 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
23090 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e   **       "paren
230a0 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b  t_table(parent_k
230b0 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32  ey1, parent_key2
230c0 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20  )".  **.  ** 4. 
230d0 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e  A full CREATE IN
230e0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  DEX statement fo
230f0 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
23100 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  could be used to
23110 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a  .  **    optimiz
23120 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
23130 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
23140 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
23150 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  e. e.g..  **.  *
23160 2a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  *       "CREATE 
23170 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c  INDEX child_tabl
23180 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63  e_child_key ON c
23190 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
231a0 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _key)".  **.  **
231b0 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   5. The name of 
231c0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
231d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73  ..  **.  ** Thes
231e0 65 20 73 69 78 20 76 61 6c 75 65 73 20 61 72 65  e six values are
231f0 20 75 73 65 64 20 62 79 20 74 68 65 20 43 20 6c   used by the C l
23200 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65  ogic below to ge
23210 6e 65 72 61 74 65 20 74 68 65 20 72 65 70 6f 72  nerate the repor
23220 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t..  */.  const 
23230 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22  char *zSql =.  "
23240 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
23250 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52     'EXPLAIN QUER
23260 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
23270 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28  FROM ' || quote(
23280 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45  s.name) || ' WHE
23290 52 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  RE '".    "  || 
232a0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f  group_concat(quo
232b0 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e  te(s.name) || '.
232c0 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72  ' || quote(f.[fr
232d0 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20  om]) || '=?' ". 
232e0 20 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f     "  || fkey_co
232f0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20  llate_clause(". 
23300 20 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61     "       f.[ta
23310 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
23320 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
23330 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
23340 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20  m]),' AND ')".  
23350 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
23360 20 27 53 45 41 52 43 48 20 54 41 42 4c 45 20 27   'SEARCH TABLE '
23370 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20   || s.name || ' 
23380 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
23390 4e 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20  NDEX*('".    "  
233a0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
233b0 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20  '*=?', ' AND ') 
233c0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
233d0 0a 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d  .    "     s.nam
233e0 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f  e  || '(' || gro
233f0 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
23400 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29  m],  ', ') || ')
23410 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
23420 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
23430 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
23440 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28  concat(COALESCE(
23450 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d  f.[to], p.[name]
23460 29 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22  )) || ')'".    "
23470 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 43  , ".    "     'C
23480 52 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c  REATE INDEX ' ||
23490 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c   quote(s.name ||
234a0 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  '_'|| group_conc
234b0 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27  at(f.[from], '_'
234c0 29 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20  ))".    "  || ' 
234d0 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  ON ' || quote(s.
234e0 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20  name) || '('".  
234f0 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
23500 6e 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72  ncat(quote(f.[fr
23510 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20  om]) ||".    "  
23520 20 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61        fkey_colla
23530 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
23540 22 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61  "          f.[ta
23550 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
23560 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
23570 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
23580 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20  m]), ', ')".    
23590 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20  "  || ');'".    
235a0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
235b0 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22  .[table] ".    "
235c0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
235d0 65 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f  er AS s, pragma_
235e0 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74  foreign_key_list
235f0 28 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a  (s.name) AS f ".
23600 20 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70      "LEFT JOIN p
23610 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f  ragma_table_info
23620 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73   AS p ON (pk-1=s
23630 65 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b  eq AND p.arg=f.[
23640 74 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47  table]) ".    "G
23650 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20  ROUP BY s.name, 
23660 66 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45  f.id ".    "ORDE
23670 52 20 42 59 20 28 43 41 53 45 20 57 48 45 4e 20  R BY (CASE WHEN 
23680 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d  ? THEN f.[table]
23690 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44   ELSE s.name END
236a0 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63  )".  ;.  const c
236b0 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20  har *zGlobIPK = 
236c0 22 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20  "SEARCH TABLE * 
236d0 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
236e0 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
236f0 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32  =?)";..  for(i=2
23700 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
23710 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
23720 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  en30(azArg[i]);.
23730 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
23740 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
23750 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72  "-verbose", azAr
23760 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
23770 20 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20       bVerbose = 
23780 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
23790 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c  e if( n>1 && sql
237a0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
237b0 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20  groupbyparent", 
237c0 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
237d0 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42  ){.      bGroupB
237e0 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20  yParent = 1;.   
237f0 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20     zIndent = "  
23800 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65    ";.    }.    e
23810 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
23820 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
23830 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65  sage: %s %s ?-ve
23840 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79  rbose? ?-groupby
23850 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20  parent?\n",.    
23860 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20        azArg[0], 
23870 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29  azArg[1].      )
23880 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23890 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
238a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67   }.  }..  /* Reg
238b0 69 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63  ister the fkey_c
238c0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20  ollate_clause() 
238d0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
238e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
238f0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
23900 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  b, "fkey_collate
23910 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c  _clause", 4, SQL
23920 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
23930 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  0, shellFkeyColl
23940 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a  ateClause, 0, 0.
23950 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d    );...  if( rc=
23960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
23980 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
23990 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30  ql, -1, &pSql, 0
239a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
239b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
239c0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
239d0 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f  nt(pSql, 1, bGro
239e0 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d  upByParent);.  }
239f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
23a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
23a10 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a   rc2;.    char *
23a20 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77  zPrev = 0;.    w
23a30 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
23a40 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
23a50 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  Sql) ){.      in
23a60 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  t res = -1;.    
23a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
23a80 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  pExplain = 0;.  
23a90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23aa0 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68  zEQP = (const ch
23ab0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
23ac0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
23ad0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
23ae0 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e  ar *zGlob = (con
23af0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
23b00 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
23b10 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 1);.      con
23b20 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d  st char *zFrom =
23b30 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
23b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
23b50 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20  t(pSql, 2);.    
23b60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
23b70 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63  arget = (const c
23b80 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
23b90 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
23ba0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
23bb0 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73  har *zCI = (cons
23bc0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
23bd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
23be0 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 4);.      cons
23bf0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20  t char *zParent 
23c00 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
23c10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
23c20 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20  xt(pSql, 5);..  
23c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23c40 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
23c50 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
23c60 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ain, 0);.      i
23c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23c80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
23c90 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
23ca0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
23cb0 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  plain) ){.      
23cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
23cd0 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lan = (const cha
23ce0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
23cf0 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
23d00 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73   3);.        res
23d10 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
23d20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74     0==sqlite3_st
23d30 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c  rglob(zGlob, zPl
23d40 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  an).           |
23d50 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
23d60 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a  glob(zGlobIPK, z
23d70 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b  Plan).        );
23d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
23d90 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
23da0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
23db0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23dc0 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
23dd0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ..      if( res<
23de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  0 ){.        raw
23df0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23e00 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c  "Error: internal
23e10 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
23e20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
23e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
23e40 28 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  ( bGroupByParent
23e50 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65  .        && (bVe
23e60 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29  rbose || res==0)
23e70 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72  .        && (zPr
23e80 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ev==0 || sqlite3
23e90 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
23ea0 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20  , zPrev)).      
23eb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
23ec0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
23ed0 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  -- Parent table 
23ee0 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b  %s\n", zParent);
23ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23f00 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
23f10 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20            zPrev 
23f20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23f30 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29  f("%s", zParent)
23f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
23f50 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
23f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
23f70 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
23f80 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49  %s --> %s\n", zI
23f90 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72  ndent, zCI, zTar
23fa0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
23fb0 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65  lse if( bVerbose
23fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
23fd0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
23fe0 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64  s/* no extra ind
23ff0 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  exes required fo
24000 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22  r %s -> %s */\n"
24010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24020 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20  zIndent, zFrom, 
24030 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20  zTarget.        
24040 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
24050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
24070 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  rev);..    if( r
24080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24090 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
240a0 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
240b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
240c0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  db));.    }..   
240d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
240e0 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20  inalize(pSql);. 
240f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24100 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c  E_OK && rc2!=SQL
24110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24120 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
24130 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
24140 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
24150 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
24160 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
24170 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
24180 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
24190 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
241a0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
241b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
241c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
241d0 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d  ".lint" dot comm
241e0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
241f0 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e  nt lintDotComman
24200 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
24210 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
24220 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24230 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
24240 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
24250 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
24260 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
24270 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
24280 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
24290 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
242c0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
242d0 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69  zArg[] */.){.  i
242e0 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72  nt n;.  n = (nAr
242f0 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28  g>=2 ? strlen30(
24300 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a  azArg[1]) : 0);.
24310 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c    if( n<1 || sql
24320 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a  ite3_strnicmp(az
24330 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e  Arg[1], "fkey-in
24340 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74  dexes", n) ) got
24350 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72  o usage;.  retur
24360 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  n lintFkeyIndexe
24370 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c  s(pState, azArg,
24380 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a   nArg);.. usage:
24390 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
243a0 64 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20  derr, "Usage %s 
243b0 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69  sub-command ?swi
243c0 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a  tches...?\n", az
243d0 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70  Arg[0]);.  raw_p
243e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
243f0 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  here sub-command
24400 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61  s are:\n");.  ra
24410 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24420 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78   "    fkey-index
24430 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  es\n");.  return
24440 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
24450 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
24460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24470 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
24480 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
24490 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ZLIB)./*********
244a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
244f0 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
24500 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ar" command..*/.
24510 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
24520 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69  lPrepare(.  sqli
24530 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
24540 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pRc, .  const c
24550 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71  har *zSql, .  sq
24560 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
24570 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74  tmt.){.  *ppStmt
24580 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
24590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
245a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
245b0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
245c0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
245d0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
245e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
245f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
24600 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20  tf(stderr, "sql 
24610 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e  error: %s (%d)\n
24620 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ", .          sq
24630 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
24640 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  , sqlite3_errcod
24650 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20  e(db).      );. 
24660 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a       *pRc = rc;.
24670 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
24680 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
24690 65 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73  eparePrintf(.  s
246a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
246b0 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
246c0 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
246d0 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
246e0 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b  *zFmt, .  ....){
246f0 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
24700 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
24710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f  TE_OK ){.    va_
24720 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61  list ap;.    cha
24730 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61  r *z;.    va_sta
24740 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
24750 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
24760 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
24770 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
24780 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
24790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
247a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
247b0 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70  ellPrepare(db, p
247c0 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a  Rc, z, ppStmt);.
247d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
247e0 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(z);.    }.  }
247f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
24800 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20  shellFinalize(. 
24810 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
24820 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
24830 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74  t.){.  if( pStmt
24840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
24850 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
24860 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
24870 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
24880 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
24890 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  tmt);.    if( *p
248a0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
248b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
248c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
248d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
248e0 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
248f0 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
24900 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
24910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
24920 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
24930 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
24940 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69   shellReset(.  i
24950 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
24960 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
24970 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
24980 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
24990 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t);.  if( *pRc==
249a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
249b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
249c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
249d0 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
249e0 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
249f0 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
24a00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
24a10 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
24a20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
24a30 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  b));.    }.    *
24a40 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  pRc = rc;.  }.}.
24a50 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
24a60 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73  representing a s
24a70 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d  ingle ".ar" comm
24a80 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  and..*/.typedef 
24a90 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
24aa0 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75   ArCommand;.stru
24ab0 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20  ct ArCommand {. 
24ac0 20 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20   u8 eCmd;       
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20   /* An AR_CMD_* 
24af0 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56  value */.  u8 bV
24b00 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20  erbose;         
24b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24b20 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20  ue if --verbose 
24b30 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20  */.  u8 bZip;   
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
24b60 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20 61  the archive is a
24b70 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72   ZIP */.  u8 bDr
24b80 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20  yRun;           
24b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24ba0 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a  e if --dry-run *
24bb0 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20  /.  u8 bAppend; 
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
24be0 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  -append */.  int
24bf0 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c10 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e  Number of comman
24c20 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  d arguments */. 
24c30 20 63 68 61 72 20 2a 7a 53 72 63 54 61 62 6c 65   char *zSrcTable
24c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c50 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a 69   /* "sqlar", "zi
24c60 70 66 69 6c 65 28 24 66 69 6c 65 29 22 20 6f 72  pfile($file)" or
24c70 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73   "zip" */.  cons
24c80 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
24c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d              /* -
24ca0 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20  -file argument, 
24cb0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
24cc0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 20 20  st char *zDir;  
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ce0 2d 2d 64 69 72 65 63 74 6f 72 79 20 61 72 67 75  --directory argu
24cf0 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
24d00 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b  .  char **azArg;
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
24d30 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
24d40 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
24d50 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
24d60 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73        /* Shell s
24d70 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
24d80 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
24d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
24da0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
24db0 20 74 68 65 20 61 72 63 68 69 76 65 20 2a 2f 0a   the archive */.
24dc0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  };../*.** Print 
24dd0 61 20 75 73 61 67 65 20 6d 65 73 73 61 67 65 20  a usage message 
24de0 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d  for the .ar comm
24df0 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  and to stderr an
24e00 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
24e10 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
24e20 20 69 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c   int arUsage(FIL
24e30 45 20 2a 66 29 7b 0a 20 20 72 61 77 5f 70 72 69  E *f){.  raw_pri
24e40 6e 74 66 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61  ntf(f,."\n"."Usa
24e50 67 65 3a 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e  ge: .ar [OPTION.
24e60 2e 2e 5d 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22  ..] [FILE...]\n"
24e70 0a 22 54 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e  ."The .ar comman
24e80 64 20 6d 61 6e 61 67 65 73 20 73 71 6c 61 72 20  d manages sqlar 
24e90 61 72 63 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e  archives.\n"."\n
24ea0 22 0a 22 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a  "."Examples:\n".
24eb0 22 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69  "  .ar -cf archi
24ec0 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20  ve.sar foo bar  
24ed0 20 20 23 20 43 72 65 61 74 65 20 61 72 63 68 69    # Create archi
24ee0 76 65 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65  ve.sar from file
24ef0 73 20 66 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22  s foo and bar\n"
24f00 0a 22 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68  ."  .ar -tf arch
24f10 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
24f20 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72     # List member
24f30 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72  s of archive.sar
24f40 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 78 76 66 20  \n"."  .ar -xvf 
24f50 61 72 63 68 69 76 65 2e 73 61 72 20 20 20 20 20  archive.sar     
24f60 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c        # Verbosel
24f70 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20  y extract files 
24f80 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72  from archive.sar
24f90 5c 6e 22 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63  \n"."\n"."Each c
24fa0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74  ommand line must
24fb0 20 66 65 61 74 75 72 65 20 65 78 61 63 74 6c 79   feature exactly
24fc0 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74   one command opt
24fd0 69 6f 6e 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d  ion:\n"."  -c, -
24fe0 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20  -create         
24ff0 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
25000 65 77 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20  ew archive\n"." 
25010 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20   -u, --update   
25020 20 20 20 20 20 20 20 20 20 20 20 20 55 70 64 61              Upda
25030 74 65 20 6f 72 20 61 64 64 20 66 69 6c 65 73 20  te or add files 
25040 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 61  to an existing a
25050 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c  rchive\n"."  -t,
25060 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20   --list         
25070 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e          List con
25080 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65  tents of archive
25090 5c 6e 22 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74  \n"."  -x, --ext
250a0 72 61 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ract            
250b0 20 20 45 78 74 72 61 63 74 20 66 69 6c 65 73 20    Extract files 
250c0 66 72 6f 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a  from archive\n".
250d0 22 5c 6e 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f  "\n"."And zero o
250e0 72 20 6d 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20  r more optional 
250f0 6f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d  options:\n"."  -
25100 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20  v, --verbose    
25110 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
25120 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73  each filename as
25130 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64   it is processed
25140 5c 6e 22 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20  \n"."  -f FILE, 
25150 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20 20 20 20  --file FILE     
25160 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 61 72 63    Operate on arc
25170 68 69 76 65 20 46 49 4c 45 20 28 64 65 66 61 75  hive FILE (defau
25180 6c 74 20 69 73 20 63 75 72 72 65 6e 74 20 64 62  lt is current db
25190 29 5c 6e 22 0a 22 20 20 2d 61 20 46 49 4c 45 2c  )\n"."  -a FILE,
251a0 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20   --append FILE  
251b0 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49     Operate on FI
251c0 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  LE opened using 
251d0 74 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 5c  the apndvfs VFS\
251e0 6e 22 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d  n"."  -C DIR, --
251f0 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20  directory DIR   
25200 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   Change to direc
25210 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64  tory DIR to read
25220 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e  /extract files\n
25230 22 0a 22 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75  "."  -n, --dryru
25240 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
25250 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61  Show the SQL tha
25260 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63  t would have occ
25270 75 72 72 65 64 5c 6e 22 0a 22 5c 6e 22 0a 22 53  urred\n"."\n"."S
25280 65 65 20 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f  ee also: http://
25290 73 71 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68  sqlite.org/cli.h
252a0 74 6d 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76  tml#sqlar_archiv
252b0 65 5f 73 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e  e_support\n"."\n
252c0 22 0a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ".);.  return SQ
252d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
252e0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
252f0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
25300 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
25310 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
25320 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
25330 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
25340 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28   int arErrorMsg(
25350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
25360 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
25370 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
25380 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
25390 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  zFmt);.  z = sql
253a0 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
253b0 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mt, ap);.  va_en
253c0 64 28 61 70 29 3b 0a 20 20 72 61 77 5f 70 72 69  d(ap);.  raw_pri
253d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
253e0 6f 72 3a 20 25 73 20 28 74 72 79 20 5c 22 2e 61  or: %s (try \".a
253f0 72 20 2d 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20  r --help\")\n", 
25400 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  z);.  sqlite3_fr
25410 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
25420 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
25430 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f  ./*.** Values fo
25440 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64  r ArCommand.eCmd
25450 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f  ..*/.#define AR_
25460 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20  CMD_CREATE      
25470 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   1.#define AR_CM
25480 44 5f 45 58 54 52 41 43 54 20 20 20 20 20 20 32  D_EXTRACT      2
25490 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
254a0 4c 49 53 54 20 20 20 20 20 20 20 20 20 33 0a 23  LIST         3.#
254b0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50  define AR_CMD_UP
254c0 44 41 54 45 20 20 20 20 20 20 20 34 0a 23 64 65  DATE       4.#de
254d0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  fine AR_CMD_HELP
254e0 20 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a           5../*.*
254f0 2a 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d  * Other (non-com
25500 6d 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a  mand) switches..
25510 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  */.#define AR_SW
25520 49 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20  ITCH_VERBOSE    
25530 20 36 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   6.#define AR_SW
25540 49 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20  ITCH_FILE       
25550 20 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   7.#define AR_SW
25560 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20  ITCH_DIRECTORY  
25570 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   8.#define AR_SW
25580 49 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20  ITCH_APPEND     
25590 20 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   9.#define AR_SW
255a0 49 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20  ITCH_DRYRUN     
255b0 31 30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  10..static int a
255c0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
255d0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
255e0 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
255f0 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
25600 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
25610 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
25620 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
25630 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
25640 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
25650 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
25660 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
25670 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
25680 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69  MD_HELP:.      i
25690 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a  f( pAr->eCmd ){.
256a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
256b0 72 45 72 72 6f 72 4d 73 67 28 22 6d 75 6c 74 69  rErrorMsg("multi
256c0 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  ple command opti
256d0 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ons");.      }. 
256e0 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d       pAr->eCmd =
256f0 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20   eSwitch;.      
25700 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
25710 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
25720 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44  N:.      pAr->bD
25730 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ryRun = 1;.     
25740 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
25750 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
25760 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  SE:.      pAr->b
25770 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
25780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
25790 73 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  se AR_SWITCH_APP
257a0 45 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  END:.      pAr->
257b0 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20  bAppend = 1;.   
257c0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
257d0 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20  into --file */. 
257e0 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
257f0 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41  H_FILE:.      pA
25800 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b  r->zFile = zArg;
25810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25820 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
25830 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20  _DIRECTORY:.    
25840 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41    pAr->zDir = zA
25850 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rg;.      break;
25860 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25880 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d  ** Parse the com
25890 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e  mand line for an
258a0 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20   ".ar" command. 
258b0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
258c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
258d0 73 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29  structure (*pAr)
258e0 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
258f0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
25900 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70  ommand line is p
25910 61 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73  arsed.** success
25920 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65  fully, otherwise
25930 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
25940 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
25950 73 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53  stderr and .** S
25960 51 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75  QLITE_ERROR retu
25970 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
25980 69 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  int arParseComma
25990 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41  nd(.  char **azA
259a0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
259b0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
259c0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
259d0 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
259e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  d */.  int nArg,
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25a10 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
25a20 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f  zArg[] */.  ArCo
25a30 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20  mmand *pAr      
25a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
25a50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a  opulate this obj
25a60 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
25a70 63 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20  ct ArSwitch {.  
25a80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
25a90 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53  ong;.    char cS
25aa0 68 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77  hort;.    u8 eSw
25ab0 69 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72  itch;.    u8 bAr
25ac0 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d  g;.  } aSwitch[]
25ad0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61   = {.    { "crea
25ae0 74 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f  te",    'c', AR_
25af0 43 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20  CMD_CREATE,     
25b00 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78    0 },.    { "ex
25b10 74 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41  tract",   'x', A
25b20 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20  R_CMD_EXTRACT,  
25b30 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
25b40 6c 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c  list",      't',
25b50 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20   AR_CMD_LIST,   
25b60 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
25b70 20 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75   "update",    'u
25b80 27 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  ', AR_CMD_UPDATE
25b90 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  ,       0 },.   
25ba0 20 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20   { "help",      
25bb0 27 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50  'h', AR_CMD_HELP
25bc0 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ,         0 },. 
25bd0 20 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20     { "verbose", 
25be0 20 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48    'v', AR_SWITCH
25bf0 5f 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c  _VERBOSE,   0 },
25c00 0a 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20  .    { "file",  
25c10 20 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54      'f', AR_SWIT
25c20 43 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20  CH_FILE,      1 
25c30 7d 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64  },.    { "append
25c40 22 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57  ",    'a', AR_SW
25c50 49 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20  ITCH_APPEND,    
25c60 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65  1 },.    { "dire
25c70 63 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f  ctory", 'C', AR_
25c80 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
25c90 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72  , 1 },.    { "dr
25ca0 79 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41  yrun",    'n', A
25cb0 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c  R_SWITCH_DRYRUN,
25cc0 20 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20      0 },.  };.  
25cd0 69 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69  int nSwitch = si
25ce0 7a 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20  zeof(aSwitch) / 
25cf0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72  sizeof(struct Ar
25d00 53 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63  Switch);.  struc
25d10 74 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64  t ArSwitch *pEnd
25d20 20 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69   = &aSwitch[nSwi
25d30 74 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72  tch];..  if( nAr
25d40 67 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75  g<=1 ){.    retu
25d50 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72  rn arUsage(stder
25d60 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
25d70 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
25d80 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  [1];.    memset(
25d90 70 41 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41  pAr, 0, sizeof(A
25da0 72 43 6f 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20  rCommand));..   
25db0 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
25dc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 64 69  {.      /* Tradi
25dd0 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61  tional style [ta
25de0 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  r] invocation */
25df0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
25e00 20 20 20 20 69 6e 74 20 69 41 72 67 20 3d 20 32      int iArg = 2
25e10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
25e20 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
25e30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25e40 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  *zArg = 0;.     
25e50 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
25e60 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20  ch *pOpt;.      
25e70 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69    for(pOpt=&aSwi
25e80 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e  tch[0]; pOpt<pEn
25e90 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20  d; pOpt++){.    
25ea0 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
25eb0 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62  pOpt->cShort ) b
25ec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
25ed0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
25ee0 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ==pEnd ){.      
25ef0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
25f00 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69  orMsg("unrecogni
25f10 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c  zed option: %c",
25f20 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20   z[i]);.        
25f30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
25f40 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
25f50 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
25f60 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nArg ){.        
25f70 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
25f80 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65  orMsg("option re
25f90 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
25fa0 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20  nt: %c",z[i]);. 
25fb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25fc0 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
25fd0 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20  g[iArg++];.     
25fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25ff0 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68   arProcessSwitch
26000 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69  (pAr, pOpt->eSwi
26010 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
26020 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26040 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
26050 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  -iArg;.      if(
26060 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a   pAr->nArg>0 ){.
26070 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
26080 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
26090 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
260a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
260b0 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69  on-traditional i
260c0 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  nvocation */.   
260d0 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20     int iArg;.   
260e0 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69     for(iArg=1; i
260f0 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b  Arg<nArg; iArg++
26100 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
26110 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a  ;.        z = az
26120 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[iArg];.     
26130 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
26140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26150 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   All remaining c
26160 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
26170 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72  s are command ar
26180 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  guments. */.    
26190 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
261a0 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
261b0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
261c0 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
261d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
261e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
261f0 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33       n = strlen3
26200 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  0(z);..        i
26210 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[1]!='-' ){.
26220 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
26230 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  .          /* On
26240 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20  e or more short 
26250 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  options */.     
26260 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
26270 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
26280 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26290 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  *zArg = 0;.     
262a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
262b0 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20  Switch *pOpt;.  
262c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f            for(pO
262d0 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
262e0 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
262f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
26300 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74    if( z[i]==pOpt
26310 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b  ->cShort ) break
26320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26330 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26340 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20  pOpt==pEnd ){.  
26350 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
26360 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75  rn arErrorMsg("u
26370 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
26380 6f 6e 3a 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29  on: %c\n", z[i])
26390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
263a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
263b0 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
263c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
263d0 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  i<(n-1) ){.     
263e0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
263f0 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  = &z[i+1];.     
26400 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
26410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26430 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
26440 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
26460 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
26470 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65  ("option require
26480 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
26490 63 5c 6e 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20  c\n",z[i]);.    
264a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41                zA
264c0 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72  rg = azArg[++iAr
264d0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g];.            
264e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
264f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
26500 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  ( arProcessSwitc
26510 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77  h(pAr, pOpt->eSw
26520 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
26530 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26540 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
26550 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
26560 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20   z[2]=='\0' ){. 
26570 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d           /* A --
26580 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74   option, indicat
26590 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 72 65 6d  ing that all rem
265a0 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c  aining command l
265b0 69 6e 65 20 77 6f 72 64 73 0a 20 20 20 20 20 20  ine words.      
265c0 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61      ** are comma
265d0 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a  nd arguments.  *
265e0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  /.          pAr-
265f0 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b  >azArg = &azArg[
26600 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iArg+1];.       
26610 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e     pAr->nArg = n
26620 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20  Arg-iArg-1;.    
26630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26650 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20        /* A long 
26660 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
26670 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26680 7a 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20  zArg = 0;       
26690 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
266a0 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66  t for option, if
266b0 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20 20 20   any */.        
266c0 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
266d0 68 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20  h *pMatch = 0;  
266e0 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
266f0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
26700 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
26710 74 63 68 20 2a 70 4f 70 74 3b 20 20 20 20 20 20  tch *pOpt;      
26720 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
26730 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  r */.          f
26740 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
26750 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
26760 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
26770 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26780 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a  *zLong = pOpt->z
26790 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Long;.          
267a0 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72    if( (n-2)<=str
267b0 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20  len30(zLong) && 
267c0 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c  0==memcmp(&z[2],
267d0 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a   zLong, n-2) ){.
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
267f0 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ( pMatch ){.    
26800 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
26810 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 61  rn arErrorMsg("a
26820 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a  mbiguous option:
26830 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20   %s",z);.       
26840 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d                pM
26860 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20  atch = pOpt;.   
26870 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26890 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
268a0 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20    if( pMatch==0 
268b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
268c0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
268d0 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f  ("unrecognized o
268e0 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a  ption: %s", z);.
268f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26900 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
26910 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
26920 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
26930 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
26940 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26950 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74   arErrorMsg("opt
26960 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
26970 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a  argument: %s", z
26980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
26990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72  .            zAr
269a0 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67  g = azArg[++iArg
269b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
269c0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50           if( arP
269d0 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
269e0 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63  , pMatch->eSwitc
269f0 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
26a00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
26a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
26a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
26a50 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
26a60 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e  that all argumen
26a70 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 72  ts within the Ar
26a80 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a  Command.azArg[].
26a90 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72 20 74  ** array refer t
26aa0 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  o archive member
26ab0 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d  s, as for the --
26ac0 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73  extract or --lis
26ad0 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20  t commands. .** 
26ae0 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 65  It checks that e
26af0 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20  ach of them are 
26b00 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20  present. If any 
26b10 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 69  specified file i
26b20 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74  s not.** present
26b30 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c   in the archive,
26b40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69   an error is pri
26b50 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72 20 61  nted to stderr a
26b60 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63  nd an error.** c
26b70 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  ode returned. Ot
26b80 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
26b90 73 70 65 63 69 66 69 65 64 20 61 72 67 75 6d 65  specified argume
26ba0 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  nts are present 
26bb0 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76  in.** the archiv
26bc0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
26bd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
26be0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74  This function st
26bf0 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e  rips any trailin
26c00 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73  g '/' characters
26c10 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d   from each argum
26c20 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ent..** This is 
26c30 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
26c40 74 68 65 20 77 61 79 20 74 68 65 20 5b 74 61 72  the way the [tar
26c50 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20  ] command seems 
26c60 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69  to work on.** Li
26c70 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nux..*/.static i
26c80 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65  nt arCheckEntrie
26c90 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  s(ArCommand *pAr
26ca0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
26cc0 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20  Ar->nArg ){.    
26cd0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73 71  int i, j;.    sq
26ce0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73  lite3_stmt *pTes
26cf0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65 6c  t = 0;..    shel
26d00 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
26d10 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 54  Ar->db, &rc, &pT
26d20 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22 53 45  est,.        "SE
26d30 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25  LECT name FROM %
26d40 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61  s WHERE name=$na
26d50 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 70 41  me", .        pA
26d60 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20 20  r->zSrcTable.   
26d70 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69   );.    j = sqli
26d80 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
26d90 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74 2c 20  er_index(pTest, 
26da0 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66 6f  "$name");.    fo
26db0 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41  r(i=0; i<pAr->nA
26dc0 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  rg && rc==SQLITE
26dd0 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _OK; i++){.     
26de0 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
26df0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
26e00 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
26e10 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  (z);.      int b
26e20 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  Ok = 0;.      wh
26e30 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
26e40 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20  1]=='/' ) n--;. 
26e50 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27       z[n] = '\0'
26e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
26e70 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
26e80 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   j, z, -1, SQLIT
26e90 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
26ea0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
26eb0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54  =sqlite3_step(pT
26ec0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
26ed0 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
26ee0 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
26ef0 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  t(&rc, pTest);. 
26f00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26f10 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30  ITE_OK && bOk==0
26f20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
26f30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26f40 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72  "not found in ar
26f50 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29  chive: %s\n", z)
26f60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
26f70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
26f80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
26f90 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
26fa0 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20 20  , pTest);.  }.  
26fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26fc0 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45  .** Format a WHE
26fd0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63  RE clause that c
26fe0 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  an be used again
26ff0 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  st the "sqlar" t
27000 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74  able to.** ident
27010 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20  ify all archive 
27020 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74  members that mat
27030 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61  ch the command a
27040 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a  rguments held.**
27050 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76   in (*pAr). Leav
27060 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61  e this WHERE cla
27070 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65  use in (*pzWhere
27080 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
27090 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  ng..** The calle
270a0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
270b0 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20   for eventually 
270c0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
270d0 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79  free() on.** any
270e0 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68   non-NULL (*pzWh
270f0 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ere) value..*/.s
27100 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68 65  tatic void arWhe
27110 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20  reClause(.  int 
27120 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61  *pRc, .  ArComma
27130 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72  nd *pAr, .  char
27140 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20   **pzWhere      
27150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27160 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c  UT: New WHERE cl
27170 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ause */.){.  cha
27180 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
27190 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
271a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
271b0 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a  pAr->nArg==0 ){.
271c0 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73        zWhere = s
271d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
271e0 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1");.    }else{.
271f0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
27200 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
27210 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
27220 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
27230 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
27240 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27250 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
27260 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72  ];.        zWher
27270 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
27280 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
27290 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25 71 27  %z%s name = '%q'
272a0 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d 65 2c   OR substr(name,
272b0 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22 2c 20  1,%d) = '%q/'", 
272c0 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72  .          zWher
272d0 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72 6c  e, zSep, z, strl
272e0 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20 20  en30(z)+1, z.   
272f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
27300 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b  if( zWhere==0 ){
27310 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20  .          *pRc 
27320 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
27330 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27350 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22     zSep = " OR "
27360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27370 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d    }.  *pzWhere =
27380 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a   zWhere;.}../*.*
27390 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
273a0 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20 63   of .ar "lisT" c
273b0 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74  ommand. .*/.stat
273c0 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f 6d  ic int arListCom
273d0 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  mand(ArCommand *
273e0 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pAr){.  const ch
273f0 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
27400 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48  CT %s FROM %s WH
27410 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73  ERE %s"; .  cons
27420 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d  t char *azCols[]
27430 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22 2c   = {.    "name",
27440 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f 64  .    "lsmode(mod
27450 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d 65  e), sz, datetime
27460 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70 6f  (mtime, 'unixepo
27470 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b  ch'), name".  };
27480 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  ..  char *zWhere
27490 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
274a0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
274b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
274c0 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
274d0 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
274e0 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
274f0 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68   &zWhere);..  sh
27500 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
27510 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
27520 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f  pSql, zSql, azCo
27530 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  ls[pAr->bVerbose
27540 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
27550 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72          pAr->zSr
27560 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 29 3b  cTable, zWhere);
27570 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79  .  if( pAr->bDry
27580 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Run ){.    utf8_
27590 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
275a0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
275b0 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
275c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
275d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
275e0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
275f0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
27600 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ql) ){.      if(
27610 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29   pAr->bVerbose )
27620 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
27630 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
27640 74 2c 20 22 25 73 20 25 20 31 30 64 20 20 25 73  t, "%s % 10d  %s
27650 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %s\n",.       
27660 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
27670 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
27680 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
27690 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
276a0 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20  t(pSql, 1), .   
276b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
276c0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
276d0 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20  l, 2),.         
276e0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
276f0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 0a  n_text(pSql, 3).
27700 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27720 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
27730 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
27740 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27750 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
27760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27770 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  }.  shellFinaliz
27780 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20  e(&rc, pSql);.  
27790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
277a0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
277b0 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72  ion of .ar "eXtr
277c0 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  act" command. .*
277d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
277e0 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72  xtractCommand(Ar
277f0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
27800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
27810 6c 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43  l1 = .    "SELEC
27820 54 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20  T ".    " ($dir 
27830 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22  || name),".    "
27840 20 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72   writefile(($dir
27850 20 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d   || name), %s, m
27860 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20  ode, mtime) ".  
27870 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45    "FROM %s WHERE
27880 20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20   (%s) AND (data 
27890 49 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f  IS NULL OR $dirO
278a0 6e 6c 79 20 3d 20 30 29 22 3b 0a 0a 20 20 63 6f  nly = 0)";..  co
278b0 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72  nst char *azExtr
278c0 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20  aArg[] = { .    
278d0 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73  "sqlar_uncompres
278e0 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20  s(data, sz)",.  
278f0 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20    "data".  };.. 
27900 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27910 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
27920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27930 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
27940 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
27950 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
27960 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
27970 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
27980 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  d, check that th
27990 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  ey actually exis
279a0 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  t within.  ** th
279b0 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65  e archive before
279c0 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64   proceeding. And
279d0 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45   formulate a WHE
279e0 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a  RE clause to.  *
279f0 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a  * match them.  *
27a00 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  /.  rc = arCheck
27a10 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
27a20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
27a30 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
27a40 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
27a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
27a60 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20  ( pAr->zDir ){. 
27a70 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
27a80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
27a90 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20  ", pAr->zDir);. 
27aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27ab0 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
27ac0 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20  printf("");.    
27ad0 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  }.    if( zDir==
27ae0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
27af0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68  NOMEM;.  }..  sh
27b00 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
27b10 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
27b20 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20  pSql, zSql1, .  
27b30 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70      azExtraArg[p
27b40 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e  Ar->bZip], pAr->
27b50 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
27b60 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
27b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27b80 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
27b90 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
27ba0 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22  dex(pSql, "$dir"
27bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
27bc0 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a  ind_text(pSql, j
27bd0 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49  , zDir, -1, SQLI
27be0 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20  TE_STATIC);..   
27bf0 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45   /* Run the SELE
27c00 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69  CT statement twi
27c10 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  ce. The first ti
27c20 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20  me, writefile() 
27c30 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a  is called.    **
27c40 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65   for all archive
27c50 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68   members that sh
27c60 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65  ould be extracte
27c70 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69  d. The second ti
27c80 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  me,.    ** only 
27c90 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
27ca0 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ies. This is bec
27cb0 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61  ause the timesta
27cc0 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  mps for.    ** e
27cd0 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f  xtracted directo
27ce0 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73  ries must be res
27cf0 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72  et after they ar
27d00 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a  e populated (as.
27d10 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e      ** populatin
27d20 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74  g them changes t
27d30 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20  he timestamp).  
27d40 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
27d50 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
27d60 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
27d70 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
27d80 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c  x(pSql, "$dirOnl
27d90 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y");.      sqlit
27da0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
27db0 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , j, i);.      i
27dc0 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
27dd0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
27de0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
27df0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
27e00 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
27e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27e20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
27e30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
27e40 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
27e50 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
27e60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
27e70 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f  0 && pAr->bVerbo
27e80 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
27e90 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
27ea0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
27eb0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
27ec0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
27ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27ef0 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
27f00 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20  (&rc, pSql);.   
27f10 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
27f20 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
27f30 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
27f40 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71  free(zDir);.  sq
27f50 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
27f60 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
27f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
27f80 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
27f90 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20  in zSql.  Or if 
27fa0 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e  doing a --dryrun
27fb0 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69  , merely print i
27fc0 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t out..*/.static
27fd0 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41   int arExecSql(A
27fe0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
27ff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
28000 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
28010 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
28020 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
28030 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
28040 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
28050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
28070 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
28080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
28090 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53  exec(pAr->db, zS
280a0 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  ql, 0, 0, &zErr)
280b0 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29  ;.    if( zErr )
280c0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
280d0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52  ntf(stdout, "ERR
280e0 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  OR: %s\n", zErr)
280f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28100 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
28110 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
28120 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
28130 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
28140 61 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20  ar "create" and 
28150 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64  "update" command
28160 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  s..**.** Create 
28170 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c  the "sqlar" tabl
28180 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
28190 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
281a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
281b0 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68  ** Then add each
281c0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46   file in the azF
281d0 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74  ile[] array to t
281e0 68 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65  he archive. Dire
281f0 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61  ctories.** are a
28200 64 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  dded recursively
28210 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56  . If argument bV
28220 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65  erbose is non-ze
28230 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73  ro, a message is
28240 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73  .** printed on s
28250 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66  tdout for each f
28260 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a  ile archived..**
28270 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63  .** The create c
28280 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61  ommand is the sa
28290 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78  me as update, ex
282a0 63 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f  cept that it dro
282b0 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69  ps.** any existi
282c0 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  ng "sqlar" table
282d0 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
282e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
282f0 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
28300 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f  eCommand(.  ArCo
28310 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20  mmand *pAr,     
28320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28330 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28340 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a   and options */.
28350 20 20 69 6e 74 20 62 55 70 64 61 74 65 20 20 20    int bUpdate   
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 20 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20    /* true for a 
28380 2d 2d 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65  --create.  false
28390 20 66 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f   for --update */
283a0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
283b0 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20   *zCreate = .   
283c0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
283d0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
283e0 71 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22  qlar(\n".      "
283f0 20 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d    name TEXT PRIM
28400 41 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d  ARY KEY,  -- nam
28410 65 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22  e of the file\n"
28420 0a 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49  .      "  mode I
28430 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
28440 20 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d    -- access perm
28450 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20  issions\n".     
28460 20 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20   "  mtime INT,  
28470 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c              -- l
28480 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ast modification
28490 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22   time\n".      "
284a0 20 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20    sz INT,       
284b0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69            -- ori
284c0 67 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c  ginal file size\
284d0 6e 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61  n".      "  data
284e0 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   BLOB           
284f0 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65      -- compresse
28500 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20  d content\n".   
28510 20 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20     ")";.  const 
28520 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44  char *zDrop = "D
28530 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
28540 53 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f  STS sqlar";.  co
28550 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72  nst char *zInser
28560 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20  tFmt[2] = {.    
28570 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25   "REPLACE INTO %
28580 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  s(name,mode,mtim
28590 65 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20  e,sz,data)\n".  
285a0 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a     "  SELECT\n".
285b0 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22       "    %s,\n"
285c0 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c  .     "    mode,
285d0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74  \n".     "    mt
285e0 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ime,\n".     "  
285f0 20 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73    CASE substr(ls
28600 6d 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c  mode(mode),1,1)\
28610 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57  n".     "      W
28620 48 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e  HEN '-' THEN len
28630 67 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20  gth(data)\n".   
28640 20 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64    "      WHEN 'd
28650 27 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20  ' THEN 0\n".    
28660 20 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20   "      ELSE -1 
28670 45 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  END,\n".     "  
28680 20 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73    sqlar_compress
28690 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  (data)\n".     "
286a0 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c    FROM fsdir(%Q,
286b0 25 51 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57  %Q)\n".     "  W
286c0 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65  HERE lsmode(mode
286d0 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27  ) NOT LIKE '?%%'
286e0 3b 22 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43  ;",.     "REPLAC
286f0 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d  E INTO %s(name,m
28700 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c  ode,mtime,data)\
28710 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43  n".     "  SELEC
28720 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25  T\n".     "    %
28730 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  s,\n".     "    
28740 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20  mode,\n".     " 
28750 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20     mtime,\n".   
28760 20 20 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20    "    data\n". 
28770 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69      "  FROM fsdi
28780 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20  r(%Q,%Q)\n".    
28790 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
287a0 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
287b0 27 3f 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69  '?%%';".  };.  i
287c0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287e0 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
287f0 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d  through azFile[]
28800 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28830 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
28840 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
28850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
28860 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
28870 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  h to insert */. 
28880 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
28890 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a  har zTemp[50];..
288a0 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c    arExecSql(pAr,
288b0 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
288c0 7a 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d  ze=512");.  rc =
288d0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
288e0 22 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29  "SAVEPOINT ar;")
288f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28900 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28910 63 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  c;.  zTemp[0] = 
28920 30 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  0; .  if( pAr->b
28930 5a 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  Zip ){.    /* In
28940 69 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70  itialize the zip
28950 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62  file virtual tab
28960 6c 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  le, if necessary
28970 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d   */.    if( pAr-
28980 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  >zFile ){.      
28990 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
289a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
289b0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
289c0 66 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20  f(r),&r);.      
289d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
289e0 28 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a  (sizeof(zTemp),z
289f0 54 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78  Temp,"zip%016llx
28a00 22 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62  ",r);.      zTab
28a10 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
28a20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
28a30 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
28a40 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
28a50 20 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55   TABLE temp.%s U
28a60 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29  SING zipfile(%Q)
28a70 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62  ",.         zTab
28a80 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20  , pAr->zFile.   
28a90 20 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d     );.      rc =
28aa0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
28ab0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
28ac0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
28ad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28ae0 20 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a    zTab = "zip";.
28af0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
28b00 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
28b10 20 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61   the table for a
28b20 6e 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a  n SQLAR */.    z
28b30 54 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20  Tab = "sqlar";. 
28b40 20 20 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d     if( bUpdate==
28b50 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
28b60 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
28b70 44 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Drop);.      if(
28b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28b90 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61   goto end_ar_tra
28ba0 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a  nsaction;.    }.
28bb0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
28bc0 71 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29  ql(pAr, zCreate)
28bd0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
28be0 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20   i<pAr->nArg && 
28bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
28c00 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
28c10 53 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Sql2 = sqlite3_m
28c20 70 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d  printf(zInsertFm
28c30 74 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54  t[pAr->bZip], zT
28c40 61 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  ab,.        pAr-
28c50 3e 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65  >bVerbose ? "she
28c60 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22  ll_putsnl(name)"
28c70 20 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20   : "name",.     
28c80 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d     pAr->azArg[i]
28c90 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
28ca0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
28cb0 28 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20  (pAr, zSql2);.  
28cc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28cd0 53 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61  Sql2);.  }.end_a
28ce0 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  r_transaction:. 
28cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28d00 4f 4b 20 29 7b 0a 20 20 20 20 61 72 45 78 65 63  OK ){.    arExec
28d10 53 71 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42 41  Sql(pAr, "ROLLBA
28d20 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53  CK TO ar; RELEAS
28d30 45 20 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73 65  E ar;");.  }else
28d40 7b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65  {.    rc = arExe
28d50 63 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41  cSql(pAr, "RELEA
28d60 53 45 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66  SE ar;");.    if
28d70 28 20 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70  ( pAr->bZip && p
28d80 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  Ar->zFile ){.   
28d90 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
28da0 33 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20  3_mprintf("DROP 
28db0 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70  TABLE %s", zTemp
28dc0 29 3b 0a 20 20 20 20 20 20 61 72 45 78 65 63 53  );.      arExecS
28dd0 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20  ql(pAr, zSql);. 
28de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28df0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
28e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28e10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
28e20 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22  ntation of ".ar"
28e30 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
28e40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f  .static int arDo
28e50 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
28e60 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
28e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28e80 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
28e90 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
28ea0 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ec0 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
28ed0 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
28ee0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28ef0 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f10 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
28f20 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
28f30 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20  .){.  ArCommand 
28f40 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  cmd;.  int rc;. 
28f50 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c   memset(&cmd, 0,
28f60 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20   sizeof(cmd));. 
28f70 20 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d   rc = arParseCom
28f80 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67  mand(azArg, nArg
28f90 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72  , &cmd);.  if( r
28fa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28fb0 20 20 20 20 69 6e 74 20 65 44 62 54 79 70 65 20      int eDbType 
28fc0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
28fd0 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d  PEC;.    cmd.p =
28fe0 20 70 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64   pState;.    cmd
28ff0 2e 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  .db = pState->db
29000 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46  ;.    if( cmd.zF
29010 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62  ile ){.      eDb
29020 54 79 70 65 20 3d 20 64 65 64 75 63 65 44 61 74  Type = deduceDat
29030 61 62 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46  abaseType(cmd.zF
29040 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ile, 1);.    }el
29050 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70  se{.      eDbTyp
29060 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e  e = pState->open
29070 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mode;.    }.    
29080 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45  if( eDbType==SHE
29090 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
290a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  ){.      if( cmd
290b0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58  .eCmd==AR_CMD_EX
290c0 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d  TRACT || cmd.eCm
290d0 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29  d==AR_CMD_LIST )
290e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6d  {.        if( cm
290f0 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  d.zFile==0 ){.  
29100 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63          cmd.zSrc
29110 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  Table = sqlite3_
29120 6d 70 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a  mprintf("zip");.
29130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29140 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72           cmd.zSr
29150 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
29160 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c  _mprintf("zipfil
29170 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c  e(%Q)", cmd.zFil
29180 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
29190 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
291a0 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65  bZip = 1;.    }e
291b0 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c  lse if( cmd.zFil
291c0 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  e ){.      int f
291d0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
291e0 63 6d 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44  cmd.bAppend ) eD
291f0 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
29200 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
29210 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
29220 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  ==AR_CMD_CREATE 
29230 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
29240 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  CMD_UPDATE ){.  
29250 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51        flags = SQ
29260 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
29270 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
29280 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
29290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
292a0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
292b0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
292c0 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20   }.      cmd.db 
292d0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  = 0;.      if( c
292e0 6d 64 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  md.bDryRun ){.  
292f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29300 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
29310 2d 2d 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  -- open database
29320 20 27 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e   '%s'%s\n", cmd.
29330 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  zFile,.         
29340 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45      eDbType==SHE
29350 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
29360 53 20 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e  S ? " using 'apn
29370 64 76 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20  dvfs'" : "");.  
29380 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
29390 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
293a0 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64  (cmd.zFile, &cmd
293b0 2e 64 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20  .db, flags, .   
293c0 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70            eDbTyp
293d0 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  e==SHELL_OPEN_AP
293e0 50 45 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76  PENDVFS ? "apndv
293f0 66 73 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  fs" : 0);.      
29400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29410 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  K ){.        utf
29420 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29430 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
29440 6c 65 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20  le: %s (%s)\n", 
29450 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
29460 2e 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  .zFile, sqlite3_
29470 65 72 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20  errmsg(cmd.db). 
29480 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29490 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f    goto end_ar_co
294a0 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  mmand;.      }. 
294b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
294c0 65 69 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c  eio_init(cmd.db,
294d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
294e0 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74  lite3_sqlar_init
294f0 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a  (cmd.db, 0, 0);.
29500 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72        sqlite3_cr
29510 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d  eate_function(cm
29520 64 2e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74  d.db, "shell_put
29530 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  snl", 1, SQLITE_
29540 55 54 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20  UTF8, cmd.p,.   
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
29570 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b  PutsFunc, 0, 0);
29580 0a 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ..    }.    if( 
29590 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30  cmd.zSrcTable==0
295a0 20 26 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20   && cmd.bZip==0 
295b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  ){.      if( cmd
295c0 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd!=AR_CMD_CR
295d0 45 41 54 45 0a 20 20 20 20 20 20 20 26 26 20 73  EATE.       && s
295e0 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
295f0 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64  umn_metadata(cmd
29600 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e  .db,0,"sqlar","n
29610 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a  ame",0,0,0,0,0).
29620 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29630 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29640 65 72 72 2c 20 22 64 61 74 61 62 61 73 65 20 64  err, "database d
29650 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
29660 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65  an 'sqlar' table
29670 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
29680 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
29690 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
296a0 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
296b0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
296c0 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
296d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c  te3_mprintf("sql
296e0 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ar");.    }..   
296f0 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d   switch( cmd.eCm
29700 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  d ){.      case 
29710 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20  AR_CMD_CREATE:. 
29720 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
29730 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
29740 61 6e 64 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20  and(&cmd, 0);.  
29750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
29760 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
29770 45 58 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20  EXTRACT:.       
29780 20 72 63 20 3d 20 61 72 45 78 74 72 61 63 74 43   rc = arExtractC
29790 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20  ommand(&cmd);.  
297a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
297b0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
297c0 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63  LIST:.        rc
297d0 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64   = arListCommand
297e0 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (&cmd);.        
297f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
29800 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
29810 20 20 20 20 20 20 20 20 61 72 55 73 61 67 65 28          arUsage(
29820 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20  pState->out);.  
29830 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
29840 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
29850 20 20 20 20 20 61 73 73 65 72 74 28 20 63 6d 64       assert( cmd
29860 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50  .eCmd==AR_CMD_UP
29870 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20  DATE );.        
29880 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55  rc = arCreateOrU
29890 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d  pdateCommand(&cm
298a0 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  d, 1);.        b
298b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
298c0 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a  end_ar_command:.
298d0 20 20 69 66 28 20 63 6d 64 2e 64 62 21 3d 70 53    if( cmd.db!=pS
298e0 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20  tate->db ){.    
298f0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 63 6d  sqlite3_close(cm
29900 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  d.db);.  }.  sql
29910 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53  ite3_free(cmd.zS
29920 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74  rcTable);..  ret
29930 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64  urn rc;.}./* End
29940 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76   of the ".archiv
29950 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d  e" or ".ar" comm
29960 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a  and logic.******
29970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
299a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
299b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
299c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
299d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
299e0 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
299f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
29a00 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_ZLIB) */.../*.
29a10 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c  ** If an input l
29a20 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ine begins with 
29a30 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  "." then invoke 
29a40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
29a50 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  ** process that 
29a60 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  line..**.** Retu
29a70 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
29a80 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
29a90 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
29aa0 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61  atic int do_meta
29ab0 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a  _command(char *z
29ac0 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65  Line, ShellState
29ad0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20   *p){.  int h = 
29ae0 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  1;.  int nArg = 
29af0 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20  0;.  int n, c;. 
29b00 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
29b10 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a  har *azArg[50];.
29b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29b30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
29b40 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72  E.  if( p->exper
29b50 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
29b60 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c   expertFinish(p,
29b70 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
29b80 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  if..  /* Parse t
29b90 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e  he input line in
29ba0 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  to tokens..  */.
29bb0 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
29bc0 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53  ] && nArg<ArrayS
29bd0 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20  ize(azArg) ){.  
29be0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
29bf0 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
29c00 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69  +; }.    if( zLi
29c10 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b  ne[h]==0 ) break
29c20 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  ;.    if( zLine[
29c30 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e  h]=='\'' || zLin
29c40 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  e[h]=='"' ){.   
29c50 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a     int delim = z
29c60 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20  Line[h++];.     
29c70 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
29c80 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20   &zLine[h];.    
29c90 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
29ca0 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64  ] && zLine[h]!=d
29cb0 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
29cc0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c  if( zLine[h]=='\
29cd0 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27  \' && delim=='"'
29ce0 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d   && zLine[h+1]!=
29cf0 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) h++;.       
29d00 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   h++;.      }.  
29d10 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
29d20 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  ==delim ){.     
29d30 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20     zLine[h++] = 
29d40 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
29d50 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20   if( delim=='"' 
29d60 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  ) resolve_backsl
29d70 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
29d80 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -1]);.    }else{
29d90 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
29da0 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
29db0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
29dc0 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70  Line[h] && !IsSp
29dd0 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
29de0 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   h++; }.      if
29df0 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69  ( zLine[h] ) zLi
29e00 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[h++] = 0;.   
29e10 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73     resolve_backs
29e20 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
29e30 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g-1]);.    }.  }
29e40 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
29e50 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20  he input line.. 
29e60 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d   */.  if( nArg==
29e70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  0 ) return 0; /*
29e80 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65   no tokens, no e
29e90 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74  rror */.  n = st
29ea0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29  rlen30(azArg[0])
29eb0 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d  ;.  c = azArg[0]
29ec0 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70  [0];.  clearTemp
29ed0 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  File(p);..#ifnde
29ee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29ef0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
29f00 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
29f10 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
29f20 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uth", n)==0 ){. 
29f30 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
29f40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
29f50 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
29f60 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c  e: .auth ON|OFF\
29f70 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29f80 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
29f90 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
29fa0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
29fb0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
29fc0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
29fd0 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
29fe0 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
29ff0 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
2a000 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20  shellAuth, p);. 
2a010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a020 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
2a030 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c  orizer(p->db, 0,
2a040 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2a050 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  se.#endif..#if !
2a060 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2a070 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2a080 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
2a090 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20  ITE_HAVE_ZLIB). 
2a0a0 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73   if( c=='a' && s
2a0b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2a0c0 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d   "archive", n)==
2a0d0 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
2a0e0 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
2a0f0 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c   arDotCommand(p,
2a100 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
2a110 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2a120 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
2a130 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2a140 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75  azArg[0], "backu
2a150 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  p", n)==0).   ||
2a160 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33   (c=='s' && n>=3
2a170 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2a180 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29  g[0], "save", n)
2a190 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
2a1a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
2a1b0 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ile = 0;.    con
2a1c0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2a1d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
2a1e0 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
2a1f0 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
2a200 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  p;.    int j;.  
2a210 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
2a220 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; j++){.      c
2a230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
2a240 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  zArg[j];.      i
2a250 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
2a260 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
2a270 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
2a280 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70          /* No op
2a290 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73  tions to process
2a2a0 20 61 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f   at this time */
2a2b0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2a2c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2a2d0 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
2a2e0 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
2a2f0 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20   azArg[j]);.    
2a300 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a320 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46  }else if( zDestF
2a330 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2a340 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a    zDestFile = az
2a350 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65  Arg[j];.      }e
2a360 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29  lse if( zDb==0 )
2a370 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20  {.        zDb = 
2a380 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20  zDestFile;.     
2a390 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61     zDestFile = a
2a3a0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  zArg[j];.      }
2a3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61  else{.        ra
2a3c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a3d0 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d   "too many argum
2a3e0 65 6e 74 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c  ents to .backup\
2a3f0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
2a400 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2a410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
2a420 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
2a430 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a440 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46  derr, "missing F
2a450 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74  ILENAME argument
2a460 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b   on .backup\n");
2a470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2a480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2a490 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d  Db==0 ) zDb = "m
2a4a0 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73  ain";.    rc = s
2a4b0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73  qlite3_open(zDes
2a4c0 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a  tFile, &pDest);.
2a4d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a4e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
2a4f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2a500 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2a510 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2a520 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
2a530 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2a540 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
2a550 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2a560 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2a570 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d  );.    pBackup =
2a580 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
2a590 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69  init(pDest, "mai
2a5a0 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b  n", p->db, zDb);
2a5b0 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
2a5c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
2a5d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a5e0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2a5f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2a600 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71  Dest));.      sq
2a610 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
2a620 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2a630 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
2a640 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
2a650 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
2a660 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
2a670 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
2a680 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
2a690 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
2a6a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2a6b0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2a6c0 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
2a6d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
2a6e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a6f0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2a700 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
2a710 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  st));.      rc =
2a720 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
2a730 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
2a740 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  t);.  }else..  i
2a750 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
2a760 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2a770 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e  rg[0], "bail", n
2a780 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2a790 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2a7a0 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d   bail_on_error =
2a7b0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2a7c0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
2a7d0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2a7e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2a7f0 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66  age: .bail on|of
2a800 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
2a810 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2a820 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
2a830 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2a840 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
2a850 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b  inary", n)==0 ){
2a860 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2a870 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 6f   ){.      if( bo
2a880 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2a890 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [1]) ){.        
2a8a0 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d  setBinaryMode(p-
2a8b0 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
2a8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2a8d0 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75  etTextMode(p->ou
2a8e0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
2a8f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a900 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a910 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69 6e 61  r, "Usage: .bina
2a920 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ry on|off\n");. 
2a930 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2a940 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2a950 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 63  ( c=='c' && strc
2a960 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22  mp(azArg[0],"cd"
2a970 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2a980 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64  nArg==2 ){.#if d
2a990 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
2a9a0 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
2a9b0 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74 20 2a  .      wchar_t *
2a9c0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  z = sqlite3_win3
2a9d0 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  2_utf8_to_unicod
2a9e0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2a9f0 20 20 20 72 63 20 3d 20 21 53 65 74 43 75 72 72     rc = !SetCurr
2aa00 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28 7a 29  entDirectoryW(z)
2aa10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2aa20 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20  free(z);.#else. 
2aa30 20 20 20 20 20 72 63 20 3d 20 63 68 64 69 72 28       rc = chdir(
2aa40 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69  azArg[1]);.#endi
2aa50 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2aa60 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2aa70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
2aa80 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20  annot change to 
2aa90 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73 5c 22  directory \"%s\"
2aaa0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2aab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2aac0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2aad0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2aae0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2aaf0 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54 4f 52  ge: .cd DIRECTOR
2ab00 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  Y\n");.      rc 
2ab10 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2ab20 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64  se..  /* The und
2ab30 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72 65 61  ocumented ".brea
2ab40 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20  kpoint" command 
2ab50 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20 74 6f  causes a call to
2ab60 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20   the no-op.  ** 
2ab70 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20 74 65  routine named te
2ab80 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e  st_breakpoint().
2ab90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  .  */.  if( c=='
2aba0 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
2abb0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2abc0 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29  "breakpoint", n)
2abd0 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74 5f  ==0 ){.    test_
2abe0 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
2abf0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2ac00 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'c' && n>=3 && s
2ac10 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2ac20 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d   "changes", n)==
2ac30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2ac40 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65  g==2 ){.      se
2ac50 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  tOrClearFlag(p, 
2ac60 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67  SHFLG_CountChang
2ac70 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  es, azArg[1]);. 
2ac80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ac90 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2aca0 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 61 6e  r, "Usage: .chan
2acb0 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ges on|off\n");.
2acc0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2acd0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
2ace0 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75 74 20  * Cancel output 
2acf0 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69 66 20  redirection, if 
2ad00 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2ad10 73 65 74 20 28 62 79 20 2e 74 65 73 74 63 61 73  set (by .testcas
2ad20 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65 61  e).  ** Then rea
2ad30 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
2ad40 20 74 68 65 20 74 65 73 74 63 61 73 65 2d 6f 75   the testcase-ou
2ad50 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64 20 63  t.txt file and c
2ad60 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 0a 20  ompare against. 
2ad70 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49   ** azArg[1].  I
2ad80 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
2ad90 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72 74 20  erences, report 
2ada0 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65 78 69  an error and exi
2adb0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d  t..  */.  if( c=
2adc0 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='c' && n>=3 && 
2add0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ade0 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30  , "check", n)==0
2adf0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52   ){.    char *zR
2ae00 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70  es = 0;.    outp
2ae10 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  ut_reset(p);.   
2ae20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
2ae30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ae40 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2ae50 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54   .check GLOB-PAT
2ae60 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  TERN\n");.      
2ae70 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  rc = 2;.    }els
2ae80 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20 72 65  e if( (zRes = re
2ae90 61 64 46 69 6c 65 28 22 74 65 73 74 63 61 73 65  adFile("testcase
2aea0 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d  -out.txt", 0))==
2aeb0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
2aec0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2aed0 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61  rror: cannot rea
2aee0 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  d 'testcase-out.
2aef0 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20  txt'\n");.      
2af00 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  rc = 2;.    }els
2af10 65 20 69 66 28 20 74 65 73 74 63 61 73 65 5f 67  e if( testcase_g
2af20 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65  lob(azArg[1],zRe
2af30 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  s)==0 ){.      u
2af40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2af50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2af60 20 20 20 20 22 74 65 73 74 63 61 73 65 2d 25 73      "testcase-%s
2af70 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65 63 74   FAILED\n Expect
2af80 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20  ed: [%s]\n      
2af90 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  Got: [%s]\n",.  
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2afb0 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61 7a 41  ->zTestcase, azA
2afc0 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20  rg[1], zRes);.  
2afd0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2afe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
2aff0 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  8_printf(stdout,
2b000 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 6f 6b   "testcase-%s ok
2b010 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73  \n", p->zTestcas
2b020 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68  e);.      p->nCh
2b030 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eck++;.    }.   
2b040 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
2b050 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  es);.  }else..  
2b060 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
2b070 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2b080 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29  "clone", n)==0 )
2b090 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2b0a0 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f  2 ){.      tryTo
2b0b0 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31  Clone(p, azArg[1
2b0c0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2b0d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2b0e0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2b0f0 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c  .clone FILENAME\
2b100 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2b110 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2b120 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
2b130 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70  & n>1 && strncmp
2b140 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61  (azArg[0], "data
2b150 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  bases", n)==0 ){
2b160 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20  .    ShellState 
2b170 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
2b180 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
2b190 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b1a0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2b1b0 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
2b1c0 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
2b1d0 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
2b1e0 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2b1f0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  ta.mode = MODE_L
2b200 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
2b210 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2b220 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  (data.colSeparat
2b230 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61  or),data.colSepa
2b240 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20  rator,": ");.   
2b250 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20   data.cnt = 0;. 
2b260 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2b270 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e  p->db, "SELECT n
2b280 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70  ame, file FROM p
2b290 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c  ragma_database_l
2b2a0 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ist",.          
2b2b0 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
2b2c0 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
2b2d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
2b2e0 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  sg ){.      utf8
2b2f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2b300 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
2b310 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
2b320 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
2b330 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
2b340 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2b350 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
2b360 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2b370 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63  p(azArg[0], "dbc
2b380 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b  onfig", n)==0 ){
2b390 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2b3a0 74 20 73 74 72 75 63 74 20 44 62 43 6f 6e 66 69  t struct DbConfi
2b3b0 67 43 68 6f 69 63 65 73 20 7b 63 6f 6e 73 74 20  gChoices {const 
2b3c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74  char *zName; int
2b3d0 20 6f 70 3b 7d 20 61 44 62 43 6f 6e 66 69 67 5b   op;} aDbConfig[
2b3e0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
2b3f0 22 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20  "enable_fkey",  
2b400 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
2b410 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20  FIG_ENABLE_FKEY 
2b420 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2b430 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f        { "enable_
2b440 74 72 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49  trigger",   SQLI
2b450 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
2b460 4c 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  LE_TRIGGER      
2b470 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
2b480 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22  "fts3_tokenizer"
2b490 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ,   SQLITE_DBCON
2b4a0 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
2b4b0 54 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20  TOKENIZER  },.  
2b4c0 20 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78        { "load_ex
2b4d0 74 65 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49  tension",   SQLI
2b4e0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
2b4f0 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
2b500 4e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  N  },.        { 
2b510 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73  "no_ckpt_on_clos
2b520 65 22 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  e", SQLITE_DBCON
2b530 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43  FIG_NO_CKPT_ON_C
2b540 4c 4f 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20  LOSE       },.  
2b550 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f        { "enable_
2b560 71 70 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49  qpsg",      SQLI
2b570 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
2b580 4c 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20  LE_QPSG         
2b590 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
2b5a0 22 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20  "trigger_eqp",  
2b5b0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
2b5c0 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20  FIG_TRIGGER_EQP 
2b5d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2b5e0 20 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64        { "reset_d
2b5f0 61 74 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49  atabase",   SQLI
2b600 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45  TE_DBCONFIG_RESE
2b610 54 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20  T_DATABASE      
2b620 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
2b630 20 69 6e 74 20 69 69 2c 20 76 3b 0a 20 20 20 20   int ii, v;.    
2b640 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2b650 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2b660 41 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e  ArraySize(aDbCon
2b670 66 69 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  fig); ii++){.   
2b680 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26     if( nArg>1 &&
2b690 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2b6a0 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e  , aDbConfig[ii].
2b6b0 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74  zName)!=0 ) cont
2b6c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2b6d0 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20  nArg>=3 ){.     
2b6e0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
2b6f0 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43  nfig(p->db, aDbC
2b700 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f  onfig[ii].op, bo
2b710 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2b720 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  [2]), 0);.      
2b730 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
2b740 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
2b750 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f   aDbConfig[ii].o
2b760 70 2c 20 2d 31 2c 20 26 76 29 3b 0a 20 20 20 20  p, -1, &v);.    
2b770 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2b780 3e 6f 75 74 2c 20 22 25 31 38 73 20 25 73 5c 6e  >out, "%18s %s\n
2b790 22 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d  ", aDbConfig[ii]
2b7a0 2e 7a 4e 61 6d 65 2c 20 76 20 3f 20 22 6f 6e 22  .zName, v ? "on"
2b7b0 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 20   : "off");.     
2b7c0 20 69 66 28 20 6e 41 72 67 3e 31 20 29 20 62 72   if( nArg>1 ) br
2b7d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2b7e0 66 28 20 6e 41 72 67 3e 31 20 26 26 20 69 69 3d  f( nArg>1 && ii=
2b7f0 3d 41 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f  =ArraySize(aDbCo
2b800 6e 66 69 67 29 20 29 7b 0a 20 20 20 20 20 20 75  nfig) ){.      u
2b810 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2b820 72 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f  r, "Error: unkno
2b830 77 6e 20 64 62 63 6f 6e 66 69 67 20 5c 22 25 73  wn dbconfig \"%s
2b840 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2b850 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
2b860 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 6e 74  ntf(stderr, "Ent
2b870 65 72 20 5c 22 2e 64 62 63 6f 6e 66 69 67 5c 22  er \".dbconfig\"
2b880 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
2b890 74 73 20 66 6f 72 20 61 20 6c 69 73 74 5c 6e 22  ts for a list\n"
2b8a0 29 3b 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65  );.    }   .  }e
2b8b0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
2b8c0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2b8d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2b8e0 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29  dbinfo", n)==0 )
2b8f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  {.    rc = shell
2b900 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28  _dbinfo_command(
2b910 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b  p, nArg, azArg);
2b920 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2b930 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
2b940 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d  p(azArg[0], "dum
2b950 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
2b960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
2b970 6b 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ke = 0;.    int 
2b980 69 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64  i;.    int saved
2b990 53 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e  ShowHeader = p->
2b9a0 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
2b9b0 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
2b9c0 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  , SHFLG_Preserve
2b9d0 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c  Rowid|SHFLG_Newl
2b9e0 69 6e 65 73 29 3b 0a 20 20 20 20 66 6f 72 28 69  ines);.    for(i
2b9f0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
2ba00 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
2ba10 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  g[i][0]=='-' ){.
2ba20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2ba30 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
2ba40 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
2ba50 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[0]=='-' ) z++;
2ba60 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
2ba70 63 6d 70 28 7a 2c 22 70 72 65 73 65 72 76 65 2d  cmp(z,"preserve-
2ba80 72 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23  rowids")==0 ){.#
2ba90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2baa0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2bab0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
2bac0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54 68 65  ntf(stderr, "The
2bad0 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69   --preserve-rowi
2bae0 64 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74  ds option is not
2baf0 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20 20   compatible".   
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb10 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68            " with
2bb20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2bb30 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20  TUALTABLE\n");. 
2bb40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
2bb50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2bb60 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2bb70 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  t;.#else.       
2bb80 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28     ShellSetFlag(
2bb90 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76  p, SHFLG_Preserv
2bba0 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a  eRowid);.#endif.
2bbb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
2bbc0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2bbd0 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d  (z,"newlines")==
2bbe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  0 ){.          S
2bbf0 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53  hellSetFlag(p, S
2bc00 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a  HFLG_Newlines);.
2bc10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
2bc20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2bc30 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2bc40 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
2bc50 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
2bc60 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41  ".dump\"\n", azA
2bc70 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
2bc80 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2bc90 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2bca0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2bcb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2bcc0 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20  e if( zLike ){. 
2bcd0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
2bce0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2bcf0 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65  : .dump ?--prese
2bd00 72 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20  rve-rowids? ".  
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd20 20 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77           "?--new
2bd30 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54  lines? ?LIKE-PAT
2bd40 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  TERN?\n");.     
2bd50 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2bd60 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2bd70 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2bd80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bd90 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d  zLike = azArg[i]
2bda0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bdb0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2bdc0 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  );.    /* When p
2bdd0 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64  laying back a "d
2bde0 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ump", the conten
2bdf0 74 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  t might appear i
2be00 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  n an order.    *
2be10 2a 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69  * which causes i
2be20 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
2be30 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
2be40 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e   to be violated.
2be50 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62  .    ** So disab
2be60 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63  le foreign-key c
2be70 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63  onstraint enforc
2be80 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74  ement to prevent
2be90 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20   problems. */.  
2bea0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2beb0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  out, "PRAGMA for
2bec0 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e  eign_keys=OFF;\n
2bed0 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
2bee0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49  tf(p->out, "BEGI
2bef0 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e  N TRANSACTION;\n
2bf00 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61  ");.    p->writa
2bf10 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  bleSchema = 0;. 
2bf20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
2bf30 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74   = 0;.    /* Set
2bf40 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
2bf50 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  =ON since doing 
2bf60 73 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65  so forces SQLite
2bf70 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
2bf80 20 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66     ** as much of
2bf90 20 74 68 65 20 73 63 68 65 6d 61 20 61 73 20 69   the schema as i
2bfa0 74 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68  t can even if th
2bfb0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bfc0 74 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20  table is.    ** 
2bfd0 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2bfe0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2bff0 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64  db, "SAVEPOINT d
2c000 75 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74  ump; PRAGMA writ
2c010 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c  able_schema=ON",
2c020 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
2c030 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  ->nErr = 0;.    
2c040 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a  if( zLike==0 ){.
2c050 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
2c060 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
2c070 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2c080 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
2c090 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2c0a0 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2c0b0 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20  RE sql NOT NULL 
2c0c0 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
2c0d0 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c  ' AND name!='sql
2c0e0 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
2c0f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
2c100 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
2c110 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
2c120 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2c130 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2c140 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2c150 20 20 20 20 22 57 48 45 52 45 20 6e 61 6d 65 3d      "WHERE name=
2c160 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  ='sqlite_sequenc
2c170 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  e'".      );.   
2c180 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
2c190 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
2c1a0 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
2c1b0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2c1c0 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2c1d0 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20  RE sql NOT NULL 
2c1e0 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e  AND type IN ('in
2c1f0 64 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27  dex','trigger','
2c200 76 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20 20  view')", 0.     
2c210 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
2c220 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b       char *zSql;
2c230 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
2c240 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
2c250 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2c260 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
2c270 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2c280 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2c290 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  RE tbl_name LIKE
2c2a0 20 25 51 20 41 4e 44 20 74 79 70 65 3d 3d 27 74   %Q AND type=='t
2c2b0 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 22  able'".        "
2c2c0 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55    AND sql NOT NU
2c2d0 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20  LL", zLike);.   
2c2e0 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
2c2f0 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c 29  mp_query(p,zSql)
2c300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c310 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2c320 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2c330 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2c340 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
2c350 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2c360 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
2c370 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a  E sql NOT NULL".
2c380 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74          "  AND t
2c390 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
2c3a0 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
2c3b0 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  )".        "  AN
2c3c0 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
2c3d0 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20  %Q", zLike);.   
2c3e0 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d     run_table_dum
2c3f0 70 5f 71 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c  p_query(p, zSql,
2c400 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2c410 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2c420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
2c430 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29  writableSchema )
2c440 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c450 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
2c460 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
2c470 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ma=OFF;\n");.   
2c480 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
2c490 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  hema = 0;.    }.
2c4a0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
2c4b0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
2c4c0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
2c4d0 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  OFF;", 0, 0, 0);
2c4e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
2c4f0 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53  c(p->db, "RELEAS
2c500 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20  E dump;", 0, 0, 
2c510 30 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  0);.    raw_prin
2c520 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45  tf(p->out, p->nE
2c530 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20  rr ? "ROLLBACK; 
2c540 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73  -- due to errors
2c550 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e  \n" : "COMMIT;\n
2c560 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48  ");.    p->showH
2c570 65 61 64 65 72 20 3d 20 73 61 76 65 64 53 68 6f  eader = savedSho
2c580 77 48 65 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65  wHeader;.  }else
2c590 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
2c5a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2c5b0 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d  0], "echo", n)==
2c5c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2c5d0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65  g==2 ){.      se
2c5e0 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  tOrClearFlag(p, 
2c5f0 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72  SHFLG_Echo, azAr
2c600 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2c610 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c620 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c630 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c  e: .echo on|off\
2c640 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2c650 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2c660 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
2c670 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2c680 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30  0], "eqp", n)==0
2c690 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2c6a0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
2c6b0 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2c6c0 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"full")==0 ){. 
2c6d0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2c6e0 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c  P = AUTOEQP_full
2c6f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2c700 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2c710 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d 30 20  ],"trigger")==0 
2c720 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  ){.        p->au
2c730 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f  toEQP = AUTOEQP_
2c740 74 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d  trigger;.      }
2c750 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
2c760 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29 62  >autoEQP = (u8)b
2c770 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2c780 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g[1]);.      }. 
2c790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c7a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c7b0 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70 20  r, "Usage: .eqp 
2c7c0 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65 72 7c 66  off|on|trigger|f
2c7d0 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ull\n");.      r
2c7e0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2c7f0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2c800 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
2c810 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20  Arg[0], "exit", 
2c820 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2c830 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20 3d   nArg>1 && (rc =
2c840 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
2c850 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30  ue(azArg[1]))!=0
2c860 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20   ) exit(rc);.   
2c870 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65   rc = 2;.  }else
2c880 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e 65 78 70  ..  /* The ".exp
2c890 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  lain" command is
2c8a0 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e 20   automatic now. 
2c8b0 20 49 74 20 69 73 20 6c 61 72 67 65 6c 79 20 70   It is largely p
2c8c0 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20 20  ointless.  It.  
2c8d0 2a 2a 20 72 65 74 61 69 6e 65 64 20 70 75 72 65  ** retained pure
2c8e0 6c 79 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73  ly for backwards
2c8f0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2a   compatibility *
2c900 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  /.  if( c=='e' &
2c910 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2c920 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e  0], "explain", n
2c930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
2c940 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  val = 1;.    if(
2c950 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20   nArg>=2 ){.    
2c960 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41    if( strcmp(azA
2c970 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d 30  rg[1],"auto")==0
2c980 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20   ){.        val 
2c990 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = 99;.      }els
2c9a0 65 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d  e{.        val =
2c9b0 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61    booleanValue(a
2c9c0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2c9d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2c9e0 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f 64  val==1 && p->mod
2c9f0 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e!=MODE_Explain 
2ca00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d  ){.      p->norm
2ca10 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  alMode = p->mode
2ca20 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  ;.      p->mode 
2ca30 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
2ca40 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
2ca50 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
2ca60 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 30 20 29  lse if( val==0 )
2ca70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  {.      if( p->m
2ca80 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
2ca90 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d  n ) p->mode = p-
2caa0 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20  >normalMode;.   
2cab0 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69     p->autoExplai
2cac0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 0;.    }else
2cad0 20 69 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b 0a   if( val==99 ){.
2cae0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
2caf0 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
2cb00 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e  ) p->mode = p->n
2cb10 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20  ormalMode;.     
2cb20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
2cb30 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2cb40 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
2cb50 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2cb60 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 65  ABLE.  if( c=='e
2cb70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2cb80 72 67 5b 30 5d 2c 20 22 65 78 70 65 72 74 22 2c  rg[0], "expert",
2cb90 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
2cba0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2cbb0 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e   expertDotComman
2cbc0 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
2cbd0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
2cbe0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20  f..  if( c=='f' 
2cbf0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2cc00 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61  [0], "fullschema
2cc10 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2cc20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
2cc30 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
2cc40 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  sg = 0;.    int 
2cc50 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20  doStats = 0;.   
2cc60 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
2cc70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
2cc80 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
2cc90 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
2cca0 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2ccb0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69  mode = MODE_Semi
2ccc0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
2ccd0 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68  2 && optionMatch
2cce0 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65  (azArg[1], "inde
2ccf0 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61  nt") ){.      da
2cd00 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2cd10 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74  mode = MODE_Pret
2cd20 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  ty;.      nArg =
2cd30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2cd40 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20  ( nArg!=1 ){.   
2cd50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2cd60 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66  derr, "Usage: .f
2cd70 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  ullschema ?--ind
2cd80 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ent?\n");.      
2cd90 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2cda0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2cdb0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2cdc0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2cdd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2cde0 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
2cdf0 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
2ce00 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28  ROM".       "  (
2ce10 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20  SELECT sql sql, 
2ce20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e  type type, tbl_n
2ce30 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  ame tbl_name, na
2ce40 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78  me name, rowid x
2ce50 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20 46  ".       "     F
2ce60 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2ce70 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
2ce80 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73      "   SELECT s
2ce90 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61  ql, type, tbl_na
2cea0 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  me, name, rowid 
2ceb0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
2cec0 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20  _master) ".     
2ced0 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27    "WHERE type!='
2cee0 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
2cef0 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e  TNULL AND name N
2cf00 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
2cf10 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44  %' ".       "ORD
2cf20 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20  ER BY rowid",.  
2cf30 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
2cf40 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20  data, &zErrMsg. 
2cf50 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
2cf60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cf70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
2cf80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t *pStmt;.      
2cf90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2cfa0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20  pare_v2(p->db,. 
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
2cfc0 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
2cfd0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2cff0 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42   WHERE name GLOB
2d000 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33   'sqlite_stat[13
2d010 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20  4]'",.          
2d020 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
2d030 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61   0);.      doSta
2d040 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  ts = sqlite3_ste
2d050 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
2d060 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69  _ROW;.      sqli
2d070 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2d080 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  mt);.    }.    i
2d090 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b  f( doStats==0 ){
2d0a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2d0b0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f  f(p->out, "/* No
2d0c0 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76 61   STAT tables ava
2d0d0 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20  ilable */\n");. 
2d0e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d0f0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d100 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69  t, "ANALYZE sqli
2d110 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a  te_master;\n");.
2d120 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
2d130 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
2d140 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  T 'ANALYZE sqlit
2d150 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20  e_master'",.    
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2d170 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
2d180 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
2d190 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2d1a0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  ta.mode = MODE_I
2d1b0 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74  nsert;.      dat
2d1c0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
2d1d0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20  sqlite_stat1";. 
2d1e0 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
2d1f0 70 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  p, "SELECT * FRO
2d200 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  M sqlite_stat1",
2d210 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2d220 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
2d230 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
2d240 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  3";.      shell_
2d250 65 78 65 63 28 70 2c 20 22 53 45 4c 45 43 54 20  exec(p, "SELECT 
2d260 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
2d270 61 74 33 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at3", &zErrMsg);
2d280 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
2d290 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
2d2a0 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73  _stat4";.      s
2d2b0 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 22 53 45  hell_exec(p, "SE
2d2c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
2d2d0 74 65 5f 73 74 61 74 34 22 2c 20 26 7a 45 72 72  te_stat4", &zErr
2d2e0 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  Msg);.      raw_
2d2f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2d300 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
2d310 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
2d320 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2d330 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63   c=='h' && strnc
2d340 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65  mp(azArg[0], "he
2d350 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  aders", n)==0 ){
2d360 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2d370 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f   ){.      p->sho
2d380 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61  wHeader = boolea
2d390 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2d3a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d3b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2d3c0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68  derr, "Usage: .h
2d3d0 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22  eaders on|off\n"
2d3e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2d3f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2d400 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20    if( c=='h' && 
2d410 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d420 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20  , "help", n)==0 
2d430 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
2d440 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
2d450 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65   zHelp);.  }else
2d460 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26  ..  if( c=='i' &
2d470 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d480 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29  0], "import", n)
2d490 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
2d4a0 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *zTable;        
2d4b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
2d4c0 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
2d4d0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
2d4e0 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
2d4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2d500 20 6f 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72   of file to extr
2d510 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a  a content from *
2d520 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
2d530 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
2d540 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  ; /* A statement
2d550 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
2d560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d570 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d580 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2d590 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
2d5a0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
2d5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d5c0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2d5d0 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a  n SQL string */.
2d5e0 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20      int i, j;   
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d600 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2d610 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
2d620 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20  Commit;         
2d630 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43      /* True to C
2d640 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
2d650 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20  K at end */.    
2d660 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
2d670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d680 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2d690 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  n p->colSeparato
2d6a0 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  r[] */.    char 
2d6b0 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
2d6c0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
2d6d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
2d6e0 20 20 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78    ImportCtx sCtx
2d6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d700 20 52 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20   Reader context 
2d710 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51  */.    char *(SQ
2d720 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61  LITE_CDECL *xRea
2d730 64 29 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20  d)(ImportCtx*); 
2d740 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20  /* Func to read 
2d750 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  one value */.   
2d760 20 69 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45   int (SQLITE_CDE
2d770 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c  CL *xCloser)(FIL
2d780 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e  E*);      /* Fun
2d790 63 20 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20  c to close file 
2d7a0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  */..    if( nArg
2d7b0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=3 ){.      raw
2d7c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d7d0 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20  "Usage: .import 
2d7e0 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a  FILE TABLE\n");.
2d7f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2d800 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2d810 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
2d820 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54  azArg[1];.    zT
2d830 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  able = azArg[2];
2d840 0a 20 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75  .    seenInterru
2d850 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  pt = 0;.    mems
2d860 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a  et(&sCtx, 0, siz
2d870 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20  eof(sCtx));.    
2d880 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2d890 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
2d8a0 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
2d8b0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
2d8c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  p==0 ){.      ra
2d8d0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d8f0 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75    "Error: non-nu
2d900 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ll column separa
2d910 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
2d920 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
2d930 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2d940 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e   }.    if( nSep>
2d950 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
2d960 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2d970 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72  rror: multi-char
2d980 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70  acter column sep
2d990 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
2d9a0 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
2d9b0 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
2d9c0 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
2d9d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2d9e0 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74   }.    nSep = st
2d9f0 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
2da00 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  arator);.    if(
2da10 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
2da20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2da30 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e  err, "Error: non
2da40 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61  -null row separa
2da50 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
2da60 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
2da70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2da80 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d   }.    if( nSep=
2da90 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d  =2 && p->mode==M
2daa0 4f 44 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d  ODE_Csv && strcm
2dab0 70 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  p(p->rowSeparato
2dac0 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20  r, SEP_CrLf)==0 
2dad0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ){.      /* When
2dae0 20 69 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28   importing CSV (
2daf0 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f  only), if the ro
2db00 77 20 73 65 70 61 72 61 74 6f 72 20 69 73 20 73  w separator is s
2db10 65 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  et to the.      
2db20 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75  ** default outpu
2db30 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c  t row separator,
2db40 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68   change it to th
2db50 65 20 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a  e default input.
2db60 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70        ** row sep
2db70 61 72 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76  arator.  This av
2db80 6f 69 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d  oids having to m
2db90 61 69 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e  aintain differen
2dba0 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a  t input.      **
2dbb0 20 61 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20   and output row 
2dbc0 73 65 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20  separators. */. 
2dbd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2dbe0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2dbf0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2dc00 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2dc10 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20  SEP_Row);.      
2dc20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
2dc30 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2dc40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2dc50 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSep>1 ){.      
2dc60 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2dc70 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69  r, "Error: multi
2dc80 2d 63 68 61 72 61 63 74 65 72 20 72 6f 77 20 73  -character row s
2dc90 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c  eparators not al
2dca0 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20 20  lowed".         
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66               " f
2dcc0 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
2dcd0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2dce0 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46     }.    sCtx.zF
2dcf0 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20  ile = zFile;.   
2dd00 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b   sCtx.nLine = 1;
2dd10 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46  .    if( sCtx.zF
2dd20 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23  ile[0]=='|' ){.#
2dd30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2dd40 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61  T_POPEN.      ra
2dd50 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2dd60 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61   "Error: pipes a
2dd70 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
2dd80 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b   in this OS\n");
2dd90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2dda0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74  .#else.      sCt
2ddb0 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74  x.in = popen(sCt
2ddc0 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b  x.zFile+1, "r");
2ddd0 0a 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c  .      sCtx.zFil
2dde0 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20  e = "<pipe>";.  
2ddf0 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63      xCloser = pc
2de00 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  lose;.#endif.   
2de10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43   }else{.      sC
2de20 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43  tx.in = fopen(sC
2de30 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  tx.zFile, "rb");
2de40 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
2de50 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20   fclose;.    }. 
2de60 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
2de70 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20  MODE_Ascii ){.  
2de80 20 20 20 20 78 52 65 61 64 20 3d 20 61 73 63 69      xRead = asci
2de90 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  i_read_one_field
2dea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2deb0 20 20 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72     xRead = csv_r
2dec0 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
2ded0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74     }.    if( sCt
2dee0 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x.in==0 ){.     
2def0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2df00 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2df10 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
2df20 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
2df30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2df40 7d 0a 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53  }.    sCtx.cColS
2df50 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72  ep = p->colSepar
2df60 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74  ator[0];.    sCt
2df70 78 2e 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72  x.cRowSep = p->r
2df80 6f 77 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  owSeparator[0];.
2df90 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2dfa0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
2dfb0 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a  CT * FROM %s", z
2dfc0 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
2dfd0 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
2dfe0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2dff0 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f  );.      shell_o
2e000 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
2e010 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
2e020 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
2e030 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e040 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2e050 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
2e060 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
2e070 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
2e080 72 28 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20  r(&sCtx, 0);    
2e090 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74  /* To ensure sCt
2e0a0 78 2e 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  x.z is allocated
2e0b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26   */.    if( rc &
2e0c0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  & sqlite3_strglo
2e0d0 62 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  b("no such table
2e0e0 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  : *", sqlite3_er
2e0f0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20  rmsg(p->db))==0 
2e100 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2e110 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
2e120 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45  _mprintf("CREATE
2e130 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62   TABLE %s", zTab
2e140 6c 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  le);.      char 
2e150 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20  cSep = '(';.    
2e160 20 20 77 68 69 6c 65 28 20 78 52 65 61 64 28 26    while( xRead(&
2e170 73 43 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20  sCtx) ){.       
2e180 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74   zCreate = sqlit
2e190 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63  e3_mprintf("%z%c
2e1a0 5c 6e 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22  \n  \"%w\" TEXT"
2e1b0 2c 20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c  , zCreate, cSep,
2e1c0 20 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20   sCtx.z);.      
2e1d0 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
2e1e0 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63        if( sCtx.c
2e1f0 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53  Term!=sCtx.cColS
2e200 65 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ep ) break;.    
2e210 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53    }.      if( cS
2e220 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  ep=='(' ){.     
2e230 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e240 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
2e250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
2e260 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
2e270 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2e280 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
2e290 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
2e2a0 3a 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c  : empty file\n",
2e2b0 20 73 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20   sCtx.zFile);.  
2e2c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2e2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
2e2e0 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
2e2f0 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c  mprintf("%z\n)",
2e300 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20   zCreate);.     
2e310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2e320 65 63 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74  ec(p->db, zCreat
2e330 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
2e340 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e350 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
2e360 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e370 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2e380 64 65 72 72 2c 20 22 43 52 45 41 54 45 20 54 41  derr, "CREATE TA
2e390 42 4c 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c  BLE %s(...) fail
2e3a0 65 64 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c  ed: %s\n", zTabl
2e3b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2e3c0 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
2e3d0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2e3e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e3f0 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20  sCtx.z);.       
2e400 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2e410 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2e420 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2e430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2e440 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2e450 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2e460 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  mt, 0);.    }.  
2e470 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e480 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
2e490 20 29 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53   ){.      if (pS
2e4a0 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e  tmt) sqlite3_fin
2e4b0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2e4c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e4d0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
2e4e0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2e4f0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
2e500 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2e510 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  .in);.      retu
2e520 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2e530 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
2e540 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
2e550 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2e560 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2e570 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a  .    pStmt = 0;.
2e580 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
2e590 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
2e5a0 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72  o columns, no er
2e5b0 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20  ror */.    zSql 
2e5c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2e5d0 36 34 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30  64( nByte*2 + 20
2e5e0 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20   + nCol*2 );.   
2e5f0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
2e600 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2e610 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68  tx.in);.      sh
2e620 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
2e630 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  y();.    }.    s
2e640 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2e650 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20  nByte+20, zSql, 
2e660 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25  "INSERT INTO \"%
2e670 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  w\" VALUES(?", z
2e680 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
2e690 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
2e6a0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2e6b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2e6c0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
2e6d0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
2e6e0 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
2e6f0 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
2e700 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
2e710 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
2e720 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2e730 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2e740 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2e750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e760 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
2e770 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2e780 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2e790 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2e7a0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2e7b0 62 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70  b));.      if (p
2e7c0 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69  Stmt) sqlite3_fi
2e7d0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2e7e0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2e7f0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  x.in);.      ret
2e800 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2e810 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71   needCommit = sq
2e820 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
2e830 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  mmit(p->db);.   
2e840 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20   if( needCommit 
2e850 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ) sqlite3_exec(p
2e860 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
2e870 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b  , 0, 0);.    do{
2e880 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
2e890 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e  Line = sCtx.nLin
2e8a0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
2e8b0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
2e8c0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
2e8d0 3d 20 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a  = xRead(&sCtx);.
2e8e0 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20          /*.     
2e8f0 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61     ** Did we rea
2e900 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62  ch end-of-file b
2e910 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e  efore finding an
2e920 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20  y columns?.     
2e930 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f     ** If so, sto
2e940 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c  p instead of NUL
2e950 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65  L filling the re
2e960 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e  maining columns.
2e970 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e980 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20      if( z==0 && 
2e990 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
2e9a0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
2e9b0 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
2e9c0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20   end-of-file OR 
2e9d0 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f  end-of-line befo
2e9e0 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20  re finding any. 
2e9f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e         ** column
2ea00 73 20 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f  s in ASCII mode?
2ea10 20 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e    If so, stop in
2ea20 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
2ea30 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
2ea40 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
2ea50 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
2ea60 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
2ea70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63  ->mode==MODE_Asc
2ea80 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a  ii && (z==0 || z
2ea90 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20  [0]==0) && i==0 
2eaa0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2eab0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
2eac0 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a  xt(pStmt, i+1, z
2ead0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
2eae0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20  NSIENT);.       
2eaf0 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26   if( i<nCol-1 &&
2eb00 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
2eb10 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20  x.cColSep ){.   
2eb20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2eb30 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
2eb40 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
2eb50 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
2eb60 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
2eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb80 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72    "filling the r
2eb90 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22  est with NULL\n"
2eba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
2ebc0 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
2ebd0 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  e, nCol, i+1);. 
2ebe0 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b           i += 2;
2ebf0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2ec00 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c  ( i<=nCol ){ sql
2ec10 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
2ec20 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d  Stmt, i); i++; }
2ec30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ec40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43 74   }.      if( sCt
2ec50 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43  x.cTerm==sCtx.cC
2ec60 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
2ec70 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78   do{.          x
2ec80 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20  Read(&sCtx);.   
2ec90 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2eca0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78      }while( sCtx
2ecb0 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f  .cTerm==sCtx.cCo
2ecc0 6c 53 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20  lSep );.        
2ecd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2ece0 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65  rr, "%s:%d: expe
2ecf0 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2ed00 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22  but found %d - "
2ed10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ed20 20 20 20 20 20 20 20 20 20 22 65 78 74 72 61 73           "extras
2ed30 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20   ignored\n",.   
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed50 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c       sCtx.zFile,
2ed60 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c   startLine, nCol
2ed70 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
2ed80 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20      if( i>=nCol 
2ed90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2eda0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
2edb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2edc0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
2edd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ede0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2edf0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2ee00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
2ee10 73 3a 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69  s:%d: INSERT fai
2ee20 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78  led: %s\n", sCtx
2ee30 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  .zFile,.        
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2ee50 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33  artLine, sqlite3
2ee60 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2ee70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee80 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73   }.    }while( s
2ee90 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29  Ctx.cTerm!=EOF )
2eea0 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73  ;..    xCloser(s
2eeb0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c  Ctx.in);.    sql
2eec0 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2eed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2eee0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2eef0 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d      if( needComm
2ef00 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  it ) sqlite3_exe
2ef10 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54  c(p->db, "COMMIT
2ef20 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
2ef30 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2ef40 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
2ef50 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
2ef60 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ef70 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29  , "imposter", n)
2ef80 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
2ef90 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20  *zSql;.    char 
2efa0 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20  *zCollist = 0;. 
2efb0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2efc0 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *pStmt;.    int 
2efd0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  tnum = 0;.    in
2efe0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 21 28 6e  t i;.    if( !(n
2eff0 41 72 67 3d 3d 33 20 7c 7c 20 28 6e 41 72 67 3d  Arg==3 || (nArg=
2f000 3d 32 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  =2 && sqlite3_st
2f010 72 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  ricmp(azArg[1],"
2f020 6f 66 66 22 29 3d 3d 30 29 29 20 29 7b 0a 20 20  off")==0)) ){.  
2f030 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f040 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2f050 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
2f060 49 4d 50 4f 53 54 45 52 5c 6e 22 0a 20 20 20 20  IMPOSTER\n".    
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 20 20 20 20 20 20 22 20 20 20 20 20 20 20 2e 69        "       .i
2f090 6d 70 6f 73 74 65 72 20 6f 66 66 5c 6e 22 29 3b  mposter off\n");
2f0a0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2f0b0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2f0c0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2f0d0 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
2f0e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41  , 0);.    if( nA
2f0f0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
2f100 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2f110 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2f120 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
2f130 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  >db, "main", 0, 
2f140 31 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  1);.      goto m
2f150 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
2f170 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2f180 74 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  tf("SELECT rootp
2f190 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
2f1a0 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1c0 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
2f1d0 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
2f1e0 6e 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d  ndex'", azArg[1]
2f1f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
2f200 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2f210 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2f220 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
2f230 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2f240 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2f250 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
2f260 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
2f270 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  tnum = sqlite3_c
2f280 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2f290 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2f2a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2f2b0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
2f2c0 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
2f2d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2f2e0 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  err, "no such in
2f2f0 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  dex: \"%s\"\n", 
2f300 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2f310 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2f320 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2f330 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2f340 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2f350 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
2f360 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27  index_xinfo='%q'
2f370 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2f380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2f390 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2f3a0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2f3b0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
2f3c0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2f3d0 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68     i = 0;.    wh
2f3e0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
2f3f0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
2f400 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 68  _ROW ){.      ch
2f410 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20  ar zLabel[20];. 
2f420 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2f430 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zCol = (const c
2f440 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2f450 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
2f460 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
2f470 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20      if( zCol==0 
2f480 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
2f490 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f4a0 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29  t(pStmt,1)==-1 )
2f4b0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
2f4c0 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20   = "_ROWID_";.  
2f4d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f4e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2f4f0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2f500 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65  Label),zLabel,"e
2f510 78 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20 20  xpr%d",i);.     
2f520 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62       zCol = zLab
2f530 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  el;.        }.  
2f540 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f550 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  zCollist==0 ){. 
2f560 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20         zCollist 
2f570 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f580 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c  f("\"%w\"", zCol
2f590 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f5a0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
2f5b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2f5c0 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20  tf("%z,\"%w\"", 
2f5d0 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b  zCollist, zCol);
2f5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f5f0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2f600 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2f610 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2f620 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2f630 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
2f640 5c 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41 52  \"%w\"(%s,PRIMAR
2f650 59 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f 55  Y KEY(%s))WITHOU
2f660 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20  T ROWID",.      
2f670 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43      azArg[2], zC
2f680 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74  ollist, zCollist
2f690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2f6a0 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20  ree(zCollist);. 
2f6b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2f6c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2f6d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2f6e0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
2f6f0 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a  ain", 1, tnum);.
2f700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2f720 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2f730 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  (p->db, zSql, 0,
2f740 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2f750 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2f760 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2f770 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
2f780 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  db, "main", 0, 0
2f790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2f7a0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2f7b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f7c0 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25  Error in [%s]: %
2f7d0 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  s\n", zSql, sqli
2f7e0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2f7f0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2f800 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2f810 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
2f820 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  ;\n", zSql);.   
2f830 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f840 73 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20 20  stdout,.        
2f850 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72 69     "WARNING: wri
2f860 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73  ting to an impos
2f870 74 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20 63  ter table will c
2f880 6f 72 72 75 70 74 20 74 68 65 20 69 6e 64 65 78  orrupt the index
2f890 21 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b 0a  !\n".        );.
2f8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2f8b0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2f8c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
2f8d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2f8e0 4f 53 54 45 52 20 72 65 74 75 72 6e 73 20 25 64  OSTER returns %d
2f8f0 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
2f900 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2f910 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f920 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Sql);.  }else.#e
2f930 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2f940 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53  (SQLITE_OMIT_TES
2f950 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23  T_CONTROL) */..#
2f960 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2f970 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66  BLE_IOTRACE.  if
2f980 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
2f990 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
2f9a0 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  otrace", n)==0 )
2f9b0 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50 49  {.    SQLITE_API
2f9c0 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53 51   extern void (SQ
2f9d0 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69  LITE_CDECL *sqli
2f9e0 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
2f9f0 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20  t char*, ...);. 
2fa00 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20 26     if( iotrace &
2fa10 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75  & iotrace!=stdou
2fa20 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61  t ) fclose(iotra
2fa30 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65  ce);.    iotrace
2fa40 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
2fa50 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71  rg<2 ){.      sq
2fa60 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
2fa70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2fa80 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
2fa90 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20   "-")==0 ){.    
2faa0 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
2fab0 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66   = iotracePrintf
2fac0 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20  ;.      iotrace 
2fad0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
2fae0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  lse{.      iotra
2faf0 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  ce = fopen(azArg
2fb00 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  [1], "w");.     
2fb10 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20   if( iotrace==0 
2fb20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2fb30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2fb40 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2fb50 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
2fb60 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2fb70 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2fb80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2fb90 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2fba0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fbb0 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
2fbc0 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
2fbd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
2fbe0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
2fbf0 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26 20  ='l' && n>=5 && 
2fc00 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2fc10 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d  , "limits", n)==
2fc20 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
2fc30 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
2fc40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2fc50 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20   *zLimitName;   
2fc60 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d  /* Name of a lim
2fc70 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74  it */.       int
2fc80 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20 20   limitCode;     
2fc90 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
2fca0 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20  r code for that 
2fcb0 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61  limit */.    } a
2fcc0 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  Limit[] = {.    
2fcd0 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20    { "length",   
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2fcf0 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
2fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd10 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2fd20 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20  sql_length",    
2fd30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2fd40 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  IMIT_SQL_LENGTH 
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2fd60 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d  ,.      { "colum
2fd70 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
2fd80 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2fd90 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20  COLUMN          
2fda0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fdb0 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74 68     { "expr_depth
2fdc0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
2fdd0 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
2fde0 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
2fdf0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2fe00 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74  "compound_select
2fe10 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
2fe20 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
2fe30 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
2fe40 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62 65  },.      { "vdbe
2fe50 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  _op",           
2fe60 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2fe70 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20  _VDBE_OP        
2fe80 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2fe90 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f      { "function_
2fea0 61 72 67 22 2c 20 20 20 20 20 20 20 20 20 20 53  arg",          S
2feb0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
2fec0 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20  TION_ARG        
2fed0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2fee0 20 22 61 74 74 61 63 68 65 64 22 2c 20 20 20 20   "attached",    
2fef0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2ff00 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20  _LIMIT_ATTACHED 
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b   },.      { "lik
2ff30 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68  e_pattern_length
2ff40 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ",   SQLITE_LIMI
2ff50 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
2ff60 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a 20  ENGTH       },. 
2ff70 20 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c 65       { "variable
2ff80 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20  _number",       
2ff90 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
2ffa0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20  IABLE_NUMBER    
2ffb0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2ffc0 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70 74 68  { "trigger_depth
2ffd0 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ",         SQLIT
2ffe0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
2fff0 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
30000 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f    },.      { "wo
30010 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20 20  rker_threads",  
30020 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
30030 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
30040 53 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  S            },.
30050 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
30060 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  , n2;.    open_d
30070 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
30080 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
30090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
300a0 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20  aySize(aLimit); 
300b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72  i++){.        pr
300c0 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22  intf("%20s %d\n"
300d0 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d  , aLimit[i].zLim
300e0 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  itName,.        
300f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
30100 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
30110 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  it[i].limitCode,
30120 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20   -1));.      }. 
30130 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72     }else if( nAr
30140 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
30150 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30160 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e  "Usage: .limit N
30170 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c  AME ?NEW-VALUE?\
30180 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
30190 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
301a0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
301b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
301c0 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d    int iLimit = -
301d0 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74  1;.      n2 = st
301e0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
301f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
30200 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69   i<ArraySize(aLi
30210 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mit); i++){.    
30220 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
30230 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b  strnicmp(aLimit[
30240 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61  i].zLimitName, a
30250 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20  zArg[1], n2)==0 
30260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
30270 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
30280 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20           iLimit 
30290 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
302a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
302b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
302c0 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  derr, "ambiguous
302d0 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e   limit: \"%s\"\n
302e0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
302f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
30300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
30310 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
30320 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
30330 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30340 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c    }.      if( iL
30350 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
30360 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30370 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  derr, "unknown l
30380 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a  imit: \"%s\"\n".
30390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303a0 20 20 20 20 20 20 20 20 22 65 6e 74 65 72 20 5c          "enter \
303b0 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68 20  ".limits\" with 
303c0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
303d0 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20   a list.\n",.   
303e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303f0 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b        azArg[1]);
30400 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
30410 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
30420 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30440 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
30450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
30460 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
30470 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43  t[iLimit].limitC
30480 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
30490 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
304a0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
304b0 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rg[2]));.      }
304c0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
304d0 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69  20s %d\n", aLimi
304e0 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74  t[iLimit].zLimit
304f0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
30500 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
30510 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
30520 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65  Limit].limitCode
30530 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
30540 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
30550 27 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73 74  'l' && n>2 && st
30560 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
30570 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "lint", n)==0 ){
30580 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
30590 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43  0);.    lintDotC
305a0 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c  ommand(p, azArg,
305b0 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
305c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
305d0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
305e0 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  ION.  if( c=='l'
305f0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30600 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29  g[0], "load", n)
30610 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
30620 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a   char *zFile, *z
30630 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a  Proc;.    char *
30640 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
30650 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
30660 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30670 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
30680 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52  .load FILE ?ENTR
30690 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20  YPOINT?\n");.   
306a0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
306b0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
306c0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
306d0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
306e0 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  [1];.    zProc =
306f0 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
30700 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65  [2] : 0;.    ope
30710 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
30720 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61  rc = sqlite3_loa
30730 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64  d_extension(p->d
30740 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
30750 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
30760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30770 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
30780 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30790 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
307a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
307b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
307c0 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
307d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
307e0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
307f0 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
30800 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22  (azArg[0], "log"
30810 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
30820 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
30830 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30840 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
30850 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  log FILENAME\n")
30860 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
30890 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
308a0 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65       output_file
308b0 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b  _close(p->pLog);
308c0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d  .      p->pLog =
308d0 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65   output_file_ope
308e0 6e 28 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  n(zFile, 0);.   
308f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
30900 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e  ( c=='m' && strn
30910 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d  cmp(azArg[0], "m
30920 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ode", n)==0 ){. 
30930 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30940 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  Mode = nArg>=2 ?
30950 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a   azArg[1] : "";.
30960 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72      int n2 = str
30970 6c 65 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a 20 20  len30(zMode);.  
30980 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65    int c2 = zMode
30990 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d  [0];.    if( c2=
309a0 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20  ='l' && n2>2 && 
309b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
309c0 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20  ,"lines",n2)==0 
309d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
309e0 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
309f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30a00 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
30a10 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
30a20 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
30a30 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
30a40 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26  se if( c2=='c' &
30a50 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
30a60 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29  1],"columns",n2)
30a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
30a80 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75  mode = MODE_Colu
30a90 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mn;.      sqlite
30aa0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30ab0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
30ac0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
30ad0 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
30ae0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
30af0 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20  ='l' && n2>2 && 
30b00 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
30b10 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29  ,"list",n2)==0 )
30b20 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
30b30 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
30b40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30b50 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
30b60 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
30b70 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
30b80 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  P_Column);.     
30b90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30ba0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
30bb0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
30bc0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
30bd0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
30be0 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73  if( c2=='h' && s
30bf0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
30c00 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  "html",n2)==0 ){
30c10 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
30c20 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20   MODE_Html;.    
30c30 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
30c40 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
30c50 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d  rg[1],"tcl",n2)=
30c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
30c70 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a  ode = MODE_Tcl;.
30c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
30c90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
30ca0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
30cb0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
30cc0 20 53 45 50 5f 53 70 61 63 65 29 3b 0a 20 20 20   SEP_Space);.   
30cd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30ce0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
30cf0 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
30d00 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
30d10 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Row);.    }els
30d20 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26  e if( c2=='c' &&
30d30 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
30d40 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29  ],"csv",n2)==0 )
30d50 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
30d60 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
30d70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30d80 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
30d90 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
30da0 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
30db0 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73  _Comma);.      s
30dc0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
30dd0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
30de0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
30df0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
30e00 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Lf);.    }else i
30e10 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74  f( c2=='t' && st
30e20 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
30e30 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  tabs",n2)==0 ){.
30e40 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
30e50 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
30e60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30e70 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
30e80 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
30e90 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
30ea0 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Tab);.    }else 
30eb0 69 66 28 20 63 32 3d 3d 27 69 27 20 26 26 20 73  if( c2=='i' && s
30ec0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
30ed0 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20  "insert",n2)==0 
30ee0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
30ef0 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
30f00 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f        set_table_
30f10 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20  name(p, nArg>=3 
30f20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61  ? azArg[2] : "ta
30f30 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ble");.    }else
30f40 20 69 66 28 20 63 32 3d 3d 27 71 27 20 26 26 20   if( c2=='q' && 
30f50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
30f60 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20  ,"quote",n2)==0 
30f70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
30f80 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20   = MODE_Quote;. 
30f90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
30fa0 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
30fb0 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69 69 22  azArg[1],"ascii"
30fc0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
30fd0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
30fe0 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73 71 6c  Ascii;.      sql
30ff0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
31000 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
31010 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
31020 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74  arator, SEP_Unit
31030 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31040 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31050 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
31060 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
31070 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64 29 3b  or, SEP_Record);
31080 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
31090 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
310a0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
310b0 74 2c 20 22 63 75 72 72 65 6e 74 20 6f 75 74 70  t, "current outp
310c0 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20  ut mode: %s\n", 
310d0 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64  modeDescr[p->mod
310e0 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e]);.    }else{.
310f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31100 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
31110 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20   mode should be 
31120 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20  one of: ".      
31130 20 20 20 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e     "ascii column
31140 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74   csv html insert
31150 20 6c 69 6e 65 20 6c 69 73 74 20 71 75 6f 74 65   line list quote
31160 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20   tabs tcl\n");. 
31170 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31180 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20   }.    p->cMode 
31190 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c  = p->mode;.  }el
311a0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27  se..  if( c=='n'
311b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
311c0 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  g[0], "nullvalue
311d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
311e0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
311f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
31200 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
31210 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e  nullValue), p->n
31220 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20 20  ullValue,.      
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31240 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
31250 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56  raySize(p->nullV
31260 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31  alue)-1, azArg[1
31270 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
31280 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31290 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
312a0 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
312b0 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  G\n");.      rc 
312c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
312d0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27  se..  if( c=='o'
312e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
312f0 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29  g[0], "open", n)
31300 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20  ==0 && n>=2 ){. 
31310 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c     char *zNewFil
31320 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  ename;  /* Name 
31330 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31340 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
31350 20 20 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20      int iName = 
31360 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  1;       /* Inde
31370 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20  x in azArg[] of 
31380 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  the filename */.
31390 20 20 20 20 69 6e 74 20 6e 65 77 46 6c 61 67 20      int newFlag 
313a0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
313b0 20 74 6f 20 64 65 6c 65 74 65 20 66 69 6c 65 20   to delete file 
313c0 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a  before opening *
313d0 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74  /.    /* Close t
313e0 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
313f0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 65 73 73  base */.    sess
31400 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29  ion_close_all(p)
31410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
31420 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ose(p->db);.    
31430 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 70  p->db = 0;.    p
31440 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
31450 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
31460 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c  ree(p->zFreeOnCl
31470 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46 72  ose);.    p->zFr
31480 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20  eeOnClose = 0;. 
31490 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
314a0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
314b0 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  EC;.    /* Check
314c0 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   for command-lin
314d0 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  e arguments */. 
314e0 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20     for(iName=1; 
314f0 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a  iName<nArg && az
31500 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27  Arg[iName][0]=='
31510 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20  -'; iName++){.  
31520 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31530 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d  z = azArg[iName]
31540 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69  ;.      if( opti
31550 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29  onMatch(z,"new")
31560 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46   ){.        newF
31570 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lag = 1;.#ifdef 
31580 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
31590 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
315a0 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
315b0 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20 20 20  "zip") ){.      
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 5a 49 50 46 49  SHELL_OPEN_ZIPFI
315e0 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  LE;.#endif.     
315f0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f   }else if( optio
31600 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70 65 6e  nMatch(z, "appen
31610 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  d") ){.        p
31620 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
31630 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
31640 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  S;.      }else i
31650 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
31660 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29 20 29 7b  , "readonly") ){
31670 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
31680 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
31690 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
316a0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
316b0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
316c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
316d0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
316e0 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
316f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
31700 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
31710 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
31720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31730 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e     /* If a filen
31740 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
31750 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74  , try to open it
31760 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e   first */.    zN
31770 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72  ewFilename = nAr
31780 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  g>iName ? sqlite
31790 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
317a0 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20  azArg[iName]) : 
317b0 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46  0;.    if( zNewF
317c0 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
317d0 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73   if( newFlag ) s
317e0 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a  hellDeleteFile(z
317f0 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
31800 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
31810 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
31820 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  e;.      open_db
31830 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  (p, 1);.      if
31840 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
31850 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31860 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
31870 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25  : cannot open '%
31880 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e  s'\n", zNewFilen
31890 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
318a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46  lite3_free(zNewF
318b0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
318c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
318d0 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
318e0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
318f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31900 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
31910 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66  .      /* As a f
31920 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20  all-back open a 
31930 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
31940 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
31950 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  ename = 0;.     
31960 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
31970 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
31980 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20   if( (c=='o'.   
31990 20 20 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70       && (strncmp
319a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
319b0 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e  ut", n)==0||strn
319c0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
319d0 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20  nce", n)==0)).  
319e0 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26 20 6e   || (c=='e' && n
319f0 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==5 && strcmp(az
31a00 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d  Arg[0],"excel")=
31a10 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
31a20 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
31a30 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
31a40 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
31a50 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f 64 65      int bTxtMode
31a60 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 7a   = 0;.    if( az
31a70 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27 20 29  Arg[0][0]=='e' )
31a80 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73  {.      /* Trans
31a90 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63 65 6c  form the ".excel
31aa0 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 22  " command into "
31ab0 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20 20 20  .once -x" */.   
31ac0 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20 20 20     nArg = 2;.   
31ad0 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 6f     azArg[0] = "o
31ae0 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46 69 6c  nce";.      zFil
31af0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22  e = azArg[1] = "
31b00 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d 20 34  -x";.      n = 4
31b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31b20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20  nArg>2 ){.      
31b30 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
31b40 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20  rr, "Usage: .%s 
31b50 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c  [-e|-x|FILE]\n",
31b60 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
31b70 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31b80 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31b90 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
31ba0 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
31bb0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
31bc0 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
31bd0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
31be0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
31bf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31c00 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28 2d 65  Usage: .once (-e
31c10 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b 0a 20  |-x|FILE)\n");. 
31c20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
31c30 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
31c40 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
31c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
31c60 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20  outCount = 2;.  
31c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
31c80 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  ->outCount = 0;.
31c90 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74      }.    output
31ca0 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
31cb0 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27  f( zFile[0]=='-'
31cc0 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d   && zFile[1]=='-
31cd0 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66  ' ) zFile++;.#if
31ce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
31cf0 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
31d00 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
31d10 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  "-e")==0 || strc
31d20 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22 29 3d  mp(zFile, "-x")=
31d30 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64  =0 ){.      p->d
31d40 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  oXdgOpen = 1;.  
31d50 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 75      outputModePu
31d60 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  sh(p);.      if(
31d70 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27 20 29   zFile[1]=='x' )
31d80 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
31d90 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22 29 3b  pFile(p, "csv");
31da0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  .        p->mode
31db0 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
31dc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
31dd0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
31de0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
31df0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
31e00 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
31e10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31e20 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
31e30 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
31e40 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
31e50 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 20 20  EP_CrLf);.      
31e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
31e70 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 74  ewTempFile(p, "t
31e80 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20 62 54  xt");.        bT
31e90 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  xtMode = 1;.    
31ea0 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 20    }.      zFile 
31eb0 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a  = p->zTempFile;.
31ec0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
31ed0 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
31ee0 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20  STEM */.    if( 
31ef0 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
31f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
31f10 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
31f20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31f30 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
31f40 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
31f50 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
31f60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
31f70 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
31f80 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20  stdout;.#else.  
31f90 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
31fa0 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
31fb0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
31fc0 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
31fd0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
31fe0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
31ff0 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c  nnot open pipe \
32000 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20  "%s\"\n", zFile 
32010 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  + 1);.        p-
32020 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
32030 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
32040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32050 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32060 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
32070 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
32080 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
32090 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
320a0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
320b0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
320c0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
320d0 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b 0a 20  le, bTxtMode);. 
320e0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
320f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
32100 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
32110 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  off")!=0 ){.    
32120 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32130 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
32140 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
32150 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
32160 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
32170 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
32180 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
32190 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65  c = 1;.      } e
321a0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71  lse {.        sq
321b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
321c0 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
321d0 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
321e0 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  %s", zFile);.   
321f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
32200 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
32210 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
32220 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
32230 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rint", n)==0 ){.
32240 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
32250 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
32260 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
32270 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>1 ) raw_printf
32280 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20  (p->out, " ");. 
32290 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
322a0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
322b0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
322c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
322d0 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
322e0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
322f0 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
32300 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
32310 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
32320 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b  if( nArg >= 2) {
32330 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d  .      strncpy(m
32340 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  ainPrompt,azArg[
32350 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  1],(int)ArraySiz
32360 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29  e(mainPrompt)-1)
32370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32380 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20  nArg >= 3) {.   
32390 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69     strncpy(conti
323a0 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  nuePrompt,azArg[
323b0 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  2],(int)ArraySiz
323c0 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  e(continuePrompt
323d0 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  )-1);.    }.  }e
323e0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71  lse..  if( c=='q
323f0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
32400 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e  rg[0], "quit", n
32410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
32420 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69   2;.  }else..  i
32430 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d  f( c=='r' && n>=
32440 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
32450 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e  rg[0], "read", n
32460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  )==0 ){.    FILE
32470 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e   *alt;.    if( n
32480 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
32490 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
324a0 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64  r, "Usage: .read
324b0 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
324c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
324d0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
324e0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
324f0 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41   alt = fopen(azA
32500 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20  rg[1], "rb");.  
32510 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a    if( alt==0 ){.
32520 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32530 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
32540 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
32550 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
32560 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
32570 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32580 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
32590 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20  nput(p, alt);.  
325a0 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b      fclose(alt);
325b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
325c0 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
325d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
325e0 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f  azArg[0], "resto
325f0 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  re", n)==0 ){.  
32600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
32610 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  rcFile;.    cons
32620 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
32630 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a   sqlite3 *pSrc;.
32640 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
32650 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
32660 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20   int nTimeout = 
32670 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0;..    if( nArg
32680 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==2 ){.      zSr
32690 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  cFile = azArg[1]
326a0 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d  ;.      zDb = "m
326b0 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ain";.    }else 
326c0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
326d0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
326e0 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20  azArg[2];.      
326f0 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  zDb = azArg[1];.
32700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32710 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
32720 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73  rr, "Usage: .res
32730 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e  tore ?DB? FILE\n
32740 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
32750 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
32760 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
32770 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
32780 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63  qlite3_open(zSrc
32790 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20  File, &pSrc);.  
327a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
327b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
327c0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
327d0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
327e0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
327f0 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20  zSrcFile);.     
32800 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
32810 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
32820 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
32830 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
32840 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
32850 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
32860 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72  (p->db, zDb, pSr
32870 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  c, "main");.    
32880 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
32890 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
328a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
328b0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
328c0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
328d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
328e0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
328f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
32900 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
32910 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
32920 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
32930 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
32940 4b 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72  K.          || r
32950 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20  c==SQLITE_BUSY  
32960 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
32970 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
32980 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d          if( nTim
32990 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72  eout++ >= 3 ) br
329a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
329b0 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
329c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
329d0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
329e0 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
329f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
32a00 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
32a10 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
32a20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
32a30 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d  LITE_BUSY || rc=
32a40 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29  =SQLITE_LOCKED )
32a50 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
32a60 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
32a70 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  r: source databa
32a80 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b 0a  se is busy\n");.
32a90 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
32aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
32ab0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
32ac0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
32ad0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
32ae0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
32af0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
32b00 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
32b10 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  pSrc);.  }else..
32b20 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
32b30 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
32b40 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e  , "scanstats", n
32b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
32b60 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
32b70 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20   p->scanstatsOn 
32b80 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61 6c  = (u8)booleanVal
32b90 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69  ue(azArg[1]);.#i
32ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
32bb0 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
32bc0 54 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72  TUS.      raw_pr
32bd0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
32be0 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74  rning: .scanstat
32bf0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
32c00 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e  in this build.\n
32c10 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
32c20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
32c30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32c40 55 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74  Usage: .scanstat
32c50 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
32c60 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32c70 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32c80 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
32c90 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
32ca0 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
32cb0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53      ShellText sS
32cc0 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c  elect;.    Shell
32cd0 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
32ce0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
32cf0 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
32d00 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
32d10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
32d20 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Name = 0;.    in
32d30 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  t iSchema = 0;. 
32d40 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20     int bDebug = 
32d50 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  0;.    int ii;..
32d60 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
32d70 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
32d80 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
32d90 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
32da0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
32db0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
32dc0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
32dd0 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74  E_Semi;.    init
32de0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
32df0 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
32e00 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
32e10 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61      if( optionMa
32e20 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 69  tch(azArg[ii],"i
32e30 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
32e40 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
32e50 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
32e60 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 7d  _Pretty;.      }
32e70 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d  else if( optionM
32e80 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22  atch(azArg[ii],"
32e90 64 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20 20  debug") ){.     
32ea0 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
32eb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
32ec0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
32ed0 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67     zName = azArg
32ee0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [ii];.      }els
32ef0 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
32f00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
32f10 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d  sage: .schema ?-
32f20 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50  -indent? ?LIKE-P
32f30 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
32f40 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
32f50 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
32f60 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
32f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32f80 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  f( zName!=0 ){. 
32f90 20 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74 65       int isMaste
32fa0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  r = sqlite3_strl
32fb0 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ike(zName, "sqli
32fc0 74 65 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27  te_master", '\\'
32fd0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20  )==0;.      if( 
32fe0 69 73 4d 61 73 74 65 72 20 7c 7c 20 73 71 6c 69  isMaster || sqli
32ff0 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d  te3_strlike(zNam
33000 65 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  e,"sqlite_temp_m
33010 61 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d 30  aster", '\\')==0
33020 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
33030 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
33040 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
33050 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
33060 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
33070 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
33080 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
33090 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330b0 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
330c0 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
330d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
330e0 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
330f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33100 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
33110 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
33120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33130 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
33140 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
33150 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
33160 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
33170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33180 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
33190 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
331a0 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
331b0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
331c0 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
331d0 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
331e0 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
331f0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
33200 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
33210 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
33220 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
33230 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
33240 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
33250 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
33260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
33270 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
33280 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
33290 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
332a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
332b0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
332c0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
332d0 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
332e0 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
332f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33300 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
33310 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
33320 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
33330 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
33340 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
33350 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
33360 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
33370 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
33380 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
33390 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
333a0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
333b0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
333c0 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
333d0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
333e0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
333f0 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
33400 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
33410 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
33420 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
33430 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
33440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
33450 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
33460 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
33470 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
33480 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
33490 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
334a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
334b0 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
334c0 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
334d0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
334e0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
334f0 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
33500 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
33510 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
33520 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33530 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
33540 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
33550 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
33560 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
33570 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
33580 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
33590 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
335a0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
335b0 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
335c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
335d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
335e0 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
335f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33600 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33610 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
33620 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
33630 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
33640 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
33650 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33660 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
33670 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
33680 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33690 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
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 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
336d0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
336e0 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
336f0 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
33700 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33710 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
33720 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
33730 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
33740 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
33750 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
33760 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
33770 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
33780 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
33790 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
337a0 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
337b0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
337c0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
337d0 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
337e0 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
337f0 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
33800 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
33810 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
33820 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
33830 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
33840 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
33850 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
33860 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
33870 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
33880 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
33890 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
338a0 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
338b0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
338c0 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
338d0 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
338e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ame);.        in
338f0 74 20 62 47 6c 6f 62 20 3d 20 73 74 72 63 68 72  t bGlob = strchr
33900 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20 21 3d 20  (zName, '*') != 
33910 30 20 7c 7c 20 73 74 72 63 68 72 28 7a 4e 61 6d  0 || strchr(zNam
33920 65 2c 20 27 3f 27 29 20 21 3d 20 30 20 7c 7c 0a  e, '?') != 0 ||.
33930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33940 20 20 20 20 73 74 72 63 68 72 28 7a 4e 61 6d 65      strchr(zName
33950 2c 20 27 5b 27 29 20 21 3d 20 30 3b 0a 20 20 20  , '[') != 0;.   
33960 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28       if( strchr(
33970 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20  zName, '.') ){. 
33980 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
33990 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c  ext(&sSelect, "l
339a0 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25 73 2e  ower(printf('%s.
339b0 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61  %s',sname,tbl_na
339c0 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  me))", 0);.     
339d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
339e0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
339f0 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28  sSelect, "lower(
33a00 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a  tbl_name)", 0);.
33a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33a20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
33a30 65 6c 65 63 74 2c 20 62 47 6c 6f 62 20 3f 20 22  elect, bGlob ? "
33a40 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45   GLOB " : " LIKE
33a50 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
33a60 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33a70 65 63 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a  ect, zQarg, 0);.
33a80 20 20 20 20 20 20 20 20 69 66 28 20 21 62 47 6c          if( !bGl
33a90 6f 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ob ){.          
33aa0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33ab0 65 63 74 2c 20 22 20 45 53 43 41 50 45 20 27 5c  ect, " ESCAPE '\
33ac0 5c 27 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  \' ", 0);.      
33ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65    }.        appe
33ae0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
33af0 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a 20 20   " AND ", 0);.  
33b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
33b10 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20 20 20  ee(zQarg);.     
33b20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
33b30 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 74  ext(&sSelect, "t
33b40 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
33b50 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  sql IS NOT NULL"
33b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33b70 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
33b80 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72 6f 77  DER BY snum, row
33b90 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  id", 0);.      i
33ba0 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20  f( bDebug ){.   
33bb0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33bc0 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a 20 25  (p->out, "SQL: %
33bd0 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74 2e 7a  s;\n", sSelect.z
33be0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
33bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
33c00 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
33c10 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c   sSelect.z, call
33c20 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
33c30 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a  rrMsg);.      }.
33c40 20 20 20 20 20 20 66 72 65 65 54 65 78 74 28 26        freeText(&
33c50 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a  sSelect);.    }.
33c60 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
33c70 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
33c80 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
33c90 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
33ca0 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
33cb0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
33cc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33cd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
33ce0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
33cf0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
33d00 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
33d10 20 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61   querying schema
33d20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29   information\n")
33d30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33d50 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
33d60 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69   }else..#if defi
33d70 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
33d80 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
33d90 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
33da0 54 54 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d  TTRACE).  if( c=
33db0 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26 26  ='s' && n==11 &&
33dc0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
33dd0 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65 22  ], "selecttrace"
33de0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
33df0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
33e00 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  e = (int)integer
33e10 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
33e20 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
33e30 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
33e40 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
33e50 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  ON).  if( c=='s'
33e60 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
33e70 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c 6e  g[0],"session",n
33e80 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b 0a  )==0 && n>=3 ){.
33e90 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20      OpenSession 
33ea0 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e  *pSession = &p->
33eb0 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20  aSession[0];.   
33ec0 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20   char **azCmd = 
33ed0 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69  &azArg[1];.    i
33ee0 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20  nt iSes = 0;.   
33ef0 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72 67   int nCmd = nArg
33f00 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b   - 1;.    int i;
33f10 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d 31  .    if( nArg<=1
33f20 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
33f30 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
33f40 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
33f50 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33  .    if( nArg>=3
33f60 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53   ){.      for(iS
33f70 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e 53  es=0; iSes<p->nS
33f80 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b  ession; iSes++){
33f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
33fa0 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  cmp(p->aSession[
33fb0 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41  iSes].zName, azA
33fc0 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65 61  rg[1])==0 ) brea
33fd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
33fe0 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53 65   if( iSes<p->nSe
33ff0 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
34000 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e   pSession = &p->
34010 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a  aSession[iSes];.
34020 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b 3b          azCmd++;
34030 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d 3b  .        nCmd--;
34040 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34050 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d        pSession =
34060 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d   &p->aSession[0]
34070 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73 20 3d  ;.        iSes =
34080 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
34090 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  }..    /* .sessi
340a0 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45 0a  on attach TABLE.
340b0 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68      ** Invoke th
340c0 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  e sqlite3session
340d0 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65 72 66  _attach() interf
340e0 61 63 65 20 74 6f 20 61 74 74 61 63 68 20 61 20  ace to attach a 
340f0 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20 20 2a  particular.    *
34100 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20  * table so that 
34110 69 74 20 69 73 20 6e 65 76 65 72 20 66 69 6c 74  it is never filt
34120 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ered..    */.   
34130 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
34140 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29 3d 3d  d[0],"attach")==
34150 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
34160 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
34170 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
34180 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
34190 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a  ession->p==0 ){.
341a0 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f          session_
341b0 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20 20  not_open:.      
341c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
341d0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 20  err, "ERROR: No 
341e0 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f 70 65  sessions are ope
341f0 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n\n");.      }el
34200 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
34210 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
34220 61 74 74 61 63 68 28 70 53 65 73 73 69 6f 6e 2d  attach(pSession-
34230 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  >p, azCmd[1]);. 
34240 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
34250 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
34260 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34270 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73 65 73  RROR: sqlite3ses
34280 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 72 65  sion_attach() re
34290 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29  turns %d\n", rc)
342a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
342b0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
342c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
342d0 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
342e0 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 0a   changeset FILE.
342f0 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e 20      ** .session 
34300 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a 20 20  patchset FILE.  
34310 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61    ** Write a cha
34320 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73  ngeset or patchs
34330 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  et into a file. 
34340 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f 76 65   The file is ove
34350 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f  rwritten..    */
34360 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
34370 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67 65  azCmd[0],"change
34380 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  set")==0 || strc
34390 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61 74  mp(azCmd[0],"pat
343a0 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20  chset")==0 ){.  
343b0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
343c0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  0;.      if( nCm
343d0 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=2 ) goto sess
343e0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
343f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 73  ;.      if( pSes
34400 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f 74  sion->p==0 ) got
34410 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70  o session_not_op
34420 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d 20  en;.      out = 
34430 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20  fopen(azCmd[1], 
34440 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "wb");.      if(
34450 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   out==0 ){.     
34460 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34470 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 63  tderr, "ERROR: c
34480 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
34490 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22  " for writing\n"
344a0 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  , azCmd[1]);.   
344b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
344c0 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20 20    int szChng;.  
344d0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68 6e        void *pChn
344e0 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  g;.        if( a
344f0 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20  zCmd[0][0]=='c' 
34500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
34510 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
34520 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65 73 73  _changeset(pSess
34530 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c  ion->p, &szChng,
34540 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   &pChng);.      
34550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
34570 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28  ession_patchset(
34580 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a  pSession->p, &sz
34590 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20  Chng, &pChng);. 
345a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
345b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
345c0 20 20 20 20 20 70 72 69 6e 74 66 28 22 45 72 72       printf("Err
345d0 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 25  or: error code %
345e0 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
345f0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
34600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
34610 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20 20 20  f( pChng.       
34620 20 20 20 26 26 20 66 77 72 69 74 65 28 70 43 68     && fwrite(pCh
34630 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20 6f  ng, szChng, 1, o
34640 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ut)!=1 ){.      
34650 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
34660 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 46  tderr, "ERROR: F
34670 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65 20 65  ailed to write e
34680 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20 6f 75  ntire %d-byte ou
34690 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20  tput\n",.       
346a0 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 68 6e             szChn
346b0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
346c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
346d0 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20 20 20  ee(pChng);.     
346e0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
346f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34700 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
34710 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  on close.    ** 
34720 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e 74 69  Close the identi
34730 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20 20 20  fied session.   
34740 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
34750 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c  mp(azCmd[0], "cl
34760 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ose")==0 ){.    
34770 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20    if( nCmd!=1 ) 
34780 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
34790 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
347a0 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   if( p->nSession
347b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73   ){.        sess
347c0 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73 69  ion_close(pSessi
347d0 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  on);.        p->
347e0 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20 3d  aSession[iSes] =
347f0 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d 70   p->aSession[--p
34800 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20  ->nSession];.   
34810 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
34820 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
34830 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f  enable ?BOOLEAN?
34840 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72  .    ** Query or
34850 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c 65 20   set the enable 
34860 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20  flag.    */.    
34870 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
34880 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d 3d  [0], "enable")==
34890 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
348a0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  i;.      if( nCm
348b0 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69  d>2 ) goto sessi
348c0 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
348d0 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64  .      ii = nCmd
348e0 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65  ==1 ? -1 : boole
348f0 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d  anValue(azCmd[1]
34900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
34910 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
34920 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
34930 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28 70  session_enable(p
34940 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b  Session->p, ii);
34950 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
34960 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65  intf(p->out, "se
34970 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c 65 20  ssion %s enable 
34980 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20  flag = %d\n",.  
34990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349a0 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d    pSession->zNam
349b0 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a  e, ii);.      }.
349c0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
349d0 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65  * .session filte
349e0 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20 20 20  r GLOB .....    
349f0 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20 6f 66  ** Set a list of
34a00 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 6f   GLOB patterns o
34a10 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 6f  f table names to
34a20 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a 20 20   be excluded..  
34a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
34a40 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 66  cmp(azCmd[0], "f
34a50 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  ilter")==0 ){.  
34a60 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42 79 74      int ii, nByt
34a70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  e;.      if( nCm
34a80 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69  d<2 ) goto sessi
34a90 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
34aa0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
34ab0 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
34ac0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
34ad0 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
34ae0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
34af0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34b00 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
34b10 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20  er[ii]);.       
34b20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
34b30 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
34b40 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 20  ->azFilter);.   
34b50 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a       nByte = siz
34b60 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  eof(pSession->az
34b70 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43 6d 64  Filter[0])*(nCmd
34b80 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  -1);.        pSe
34b90 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 20  ssion->azFilter 
34ba0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
34bb0 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20  ( nByte );.     
34bc0 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d     if( pSession-
34bd0 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29 7b 0a  >azFilter==0 ){.
34be0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
34bf0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
34c00 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65 6d 6f  ror: out or memo
34c10 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ry\n");.        
34c20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
34c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
34c40 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64 3b 20  (ii=1; ii<nCmd; 
34c50 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
34c60 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c   pSession->azFil
34c70 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71 6c 69  ter[ii-1] = sqli
34c80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
34c90 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a 20 20  , azCmd[ii]);.  
34ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34cb0 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
34cc0 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20 20 20  r = ii-1;.      
34cd0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
34ce0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 6e 64   /* .session ind
34cf0 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 0a  irect ?BOOLEAN?.
34d00 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20      ** Query or 
34d10 73 65 74 20 74 68 65 20 69 6e 64 69 72 65 63 74  set the indirect
34d20 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20   flag.    */.   
34d30 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
34d40 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63 74 22  d[0], "indirect"
34d50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
34d60 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  t ii;.      if( 
34d70 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65  nCmd>2 ) goto se
34d80 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
34d90 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e  or;.      ii = n
34da0 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f  Cmd==1 ? -1 : bo
34db0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64  oleanValue(azCmd
34dc0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
34dd0 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
34de0 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69         ii = sqli
34df0 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69 72  te3session_indir
34e00 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c  ect(pSession->p,
34e10 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74   ii);.        ut
34e20 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34e30 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69 6e  , "session %s in
34e40 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20 25 64  direct flag = %d
34e50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34e60 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
34e70 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
34e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34e90 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
34ea0 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20 2a 2a  n isempty.    **
34eb0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   Determine if th
34ec0 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70  e session is emp
34ed0 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ty.    */.    if
34ee0 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
34ef0 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d 3d 30  ], "isempty")==0
34f00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
34f10 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
34f20 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=1 ) goto sessi
34f30 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
34f40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
34f50 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
34f60 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65    ii = sqlite3se
34f70 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 70 53  ssion_isempty(pS
34f80 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20  ession->p);.    
34f90 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34fa0 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
34fb0 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c 61 67   %s isempty flag
34fc0 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20   = %d\n",.      
34fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
34fe0 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69  ession->zName, i
34ff0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
35000 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
35010 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20 20 20  ession list.    
35020 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75 72 72  ** List all curr
35030 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69  ently open sessi
35040 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ons.    */.    i
35050 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
35060 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20 29 7b  0],"list")==0 ){
35070 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
35080 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  i<p->nSession; i
35090 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ++){.        utf
350a0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
350b0 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c 20 70   "%d %s\n", i, p
350c0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
350d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
350e0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
350f0 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20 44 42  .session open DB
35100 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f 70 65   NAME.    ** Ope
35110 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
35120 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e 20 74  called NAME on t
35130 68 65 20 61 74 74 61 63 68 65 64 20 64 61 74 61  he attached data
35140 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a 2a 20  base DB..    ** 
35150 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 22  DB is normally "
35160 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  main"..    */.  
35170 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
35180 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d 3d 30  md[0],"open")==0
35190 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
351a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
351b0 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74 6f 20   nCmd!=3 ) goto 
351c0 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
351d0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e 61 6d  rror;.      zNam
351e0 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a 20 20  e = azCmd[2];.  
351f0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d      if( zName[0]
35200 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69  ==0 ) goto sessi
35210 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
35220 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
35230 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  i<p->nSession; i
35240 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
35250 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73   strcmp(p->aSess
35260 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61  ion[i].zName,zNa
35270 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
35280 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
35290 73 74 64 65 72 72 2c 20 22 53 65 73 73 69 6f 6e  stderr, "Session
352a0 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
352b0 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61 6d 65  exists\n", zName
352c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
352d0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
352e0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
352f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35300 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d 41 72   p->nSession>=Ar
35310 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73 73  raySize(p->aSess
35320 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ion) ){.        
35330 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
35340 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66 20 25  r, "Maximum of %
35350 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c 20 41  d sessions\n", A
35360 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73  rraySize(p->aSes
35370 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  sion));.        
35380 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
35390 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
353a0 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d        pSession =
353b0 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 70 2d   &p->aSession[p-
353c0 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20  >nSession];.    
353d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
353e0 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70 2d 3e  ssion_create(p->
353f0 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20 26 70  db, azCmd[1], &p
35400 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20  Session->p);.   
35410 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
35420 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35430 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20  stderr, "Cannot 
35440 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20 65 72  open session: er
35450 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22 2c 20  ror code=%d\n", 
35460 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rc);.        rc 
35470 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
35480 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
35490 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
354a0 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69     pSession->nFi
354b0 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lter = 0;.      
354c0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 74  sqlite3session_t
354d0 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65 73  able_filter(pSes
354e0 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69 6f 6e  sion->p, session
354f0 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73 69 6f  _filter, pSessio
35500 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  n);.      p->nSe
35510 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 70  ssion++;.      p
35520 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d  Session->zName =
35530 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
35540 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ("%s", zName);. 
35550 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f 2a 20     }else.    /* 
35560 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61  If no command na
35570 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68 6f 77  me matches, show
35580 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
35590 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 73  */.    session_s
355a0 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20 20  yntax_error:.   
355b0 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 70 29   session_help(p)
355c0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
355d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
355e0 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63  DEBUG.  /* Undoc
355f0 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73  umented commands
35600 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65   for internal te
35610 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20  sting.  Subject 
35620 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77  to change.  ** w
35630 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a  ithout notice. *
35640 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  /.  if( c=='s' &
35650 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63  & n>=10 && strnc
35660 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65  mp(azArg[0], "se
35670 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20  lftest-", 9)==0 
35680 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
35690 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22  mp(azArg[0]+9, "
356a0 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d  boolean", n-9)==
356b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
356c0 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  , v;.      for(i
356d0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
356e0 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f  {.        v = bo
356f0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
35700 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 75 74  [i]);.        ut
35710 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
35720 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78 5c 6e  , "%s: %d 0x%x\n
35730 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20  ", azArg[i], v, 
35740 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
35750 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  }.    if( strncm
35760 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69  p(azArg[0]+9, "i
35770 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30  nteger", n-9)==0
35780 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
35790 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
357a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
357b0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
357c0 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
357d0 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 76  [200];.        v
357e0 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
357f0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
35800 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35810 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
35820 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20  ,zBuf,"%s: %lld 
35830 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67  0x%llx\n", azArg
35840 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20  [i],v,v);.      
35850 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
35860 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66  >out, "%s", zBuf
35870 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35880 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
35890 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
358a0 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70   n>=4 && strncmp
358b0 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c 66 74  (azArg[0],"selft
358c0 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  est",n)==0 ){.  
358d0 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20 3d 20    int bIsInit = 
358e0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
358f0 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ue to initialize
35900 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
35910 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ble */.    int b
35920 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20  Verbose = 0;    
35930 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 6f      /* Verbose o
35940 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  utput */.    int
35950 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
35960 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
35970 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65 61 64   SELFTEST alread
35980 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  y exists */.    
35990 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20 20 20  int i, k;       
359a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
359b0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
359c0 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b 20   int nTest = 0; 
359d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
359e0 62 65 72 20 6f 66 20 74 65 73 74 73 20 72 75 6e  ber of tests run
359f0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 72  s */.    int nEr
35a00 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
35a10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
35a20 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20  rrors seen */.  
35a30 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74 72 3b    ShellText str;
35a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
35a50 73 77 65 72 20 66 6f 72 20 61 20 71 75 65 72 79  swer for a query
35a60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
35a70 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
35a80 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69 6e 73   /* Query agains
35a90 74 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74  t the SELFTEST t
35aa0 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65  able */..    ope
35ab0 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20 20 66  n_db(p,0);.    f
35ac0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
35ad0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
35ae0 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
35af0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[i];.      if( 
35b00 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31  z[0]=='-' && z[1
35b10 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
35b20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
35b30 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
35b40 20 20 20 20 20 20 20 20 62 49 73 49 6e 69 74 20          bIsInit 
35b50 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
35b60 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
35b70 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29 7b 0a  p(z,"-v")==0 ){.
35b80 20 20 20 20 20 20 20 20 62 56 65 72 62 6f 73 65          bVerbose
35b90 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  ++;.      }else.
35ba0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
35bb0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35bc0 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "Unknown opt
35bd0 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22  ion \"%s\" on \"
35be0 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
35c00 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29  rg[i], azArg[0])
35c10 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
35c20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 68  intf(stderr, "Sh
35c30 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
35c40 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b 0a 20  --init -v\n");. 
35c50 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
35c60 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
35c70 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
35c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35c90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62   if( sqlite3_tab
35ca0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
35cb0 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c  ta(p->db,"main",
35cc0 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30 2c 30  "selftest",0,0,0
35cd0 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 20 20  ,0,0,0).        
35ce0 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20     != SQLITE_OK 
35cf0 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65  ){.      bSelfte
35d00 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  stExists = 0;.  
35d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
35d20 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d  SelftestExists =
35d30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
35d40 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20 20 20  ( bIsInit ){.   
35d50 20 20 20 63 72 65 61 74 65 53 65 6c 66 74 65 73     createSelftes
35d60 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20 20 20  tTable(p);.     
35d70 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
35d80 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
35d90 69 6e 69 74 54 65 78 74 28 26 73 74 72 29 3b 0a  initText(&str);.
35da0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
35db0 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a 20 20  str, "x", 0);.  
35dc0 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74 65 73    for(k=bSelftes
35dd0 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b 20 6b  tExists; k>=0; k
35de0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  --){.      if( k
35df0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==1 ){.        r
35e00 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
35e10 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20  are_v2(p->db,.  
35e20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
35e30 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73  T tno,op,cmd,ans
35e40 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 20 4f   FROM selftest O
35e50 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a 20 20  RDER BY tno",.  
35e60 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
35e70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
35e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
35e90 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
35ea0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20  are_v2(p->db,.  
35eb0 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28          "VALUES(
35ec0 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73 69 6e  0,'memo','Missin
35ed0 67 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  g SELFTEST table
35ee0 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65 63 6b   - default check
35ef0 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a 20 20  s only',''),".  
35f00 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 28          "      (
35f10 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20  1,'run','PRAGMA 
35f20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27  integrity_check'
35f30 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20 20 20  ,'ok')",.       
35f40 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
35f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35f60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
35f70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35f80 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71 75 65  derr, "Error que
35f90 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66 74 65  rying the selfte
35fa0 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20  st table\n");.  
35fb0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
35fd0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
35fe0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
35ff0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
36000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
36010 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f 73 74  (i=1; sqlite3_st
36020 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
36030 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20 20 20  E_ROW; i++){.   
36040 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d 20 73       int tno = s
36050 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
36060 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
36070 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
36080 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
36090 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
360a0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
360b0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
360c0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63   char *zSql = (c
360d0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
360e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
360f0 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20  Stmt, 2);.      
36100 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
36110 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ns = (const char
36120 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
36130 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b  _text(pStmt, 3);
36140 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ..        k = 0;
36150 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65  .        if( bVe
36160 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  rbose>0 ){.     
36170 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74       char *zQuot
36180 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
36190 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c 29 3b  ntf("%q", zSql);
361a0 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
361b0 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e 22 2c  f("%d: %s %s\n",
361c0 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29   tno, zOp, zSql)
361d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
361e0 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 29  te3_free(zQuote)
361f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36200 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
36210 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20 29 7b  Op,"memo")==0 ){
36220 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
36230 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
36240 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
36250 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
36260 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
36270 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29 7b 0a  Op,"run")==0 ){.
36280 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
36290 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
362a0 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d 20 30         str.n = 0
362b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 2e  ;.          str.
362c0 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[0] = 0;.      
362d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
362e0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
362f0 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70 75 74  l, captureOutput
36300 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72 2c 20  Callback, &str, 
36310 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
36320 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a 20 20       nTest++;.  
36330 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72          if( bVer
36340 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
36350 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36360 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c 74 3a  p->out, "Result:
36370 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29 3b 0a   %s\n", str.z);.
36380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36390 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20        if( rc || 
363a0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
363b0 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
363c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
363d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  1;.            u
363e0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
363f0 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d 63 6f  t, "%d: error-co
36400 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20 74 6e  de-%d: %s\n", tn
36410 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 29 3b  o, rc, zErrMsg);
36420 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
36430 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
36440 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  g);.          }e
36450 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
36460 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20 29 7b  Ans,str.z)!=0 ){
36470 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72  .            nEr
36480 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
36490 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
364a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
364b0 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 45 78  (p->out, "%d: Ex
364c0 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c  pected: [%s]\n",
364d0 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20 20 20   tno, zAns);.   
364e0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
364f0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
36500 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  :      Got: [%s]
36510 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e 7a 29  \n", tno, str.z)
36520 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36530 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
36540 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
36550 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
36560 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
36570 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69  "Unknown operati
36580 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73 65 6c  on \"%s\" on sel
36590 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c 6e 22  ftest line %d\n"
365a0 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20 20 20  , zOp, tno);.   
365b0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
365c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
365d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
365e0 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
365f0 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65  er rows of conte
36600 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45 53 54  nt from SELFTEST
36610 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
36620 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
36630 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  );.    } /* End 
36640 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f 0a 20  loop over k */. 
36650 20 20 20 66 72 65 65 54 65 78 74 28 26 73 74 72     freeText(&str
36660 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
36670 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 65  tf(p->out, "%d e
36680 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25 64 20  rrors out of %d 
36690 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72 2c 20  tests\n", nErr, 
366a0 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  nTest);.  }else.
366b0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
366c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
366d0 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20  ], "separator", 
366e0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
366f0 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72 67 3e   nArg<2 || nArg>
36700 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
36710 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
36720 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74 6f 72  sage: .separator
36730 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29 3b 0a   COL ?ROW?\n");.
36740 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36750 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
36760 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=2 ){.      sql
36770 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
36780 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
36790 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
367a0 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  arator,.        
367b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
367c0 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
367d0 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65 70 61  ySize(p->colSepa
367e0 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b  rator)-1, azArg[
367f0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  1]);.    }.    i
36800 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20  f( nArg>=3 ){.  
36810 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
36820 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
36830 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
36840 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 0a 20  >rowSeparator,. 
36850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36860 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
36870 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
36880 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d 31 2c  rowSeparator)-1,
36890 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20   azArg[2]);.    
368a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
368b0 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20   c=='s' && n>=4 
368c0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
368d0 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c 6e 29  [0],"sha3sum",n)
368e0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
368f0 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
36900 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62  ;   /* Which tab
36910 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d 2e 20  le to checksum. 
36920 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74 68 69  0 means everythi
36930 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ng */.    int i;
36940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36950 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
36960 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53  er */.    int bS
36970 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20  chema = 0;      
36980 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73 68 20     /* Also hash 
36990 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
369a0 20 20 69 6e 74 20 62 53 65 70 61 72 61 74 65 20    int bSeparate 
369b0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 48 61  = 0;       /* Ha
369c0 73 68 20 65 61 63 68 20 74 61 62 6c 65 20 73 65  sh each table se
369d0 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20  parately */.    
369e0 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32 34 3b  int iSize = 224;
369f0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
36a00 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73   algorithm to us
36a10 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 44 65  e */.    int bDe
36a20 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  bug = 0;        
36a30 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77 20 74    /* Only show t
36a40 68 65 20 71 75 65 72 79 20 74 68 61 74 20 77 6f  he query that wo
36a50 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a 2f 0a  uld have run */.
36a60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
36a70 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
36a80 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74 61 62  For querying tab
36a90 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  les names */.   
36aa0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
36ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
36ac0 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20   to be run */.  
36ad0 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20    char *zSep;   
36ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
36af0 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 53  parator */.    S
36b00 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b 20 20  hellText sSql;  
36b10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
36b20 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68 65 20  ete SQL for the 
36b30 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74 68 65  query to run the
36b40 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53 68 65   hash */.    She
36b50 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b 20 20  llText sQuery;  
36b60 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
36b70 71 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20  queries used to 
36b80 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  read all content
36b90 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   */.    open_db(
36ba0 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  p, 0);.    for(i
36bb0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
36bc0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
36bd0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
36be0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  ;.      if( z[0]
36bf0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
36c00 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   z++;.        if
36c10 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[0]=='-' ) z+
36c20 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  +;.        if( s
36c30 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d 61 22  trcmp(z,"schema"
36c40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
36c50 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20    bSchema = 1;. 
36c60 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
36c70 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
36c80 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d 3d 30  z,"sha3-224")==0
36c90 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68   || strcmp(z,"sh
36ca0 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20 20 20  a3-256")==0.    
36cb0 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a       || strcmp(z
36cc0 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d 30 20  ,"sha3-384")==0 
36cd0 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61  || strcmp(z,"sha
36ce0 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20 20 20  3-512")==0.     
36cf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
36d00 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 5b  iSize = atoi(&z[
36d10 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  5]);.        }el
36d20 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
36d30 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67 22 29  trcmp(z,"debug")
36d40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
36d50 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20   bDebug = 1;.   
36d60 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
36d70 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
36d80 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
36d90 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
36da0 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25  on \"%s\" on \"%
36db0 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
36dd0 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d  Arg[i], azArg[0]
36de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
36df0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
36e00 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f  "Should be one o
36e10 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20 20 20  f: --schema".   
36e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e30 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d 73 68            " --sh
36e40 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d 32 35  a3-224 --sha3-25
36e50 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d 2d 73  5 --sha3-384 --s
36e60 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20 20 20  ha3-512\n");.   
36e70 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
36e80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
36e90 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
36ea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36eb0 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65   }else if( zLike
36ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
36ed0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36ee0 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75 6d 20  Usage: .sha3sum 
36ef0 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b 45 2d  ?OPTIONS? ?LIKE-
36f00 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
36f10 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36f20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
36f30 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
36f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36f50 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a 20 20     zLike = z;.  
36f60 20 20 20 20 20 20 62 53 65 70 61 72 61 74 65 20        bSeparate 
36f70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
36f80 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
36f90 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22 2c 20 7a  ("sqlite\\_%", z
36fa0 4c 69 6b 65 2c 20 27 5c 5c 27 29 3d 3d 30 20 29  Like, '\\')==0 )
36fb0 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20   bSchema = 1;.  
36fc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36fd0 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b 0a 20  if( bSchema ){. 
36fe0 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c       zSql = "SEL
36ff0 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20  ECT lower(name) 
37000 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
37010 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
37020 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 74   " WHERE type='t
37030 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65 73  able' AND coales
37040 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31  ce(rootpage,0)>1
37050 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
37060 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
37070 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  T 'sqlite_master
37080 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '".             
37090 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f 6c  " ORDER BY 1 col
370a0 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20  late nocase";.  
370b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
370c0 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f  Sql = "SELECT lo
370d0 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73  wer(name) FROM s
370e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
370f0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
37100 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  RE type='table' 
37110 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
37120 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20 20  tpage,0)>1".    
37130 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6e           " AND n
37140 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
37150 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20 20  lite_%'".       
37160 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
37170 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73   1 collate nocas
37180 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e";.    }.    sq
37190 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
371a0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
371b0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
371c0 20 20 69 6e 69 74 54 65 78 74 28 26 73 51 75 65    initText(&sQue
371d0 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54 65 78  ry);.    initTex
371e0 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 61 70  t(&sSql);.    ap
371f0 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
37200 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d 24 71  "WITH [sha3sum$q
37210 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28 22 2c  uery](a,b) AS(",
37220 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  0);.    zSep = "
37230 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20 77 68  VALUES(";.    wh
37240 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
37250 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
37260 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  tmt) ){.      co
37270 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
37280 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
37290 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
372a0 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20  t(pStmt,0);.    
372b0 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26 20 73    if( zLike && s
372c0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
372d0 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d  Like, zTab, 0)!=
372e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
372f0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
37300 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c  zTab, "sqlite_",
37310 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)!=0 ){.       
37320 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
37330 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20 46 52  ery,"SELECT * FR
37340 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  OM ", 0);.      
37350 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
37360 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a  uery,zTab,'"');.
37370 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
37380 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e 4f 54  xt(&sQuery," NOT
37390 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a   INDEXED;", 0);.
373a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
373b0 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
373c0 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30  lite_master")==0
373d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
373e0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
373f0 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
37400 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52  ,tbl_name,sql FR
37410 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
37420 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
37430 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
37440 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20  RDER BY name;", 
37450 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
37460 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c  if( strcmp(zTab,
37470 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
37480 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
37490 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
374a0 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d  uery,"SELECT nam
374b0 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c 69 74  e,seq FROM sqlit
374c0 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20 20 20  e_sequence".    
374d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374e0 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
374f0 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20  Y name;", 0);.  
37500 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
37510 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69  rcmp(zTab, "sqli
37520 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29 7b  te_stat1")==0 ){
37530 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
37540 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
37550 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74  ECT tbl,idx,stat
37560 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
37570 74 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t1".            
37580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
37590 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 69 64   ORDER BY tbl,id
375a0 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  x;", 0);.      }
375b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
375c0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  zTab, "sqlite_st
375d0 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  at3")==0.       
375e0 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
375f0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  zTab, "sqlite_st
37600 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  at4")==0 ){.    
37610 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
37620 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43 54 20  sQuery, "SELECT 
37630 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  * FROM ", 0);.  
37640 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
37650 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62 2c 20  (&sQuery, zTab, 
37660 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
37670 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 20  ndText(&sQuery, 
37680 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 20  " ORDER BY tbl, 
37690 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20  idx, rowid;\n", 
376a0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
376b0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
376c0 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20  ql, zSep, 0);.  
376d0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
376e0 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20  sSql, sQuery.z, 
376f0 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73 51 75  '\'');.      sQu
37700 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ery.n = 0;.     
37710 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
37720 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  l, ",", 0);.    
37730 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
37740 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b  ql, zTab, '\'');
37750 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 29  .      zSep = ")
37760 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ,(";.    }.    s
37770 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
37780 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
37790 6