/ Hex Artifact Content
Login

Artifact 0b2c8d55e3703723a22610d75ccd4037962c3bcb5ad5570efd781e8c521811c4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
08b0: 47 57 33 32 5f 5f 29 0a 23 20 20 64 65 66 69 6e  GW32__).#  defin
08c0: 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e 74 0a  e DIRENT dirent.
08d0: 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53 4c 4e  #  ifndef S_ISLN
08e0: 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53 5f 49  K.#   define S_I
08f0: 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29 0a 23  SLNK(mode) (0).#
0900: 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69 66 0a    endif.# endif.
0910: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0920: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0930: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0940: 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  .h>..#if HAVE_RE
0950: 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65  ADLINE.# include
0960: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0970: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0980: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0990: 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ry.h>.#endif..#i
09a0: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  f HAVE_EDITLINE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c  # include <editl
09c0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
09d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
09e0: 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56  _EDITLINE || HAV
09f0: 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65  E_READLINE..# de
0a00: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0a10: 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69  istory(X) add_hi
0a20: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0a40: 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73  tory(X) read_his
0a50: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0a60: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a70: 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69  tory(X) write_hi
0a80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a90: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0aa0: 69 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65  istory(X) stifle
0ab0: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0ac0: 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c  fine shell_readl
0ad0: 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28  ine(X) readline(
0ae0: 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  X)..#elif HAVE_L
0af0: 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c  INENOISE..# incl
0b00: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
0b10: 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ".# define shell
0b20: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0b30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b40: 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20  Add(X).# define 
0b50: 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f  shell_read_histo
0b60: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b70: 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20  istoryLoad(X).# 
0b80: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0b90: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69  te_history(X) li
0ba0: 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61  nenoiseHistorySa
0bb0: 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ve(X).# define s
0bc0: 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74  hell_stifle_hist
0bd0: 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65  ory(X) linenoise
0be0: 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e  HistorySetMaxLen
0bf0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0c00: 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c  ll_readline(X) l
0c10: 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c  inenoise(X)..#el
0c20: 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65  se..# define she
0c30: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0c40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c50: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0c60: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c70: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0c80: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48  (X)..# define SH
0c90: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
0ca0: 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a  TLINE 1.#endif..
0cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0cc0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0cd0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0ce0: 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64   <io.h>.# includ
0cf0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65  e <fcntl.h>.# de
0d00: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
0d10: 69 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64  isatty(h).# ifnd
0d20: 65 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66  ef access.#  def
0d30: 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20  ine access(f,m) 
0d40: 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29  _access((f),(m))
0d50: 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66  .# endif.# undef
0d60: 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20   popen.# define 
0d70: 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75  popen _popen.# u
0d80: 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65  ndef pclose.# de
0d90: 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c  fine pclose _pcl
0da0: 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61  ose.#else. /* Ma
0db0: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
0dc0: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
0dd0: 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74  . */. extern int
0de0: 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23   isatty(int);..#
0df0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
0e00: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
0e10: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
0e20: 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63   /* popen and pc
0e30: 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39  lose are not C89
0e40: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73   functions and s
0e50: 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74  o are.  ** somet
0e60: 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  imes omitted fro
0e70: 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20  m the <stdio.h> 
0e80: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74  header */.   ext
0e90: 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28  ern FILE *popen(
0ea0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
0eb0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74  t char*);.   ext
0ec0: 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46  ern int pclose(F
0ed0: 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20  ILE*);.# else.# 
0ee0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f   define SQLITE_O
0ef0: 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e  MIT_POPEN 1.# en
0f00: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  dif.#endif..#if 
0f10: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0f20: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0f30: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0f40: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
0f50: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
0f60: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
0f70: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
0f80: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
0f90: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
0fa0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0fb0: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0fc0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0fd0: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0fe0: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0ff0: 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d  ndif../* ctype m
1000: 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20  acros that work 
1010: 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72  with signed char
1020: 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e  acters */.#defin
1030: 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73  e IsSpace(X)  is
1040: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
1050: 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20  char)X).#define 
1060: 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69  IsDigit(X)  isdi
1070: 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68  git((unsigned ch
1080: 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f  ar)X).#define To
1090: 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29  Lower(X)  (char)
10a0: 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65  tolower((unsigne
10b0: 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64  d char)X)..#if d
10c0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
10d0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
10e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f  .#include <windo
10f0: 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67  ws.h>../* string
1100: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74   conversion rout
1110: 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  ines only needed
1120: 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74   on Win32 */.ext
1130: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
1140: 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f  3_win32_unicode_
1150: 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29  to_utf8(LPCWSTR)
1160: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
1170: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1180: 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e  s_to_utf8_v2(con
1190: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
11a0: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
11b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
11c0: 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73  _to_mbcs_v2(cons
11d0: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
11e0: 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71  extern LPWSTR sq
11f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1200: 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73  _to_unicode(cons
1210: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a  t char *zText);.
1220: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69  #endif../* On Wi
1230: 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c  ndows, we normal
1240: 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70  ly run with outp
1250: 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20  ut mode of TEXT 
1260: 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61  so that \n chara
1270: 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74  cters.** are aut
1280: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73  omatically trans
1290: 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e  lated into \r\n.
12a0: 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20    However, this 
12b0: 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a  behavior needs.*
12c0: 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  * to be disabled
12d0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28   in some cases (
12e0: 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74  ex: when generat
12f0: 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61  ing CSV output a
1300: 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65  nd when.** rende
1310: 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69  ring quoted stri
1320: 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ngs that contain
1330: 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e   \n characters).
1340: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
1350: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65  ** routines take
1360: 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a   care of that..*
1370: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1380: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1390: 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76  (WIN32).static v
13a0: 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  oid setBinaryMod
13b0: 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e  e(FILE *file, in
13c0: 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69  t isOutput){.  i
13d0: 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66  f( isOutput ) ff
13e0: 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73  lush(file);.  _s
13f0: 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66  etmode(_fileno(f
1400: 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29  ile), _O_BINARY)
1410: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1420: 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45  setTextMode(FILE
1430: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1440: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
1450: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
1460: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
1470: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
1480: 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73  _O_TEXT);.}.#els
1490: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69  e.# define setBi
14a0: 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20  naryMode(X,Y).# 
14b0: 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f  define setTextMo
14c0: 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a  de(X,Y).#endif..
14d0: 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20  ./* True if the 
14e0: 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64  timer is enabled
14f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65   */.static int e
1500: 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a  nableTimer = 0;.
1510: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
1520: 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63  urrent wall-cloc
1530: 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63  k time */.static
1540: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
1550: 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a  imeOfDay(void){.
1560: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
1570: 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d  _vfs *clockVfs =
1580: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
1590: 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f  t64 t;.  if( clo
15a0: 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b  ckVfs==0 ) clock
15b0: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
15c0: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
15d0: 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73   clockVfs->iVers
15e0: 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56  ion>=2 && clockV
15f0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
1600: 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20  Int64!=0 ){.    
1610: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1620: 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63  ntTimeInt64(cloc
1630: 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c  kVfs, &t);.  }el
1640: 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  se{.    double r
1650: 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e  ;.    clockVfs->
1660: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f  xCurrentTime(clo
1670: 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20  ckVfs, &r);.    
1680: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  t = (sqlite3_int
1690: 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30  64)(r*86400000.0
16a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16b0: 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  t;.}..#if !defin
16c0: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
16d0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
16e0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75   !defined(__minu
16f0: 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  x).#include <sys
1700: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
1710: 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1720: 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64  h>../* VxWorks d
1730: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1740: 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66  getrusage() as f
1750: 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74  ar as we can det
1760: 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65  ermine */.#if de
1770: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
1780: 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  L) || defined(__
1790: 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75  RTP__).struct ru
17a0: 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20  sage {.  struct 
17b0: 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65  timeval ru_utime
17c0: 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69  ; /* user CPU ti
17d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72  me used */.  str
17e0: 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73  uct timeval ru_s
17f0: 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20  time; /* system 
1800: 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f  CPU time used */
1810: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72  .};.#define getr
1820: 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65  usage(A,B) memse
1830: 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29  t(B,0,sizeof(*B)
1840: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76  ).#endif../* Sav
1850: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1860: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1870: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1880: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1890: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
18a0: 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50  e sBegin;  /* CP
18b0: 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20  U time at start 
18c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
18d0: 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20  3_int64 iBegin; 
18e0: 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74   /* Wall-clock t
18f0: 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a  ime at start */.
1900: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1910: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1930: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
1940: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
1950: 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75  mer ){.    getru
1960: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1970: 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20  , &sBegin);.    
1980: 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44  iBegin = timeOfD
1990: 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  ay();.  }.}../* 
19a0: 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  Return the diffe
19b0: 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d  rence of two tim
19c0: 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  e_structs in sec
19d0: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
19e0: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73  ouble timeDiff(s
19f0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1a00: 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69  Start, struct ti
1a10: 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20  meval *pEnd){.  
1a20: 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76  return (pEnd->tv
1a30: 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e  _usec - pStart->
1a40: 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30  tv_usec)*0.00000
1a50: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f  1 +.         (do
1a60: 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73  uble)(pEnd->tv_s
1a70: 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f  ec - pStart->tv_
1a80: 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  sec);.}../*.** P
1a90: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
1aa0: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
1ab0: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
1ac0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1ad0: 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20  ableTimer ){.   
1ae0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1af0: 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  End = timeOfDay(
1b00: 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  );.    struct ru
1b10: 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67  sage sEnd;.    g
1b20: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
1b30: 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20  SELF, &sEnd);.  
1b40: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
1b50: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
1b60: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
1b70: 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20  .       (iEnd - 
1b80: 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20  iBegin)*0.001,. 
1b90: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
1ba0: 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c  sBegin.ru_utime,
1bb0: 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29   &sEnd.ru_utime)
1bc0: 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66  ,.       timeDif
1bd0: 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69  f(&sBegin.ru_sti
1be0: 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69  me, &sEnd.ru_sti
1bf0: 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  me));.  }.}..#de
1c00: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
1c10: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
1c20: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
1c30: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
1c40: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a  ne HAS_TIMER 1..
1c50: 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f  #elif (defined(_
1c60: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1c70: 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61  d(WIN32))../* Sa
1c80: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1c90: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1ca0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
1cb0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
1cc0: 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f  atic HANDLE hPro
1cd0: 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c  cess;.static FIL
1ce0: 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65  ETIME ftKernelBe
1cf0: 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  gin;.static FILE
1d00: 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e  TIME ftUserBegin
1d10: 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ;.static sqlite3
1d20: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67  _int64 ftWallBeg
1d30: 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c  in;.typedef BOOL
1d40: 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f   (WINAPI *GETPRO
1d50: 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20  CTIMES)(HANDLE, 
1d60: 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49  LPFILETIME, LPFI
1d70: 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20  LETIME,.        
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49              LPFI
1da0: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
1db0: 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50  ME);.static GETP
1dc0: 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63  ROCTIMES getProc
1dd0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e  essTimesAddr = N
1de0: 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ULL;../*.** Chec
1df0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68  k to see if we h
1e00: 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72  ave timer suppor
1e10: 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  t.  Return 1 if 
1e20: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70  necessary.** sup
1e30: 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66  port found (or f
1e40: 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29  ound previously)
1e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e60: 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  hasTimer(void){.
1e70: 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73    if( getProcess
1e80: 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20  TimesAddr ){.   
1e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65   return 1;.  } e
1ea0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74  lse {.    /* Get
1eb0: 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69  ProcessTimes() i
1ec0: 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69  sn't supported i
1ed0: 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65  n WIN95 and some
1ee0: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20   other Windows. 
1ef0: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20     ** versions. 
1f00: 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69  See if the versi
1f10: 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  on we are runnin
1f20: 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64  g on has it, and
1f30: 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f   if it.    ** do
1f40: 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70  es, save off a p
1f50: 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64  ointer to it and
1f60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1f70: 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20  cess handle..   
1f80: 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73   */.    hProcess
1f90: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1fa0: 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20  cess();.    if( 
1fb0: 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20  hProcess ){.    
1fc0: 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73    HINSTANCE hins
1fd0: 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61  tLib = LoadLibra
1fe0: 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33  ry(TEXT("Kernel3
1ff0: 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20  2.dll"));.      
2000: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73  if( NULL != hins
2010: 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20  tLib ){.        
2020: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2030: 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ddr =.          
2040: 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29    (GETPROCTIMES)
2050: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
2060: 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72  hinstLib, "GetPr
2070: 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20  ocessTimes");.  
2080: 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21        if( NULL !
2090: 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  = getProcessTime
20a0: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20  sAddr ){.       
20b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46       }.        F
20d0: 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74  reeLibrary(hinst
20e0: 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lib);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
2110: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
2120: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
2130: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
2140: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2150: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2160: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2170: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
2180: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
2190: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
21a0: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
21b0: 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f  ocess,&ftCreatio
21c0: 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20  n,&ftExit,.     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69     &ftKernelBegi
21f0: 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b  n,&ftUserBegin);
2200: 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e  .    ftWallBegin
2210: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2220: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
2230: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
2240: 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20  of two FILETIME 
2250: 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e  structs in secon
2260: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  ds */.static dou
2270: 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c  ble timeDiff(FIL
2280: 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46  ETIME *pStart, F
2290: 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a  ILETIME *pEnd){.
22a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
22b0: 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c  64Start = *((sql
22c0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74  ite_int64 *) pSt
22d0: 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69  art);.  sqlite_i
22e0: 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28  nt64 i64End = *(
22f0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29  (sqlite_int64 *)
2300: 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   pEnd);.  return
2310: 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45   (double) ((i64E
2320: 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f  nd - i64Start) /
2330: 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a   10000000.0);.}.
2340: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
2350: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
2360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2370: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
2380: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2390: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
23a0: 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46  imesAddr){.    F
23b0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
23c0: 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65  on, ftExit, ftKe
23d0: 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45  rnelEnd, ftUserE
23e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
23f0: 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20  int64 ftWallEnd 
2400: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2410: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2420: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2430: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2440: 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64  xit,&ftKernelEnd
2450: 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20  ,&ftUserEnd);.  
2460: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
2470: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
2480: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
2490: 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45  .       (ftWallE
24a0: 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e  nd - ftWallBegin
24b0: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
24c0: 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72  timeDiff(&ftUser
24d0: 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e  Begin, &ftUserEn
24e0: 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  d),.       timeD
24f0: 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67  iff(&ftKernelBeg
2500: 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64  in, &ftKernelEnd
2510: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69  ));.  }.}..#defi
2520: 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62  ne BEGIN_TIMER b
2530: 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66  eginTimer().#def
2540: 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e  ine END_TIMER en
2550: 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  dTimer().#define
2560: 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69   HAS_TIMER hasTi
2570: 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65  mer()..#else.#de
2580: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
2590: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
25a0: 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ER.#define HAS_T
25b0: 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  IMER 0.#endif../
25c0: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65  *.** Used to pre
25d0: 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62  vent warnings ab
25e0: 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
25f0: 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  eters.*/.#define
2600: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2610: 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a  R(x) (void)(x)..
2620: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
2630: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
2640: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
2650: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
2660: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
2670: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
2680: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
2690: 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ing flag is set,
26a0: 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78   then command ex
26b0: 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a  ecution stops.**
26c0: 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20   at an error if 
26d0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  we are not inter
26e0: 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  active..*/.stati
26f0: 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72  c int bail_on_er
2700: 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ror = 0;../*.** 
2710: 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20  Threat stdin as 
2720: 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  an interactive i
2730: 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c  nput if the foll
2740: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  owing variable.*
2750: 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65  * is true.  Othe
2760: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74  rwise, assume st
2770: 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  din is connected
2780: 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69   to a file or pi
2790: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe..*/.static in
27a0: 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  t stdin_is_inter
27b0: 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  active = 1;../*.
27c0: 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79  ** On Windows sy
27d0: 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f  stems we have to
27e0: 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72   know if standar
27f0: 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f  d output is a co
2800: 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65  nsole.** in orde
2810: 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55  r to translate U
2820: 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20  TF-8 into MBCS. 
2830: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2840: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72  ariable is.** tr
2850: 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f  ue if translatio
2860: 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  n is required..*
2870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 64  /.static int std
2880: 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d  out_is_console =
2890: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   1;../*.** The f
28a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
28b0: 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61  open SQLite data
28c0: 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61  base.  We make a
28d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73  his database a s
28f0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73  tatic variable s
2900: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
2910: 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20   accessed.** by 
2920: 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c  the SIGINT handl
2930: 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20  er to interrupt 
2940: 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73  database process
2950: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ing..*/.static s
2960: 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62  qlite3 *globalDb
2970: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75   = 0;../*.** Tru
2980: 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70  e if an interrup
2990: 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61  t (Control-C) ha
29a0: 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e  s been received.
29b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74  .*/.static volat
29c0: 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65  ile int seenInte
29d0: 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  rrupt = 0;../*.*
29e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61  * This is the na
29f0: 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61  me of our progra
2a00: 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20  m. It is set in 
2a10: 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20  main(), used.** 
2a20: 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f  in a number of o
2a30: 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73  ther places, mos
2a40: 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  tly for error me
2a50: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
2a60: 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a  c char *Argv0;..
2a70: 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72  /*.** Prompt str
2a80: 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65  ings. Initialize
2a90: 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61  d in main. Setta
2aa0: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70  ble with.**   .p
2ab0: 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69  rompt main conti
2ac0: 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nue.*/.static ch
2ad0: 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30  ar mainPrompt[20
2ae0: 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ];     /* First 
2af0: 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66  line prompt. def
2b00: 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22  ault: "sqlite> "
2b10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63  */.static char c
2b20: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30  ontinuePrompt[20
2b30: 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69  ]; /* Continuati
2b40: 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  on prompt. defau
2b50: 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a  lt: "   ...> " *
2b60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20  /../*.** Render 
2b70: 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69  output like fpri
2b80: 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20  ntf().  Except, 
2b90: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
2ba0: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a   going to the.**
2bb0: 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20   console and if 
2bc0: 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  this is running 
2bd0: 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63  on a Windows mac
2be0: 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20  hine, translate 
2bf0: 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72  the.** output fr
2c00: 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42  om UTF-8 into MB
2c10: 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  CS..*/.#if defin
2c20: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
2c30: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69  fined(WIN32).voi
2c40: 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49  d utf8_printf(FI
2c50: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
2c60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2c70: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2c80: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2c90: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28   zFormat);.  if(
2ca0: 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f   stdout_is_conso
2cb0: 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f  le && (out==stdo
2cc0: 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72  ut || out==stder
2cd0: 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  r) ){.    char *
2ce0: 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  z1 = sqlite3_vmp
2cf0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2d00: 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32  p);.    char *z2
2d10: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
2d20: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32  _utf8_to_mbcs_v2
2d30: 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  (z1, 0);.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20  ite3_free(z1);. 
2d50: 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74     fputs(z2, out
2d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2d70: 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65  ree(z2);.  }else
2d80: 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f  {.    vfprintf(o
2d90: 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ut, zFormat, ap)
2da0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2db0: 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66  p);.}.#elif !def
2dc0: 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66  ined(utf8_printf
2dd0: 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f  ).# define utf8_
2de0: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2df0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  endif../*.** Ren
2e00: 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20  der output like 
2e10: 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73  fprintf().  This
2e20: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
2e30: 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  sed on anything 
2e40: 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73  that.** includes
2e50: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69   string formatti
2e60: 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a  ng (e.g. "%s")..
2e70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2e80: 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65  raw_printf).# de
2e90: 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20  fine raw_printf 
2ea0: 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a  fprintf.#endif..
2eb0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20  /*.** Write I/O 
2ec0: 74 72 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f  traces to the fo
2ed0: 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a  llowing stream..
2ee0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ef0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
2f00: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74  static FILE *iot
2f10: 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
2f20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f30: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
2f40: 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69  printf in that i
2f50: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
2f60: 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74  t is a.** format
2f70: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73   string and subs
2f80: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
2f90: 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62   are values to b
2fa0: 65 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a  e substituted.**
2fb0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66   in place of % f
2fc0: 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75  ields.  The resu
2fd0: 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67  lt of formatting
2fe0: 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20   this string.** 
2ff0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f  is written to io
3000: 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  trace..*/.#ifdef
3010: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
3020: 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f  OTRACE.static vo
3030: 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  id SQLITE_CDECL 
3040: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f  iotracePrintf(co
3050: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3060: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3070: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
3080: 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d  ;.  if( iotrace=
3090: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
30a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
30b0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  mat);.  z = sqli
30c0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
30d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
30e0: 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f  end(ap);.  utf8_
30f0: 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20  printf(iotrace, 
3100: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69  "%s", z);.  sqli
3110: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23  te3_free(z);.}.#
3120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  endif../*.** Out
3130: 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20  put string zUtf 
3140: 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61  to stream pOut a
3150: 73 20 77 20 63 68 61 72 61 63 74 65 72 73 2e 20  s w characters. 
3160: 20 49 66 20 77 20 69 73 20 6e 65 67 61 74 69 76   If w is negativ
3170: 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74  e,.** then right
3180: 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74 65 78  -justify the tex
3190: 74 2e 20 20 57 20 69 73 20 74 68 65 20 77 69 64  t.  W is the wid
31a0: 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72  th in UTF-8 char
31b0: 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69  acters, not.** i
31c0: 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 20 69  n bytes.  This i
31d0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
31e0: 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69   the %*.*s speci
31f0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e  fication in prin
3200: 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68  tf.** since with
3210: 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68   %*.*s the width
3220: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
3230: 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61  bytes, not chara
3240: 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
3250: 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68   void utf8_width
3260: 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75  _print(FILE *pOu
3270: 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20  t, int w, const 
3280: 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69  char *zUtf){.  i
3290: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  nt i;.  int n;. 
32a0: 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20   int aw = w<0 ? 
32b0: 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a  -w : w;.  char z
32c0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  Buf[1000];.  if(
32d0: 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28   aw>(int)sizeof(
32e0: 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20 28  zBuf)/3 ) aw = (
32f0: 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66 29  int)sizeof(zBuf)
3300: 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  /3;.  for(i=n=0;
3310: 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zUtf[i]; i++){.
3320: 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69 5d      if( (zUtf[i]
3330: 26 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a  &0xc0)!=0x80 ){.
3340: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
3350: 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20   if( n==aw ){.  
3360: 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d        do{ i++; }
3370: 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26  while( (zUtf[i]&
3380: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
3390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
33b0: 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20    if( n>=aw ){. 
33c0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33d0: 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  Out, "%.*s", i, 
33e0: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zUtf);.  }else i
33f0: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75 74  f( w<0 ){.    ut
3400: 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20  f8_printf(pOut, 
3410: 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22  "%*s%s", aw-n, "
3420: 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  ", zUtf);.  }els
3430: 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
3440: 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73 22  tf(pOut, "%s%*s"
3450: 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22  , zUtf, aw-n, ""
3460: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
3470: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
3480: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
3490: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
34a0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
34b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
34c0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
34d0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
34e0: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
34f0: 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28  .  if( !IsDigit(
3500: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
3510: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
3520: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
3530: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
3540: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3550: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
3560: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
3570: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
3580: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3590: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
35a0: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
35b0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
35c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
35d0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
35e0: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
35f0: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
3600: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
3620: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
3630: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3640: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3650: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3660: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3670: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3680: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
3690: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
36a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
36b0: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
36c0: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
36d0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
36e0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
36f0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
3700: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
3710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3720: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
3730: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
3740: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
3750: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
3760: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
3770: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
3780: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
3790: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
37a0: 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69 6e  ength of a strin
37b0: 67 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 2e  g in characters.
37c0: 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46 38    Multibyte UTF8
37d0: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 63   characters.** c
37e0: 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c 65  ount as a single
37f0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
3800: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
3810: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
3820: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  *z){.  int n = 0
3830: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
3840: 0a 20 20 20 20 69 66 28 20 28 30 78 63 30 26 2a  .    if( (0xc0&*
3850: 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20 6e  (z++))!=0x80 ) n
3860: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
3870: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   n;.}../*.** Thi
3880: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
3890: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
38a0: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
38b0: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
38c0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
38d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
38e0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
38f0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3900: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
3910: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
3920: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
3930: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
3940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65  ..**.** If zLine
3950: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3960: 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63  n it is a malloc
3970: 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e  ed buffer return
3980: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65  ed from.** a pre
3990: 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68  vious call to th
39a0: 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  is routine that 
39b0: 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a  may be reused..*
39c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
39d0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
39e0: 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a  r *zLine, FILE *
39f0: 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  in){.  int nLine
3a00: 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20   = zLine==0 ? 0 
3a10: 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  : 100;.  int n =
3a20: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
3a30: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
3a40: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3a50: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
3a60: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
3a70: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3a80: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
3a90: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
3aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
3ab0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3ac0: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3ad0: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3ae0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3af0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3b00: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3b20: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3b30: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3b40: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3b50: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3b60: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3b70: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3b80: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3b90: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ba0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3bb0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3bc0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3be0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3bf0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3c00: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3c10: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3c20: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3c30: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3c40: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3c50: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3c60: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3c70: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3c80: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3c90: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3ca0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3cb0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3cc0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3cd0: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3ce0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3cf0: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3d00: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3d10: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3d20: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3d30: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3d40: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3d50: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3d60: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
3d80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3d90: 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  Trans);.        
3da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3dc0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
3dd0: 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73  , zTrans, nTrans
3de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3df0: 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20  _free(zTrans);. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
3e10: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  /* defined(_WIN3
3e20: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
3e30: 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e  N32) */.  return
3e40: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
3e50: 20 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67   Retrieve a sing
3e60: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
3e70: 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   text..**.** If 
3e80: 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64 20  in==0 then read 
3e90: 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
3ea0: 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20 62  put and prompt b
3eb0: 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65 2e  efore each line.
3ec0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
3ed0: 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20 74  ation is true, t
3ee0: 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74 69  hen a continuati
3ef0: 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70 70  on prompt is app
3f00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20  ropriate..** If 
3f10: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69  isContinuation i
3f20: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
3f30: 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f   main prompt sho
3f40: 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  uld be used..**.
3f50: 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73 20  ** If zPrior is 
3f60: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3f70: 20 69 73 20 61 20 62 75 66 66 65 72 20 66 72 6f   is a buffer fro
3f80: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
3f90: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
3fa0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
3fb0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
3fc0: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3fd0: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
3fe0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
3ff0: 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65 72   and must either
4000: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
4010: 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c  the caller or el
4020: 73 65 20 70 61 73 73 65 64 20 62 61 63 6b 20 69  se passed back i
4030: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
4040: 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69   via the.** zPri
4050: 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  or argument for 
4060: 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  reuse..*/.static
4070: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
4080: 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20  _line(FILE *in, 
4090: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e  char *zPrior, in
40a0: 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  t isContinuation
40b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d  ){.  char *zProm
40c0: 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  pt;.  char *zRes
40d0: 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30  ult;.  if( in!=0
40e0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20   ){.    zResult 
40f0: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
4100: 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d  zPrior, in);.  }
4110: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70  else{.    zPromp
4120: 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  t = isContinuati
4130: 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f  on ? continuePro
4140: 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt : mainPrompt
4150: 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f  ;.#if SHELL_USE_
4160: 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20  LOCAL_GETLINE.  
4170: 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a    printf("%s", z
4180: 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c  Prompt);.    ffl
4190: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
41a0: 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c   zResult = local
41b0: 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c  _getline(zPrior,
41c0: 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20   stdin);.#else. 
41d0: 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b     free(zPrior);
41e0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73  .    zResult = s
41f0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50  hell_readline(zP
4200: 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28 20  rompt);.    if( 
4210: 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65 73  zResult && *zRes
4220: 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f  ult ) shell_add_
4230: 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29  history(zResult)
4240: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4250: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
4260: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
4270: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 68  the value of a h
4280: 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74  exadecimal digit
4290: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
42a0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20  the input.** is 
42b0: 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74 2e  not a hex digit.
42c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
42d0: 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68 61  exDigitValue(cha
42e0: 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27  r c){.  if( c>='
42f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 72  0' && c<='9' ) r
4300: 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20  eturn c - '0';. 
4310: 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20 63   if( c>='a' && c
4320: 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20 63  <='f' ) return c
4330: 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 69   - 'a' + 10;.  i
4340: 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d  f( c>='A' && c<=
4350: 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  'F' ) return c -
4360: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65 74   'A' + 10;.  ret
4370: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
4380: 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
4390: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  as an integer va
43a0: 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77 69  lue, possibly wi
43b0: 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a  th suffixes..*/.
43c0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
43d0: 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c 75  nt64 integerValu
43e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
43f0: 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rg){.  sqlite3_i
4400: 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74  nt64 v = 0;.  st
4410: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
4420: 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69  t { char *zSuffi
4430: 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20  x; int iMult; } 
4440: 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  aMult[] = {.    
4450: 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c  { "KiB", 1024 },
4460: 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30  .    { "MiB", 10
4470: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
4480: 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "GiB", 1024*102
4490: 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20  4*1024 },.    { 
44a0: 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20  "KB",  1000 },. 
44b0: 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30     { "MB",  1000
44c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42  000 },.    { "GB
44d0: 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ",  1000000000 }
44e0: 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31  ,.    { "K",   1
44f0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22  000 },.    { "M"
4500: 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ,   1000000 },. 
4510: 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30     { "G",   1000
4520: 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20  000000 },.  };. 
4530: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73   int i;.  int is
4540: 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Neg = 0;.  if( z
4550: 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  Arg[0]=='-' ){. 
4560: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20     isNeg = 1;.  
4570: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73    zArg++;.  }els
4580: 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27  e if( zArg[0]=='
4590: 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b  +' ){.    zArg++
45a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67  ;.  }.  if( zArg
45b0: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
45c0: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
45d0: 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20  int x;.    zArg 
45e0: 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28  += 2;.    while(
45f0: 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56 61   (x = hexDigitVa
4600: 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30  lue(zArg[0]))>=0
4610: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76   ){.      v = (v
4620: 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20  <<4) + x;.      
4630: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
4650: 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b 30  ( IsDigit(zArg[0
4660: 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ]) ){.      v = 
4670: 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d  v*10 + zArg[0] -
4680: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67   '0';.      zArg
4690: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
46a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
46b0: 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b  Size(aMult); i++
46c0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
46d0: 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74  e3_stricmp(aMult
46e0: 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72  [i].zSuffix, zAr
46f0: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  g)==0 ){.      v
4700: 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75   *= aMult[i].iMu
4710: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
4720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4730: 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20  urn isNeg? -v : 
4740: 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61  v;.}../*.** A va
4750: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
4760: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
4770: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
4780: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
4790: 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20 53  ruct ShellText S
47a0: 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63 74  hellText;.struct
47b0: 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63   ShellText {.  c
47c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
47d0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d  .  int nAlloc;.}
47e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
47f0: 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ize and destroy 
4800: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
4810: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
4820: 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c 6c  d initText(Shell
4830: 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  Text *p){.  mems
4840: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4850: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
4860: 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68 65  oid freeText(She
4870: 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  llText *p){.  fr
4880: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74  ee(p->z);.  init
4890: 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a  Text(p);.}../* z
48a0: 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20 70  In is either a p
48b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c  ointer to a NULL
48c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
48d0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
48e0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
48f0: 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c  lloc(), or a NUL
4900: 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  L pointer. The s
4910: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
4920: 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a   by zAppend is.*
4930: 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20  * added to zIn, 
4940: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 72  and the result r
4950: 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72  eturned in memor
4960: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4970: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e  malloc()..** zIn
4980: 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  , if it was not 
4990: 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a  NULL, is freed..
49a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  **.** If the thi
49b0: 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f  rd argument, quo
49c0: 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c  te, is not '\0',
49d0: 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65 64   then it is used
49e0: 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63   as a.** quote c
49f0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70  haracter for zAp
4a00: 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pend..*/.static 
4a10: 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28  void appendText(
4a20: 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68  ShellText *p, ch
4a30: 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e  ar const *zAppen
4a40: 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a  d, char quote){.
4a50: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
4a60: 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   i;.  int nAppen
4a70: 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41 70  d = strlen30(zAp
4a80: 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  pend);..  len = 
4a90: 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a  nAppend+p->n+1;.
4aa0: 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20    if( quote ){. 
4ab0: 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20     len += 2;.   
4ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4ad0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ae0: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4af0: 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a  =quote ) len++;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4b10: 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41   p->n+len>=p->nA
4b20: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
4b30: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
4b40: 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a  c*2 + len + 20;.
4b50: 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c      p->z = reall
4b60: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
4b70: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4b80: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  z==0 ){.      me
4b90: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
4ba0: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
4bb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4bc0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4bd0: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
4be0: 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20   p->z+p->n;.    
4bf0: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4c10: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
4c20: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
4c30: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
4c40: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4c50: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
4c60: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
4c70: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
4c80: 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  ote;.    p->n = 
4c90: 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e  (int)(zCsr - p->
4ca0: 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20  z);.    *zCsr = 
4cb0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  '\0';.  }else{. 
4cc0: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70     memcpy(p->z+p
4cd0: 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41  ->n, zAppend, nA
4ce0: 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e  ppend);.    p->n
4cf0: 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20   += nAppend;.   
4d00: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c   p->z[p->n] = '\
4d10: 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0';.  }.}../*.**
4d20: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
4d30: 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66  rmine if identif
4d40: 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20  ier zName needs 
4d50: 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69  to be quoted, ei
4d60: 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20  ther.** because 
4d70: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  it contains non-
4d80: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
4d90: 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61  racters, or beca
4da0: 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20  use it is an.** 
4db0: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20  SQLite keyword. 
4dc0: 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65   Be conservative
4dd0: 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74   in this estimat
4de0: 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  e:  When in doub
4df0: 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  t assume.** that
4e00: 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75   quoting is requ
4e10: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ired..**.** Retu
4e20: 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e  rn '"' if quotin
4e30: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  g is required.  
4e40: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71  Return 0 if no q
4e50: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
4e60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
4e70: 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e  ar quoteChar(con
4e80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4e90: 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65  .  /* All SQLite
4ea0: 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c   keywords, in al
4eb0: 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72  phabetical order
4ec0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
4ed0: 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f  st char *azKeywo
4ee0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41  rds[] = {.    "A
4ef0: 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c  BORT", "ACTION",
4f00: 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c   "ADD", "AFTER",
4f10: 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c   "ALL", "ALTER",
4f20: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44   "ANALYZE", "AND
4f30: 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53  ", "AS",.    "AS
4f40: 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41  C", "ATTACH", "A
4f50: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22  UTOINCREMENT", "
4f60: 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22  BEFORE", "BEGIN"
4f70: 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59  , "BETWEEN", "BY
4f80: 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45 22  ",.    "CASCADE"
4f90: 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54 22  , "CASE", "CAST"
4fa0: 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c  , "CHECK", "COLL
4fb0: 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20  ATE", "COLUMN", 
4fc0: 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43  "COMMIT",.    "C
4fd0: 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54  ONFLICT", "CONST
4fe0: 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22  RAINT", "CREATE"
4ff0: 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52  , "CROSS", "CURR
5000: 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22  ENT_DATE",.    "
5010: 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22  CURRENT_TIME", "
5020: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
5030: 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20  P", "DATABASE", 
5040: 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45  "DEFAULT", "DEFE
5050: 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45  RRABLE",.    "DE
5060: 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45  FERRED", "DELETE
5070: 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54 41  ", "DESC", "DETA
5080: 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c  CH", "DISTINCT",
5090: 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c   "DROP", "EACH",
50a0: 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e  .    "ELSE", "EN
50b0: 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45  D", "ESCAPE", "E
50c0: 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49  XCEPT", "EXCLUSI
50d0: 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22  VE", "EXISTS", "
50e0: 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46  EXPLAIN",.    "F
50f0: 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f  AIL", "FOR", "FO
5100: 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20  REIGN", "FROM", 
5110: 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20  "FULL", "GLOB", 
5120: 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47  "GROUP", "HAVING
5130: 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47  ", "IF",.    "IG
5140: 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54  NORE", "IMMEDIAT
5150: 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58  E", "IN", "INDEX
5160: 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49  ", "INDEXED", "I
5170: 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45  NITIALLY", "INNE
5180: 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22  R",.    "INSERT"
5190: 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e  , "INSTEAD", "IN
51a0: 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22  TERSECT", "INTO"
51b0: 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22  , "IS", "ISNULL"
51c0: 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c  , "JOIN", "KEY",
51d0: 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49  .    "LEFT", "LI
51e0: 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d  KE", "LIMIT", "M
51f0: 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22  ATCH", "NATURAL"
5200: 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22  , "NO", "NOT", "
5210: 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e  NOTNULL",.    "N
5220: 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46  ULL", "OF", "OFF
5230: 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22  SET", "ON", "OR"
5240: 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45  , "ORDER", "OUTE
5250: 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41  R", "PLAN", "PRA
5260: 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41  GMA",.    "PRIMA
5270: 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52  RY", "QUERY", "R
5280: 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49 56  AISE", "RECURSIV
5290: 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22  E", "REFERENCES"
52a0: 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20  , "REGEXP",.    
52b0: 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45  "REINDEX", "RELE
52c0: 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20  ASE", "RENAME", 
52d0: 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54  "REPLACE", "REST
52e0: 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a  RICT", "RIGHT",.
52f0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20      "ROLLBACK", 
5300: 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e  "ROW", "SAVEPOIN
5310: 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53  T", "SELECT", "S
5320: 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54  ET", "TABLE", "T
5330: 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f  EMP",.    "TEMPO
5340: 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22  RARY", "THEN", "
5350: 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f  TO", "TRANSACTIO
5360: 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22  N", "TRIGGER", "
5370: 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22  UNION", "UNIQUE"
5380: 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c 20  ,.    "UPDATE", 
5390: 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d  "USING", "VACUUM
53a0: 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49  ", "VALUES", "VI
53b0: 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20  EW", "VIRTUAL", 
53c0: 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c  "WHEN", "WHERE",
53d0: 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57 49  .    "WITH", "WI
53e0: 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69  THOUT",.  };.  i
53f0: 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20  nt i, lwr, upr, 
5400: 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21 69  mid, c;.  if( !i
5410: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5420: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
5430: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
5440: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5450: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
5460: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
5470: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
5480: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
5490: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
54a0: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
54b0: 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30  ';.  }.  lwr = 0
54c0: 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66  ;.  upr = sizeof
54d0: 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a  (azKeywords)/siz
54e0: 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30  eof(azKeywords[0
54f0: 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ]) - 1;.  while(
5500: 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
5510: 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29   mid = (lwr+upr)
5520: 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  /2;.    c = sqli
5530: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65  te3_stricmp(azKe
5540: 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61  ywords[mid], zNa
5550: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  me);.    if( c==
5560: 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  0 ) return '"';.
5570: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
5580: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31       lwr = mid+1
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
55a0: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a     upr = mid-1;.
55b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
55d0: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
55e0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
55f0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5600: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5610: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
5620: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
5630: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
5640: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
5650: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
5660: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
5670: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
56a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
56b0: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
56c0: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
56d0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
56e0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
56f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5700: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5710: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5720: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
5730: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
5740: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
5750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5760: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
5770: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5780: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5790: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
57a0: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
57b0: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
57c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
57d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
57e0: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
57f0: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
5820: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
5830: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
5840: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
5850: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5860: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
5870: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5880: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5890: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
58a0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
58b0: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
58c0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
58d0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
58e0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
58f0: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5900: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5910: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
5920: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
5930: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
5940: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
5950: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
5960: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
5970: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5980: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5990: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
59a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
59b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
59c0: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
59d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
59e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
59f0: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5a00: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5a10: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
5a20: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
5a30: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5a40: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
5a50: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
5a60: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
5a70: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5a80: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5a90: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5aa0: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5ab0: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5ac0: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5ad0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5ae0: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5af0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5b00: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5b10: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
5b20: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
5b30: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
5b40: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
5b50: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
5b60: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
5b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5b80: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5b90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5ba0: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5bb0: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5bc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5be0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5c00: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5c10: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
5c20: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
5c30: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5c40: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
5c50: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 55  , 0, zName);.  U
5c60: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
5c70: 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46 61  nVal);.  if( zFa
5c80: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5c90: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5ca0: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5cb0: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5cc0: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5cf0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
5d00: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5d10: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
5d20: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
5d30: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
5d40: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
5d50: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
5d60: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
5d70: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5d80: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5d90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5da0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5db0: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5dc0: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5dd0: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5de0: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5df0: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5e00: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5e10: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
5e20: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
5e30: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
5e40: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
5e50: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
5e60: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
5e70: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5e80: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5e90: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5ea0: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5eb0: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5ec0: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5ed0: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5ee0: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5ef0: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
5f00: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
5f10: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
5f20: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
5f30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5f40: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
5f50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
5f60: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
5f70: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5f80: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5f90: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5fa0: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5fb0: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5fc0: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5fd0: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5fe0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5ff0: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
6000: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6010: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
6020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
6030: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
6040: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6050: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
6060: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6070: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
6080: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6090: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
60a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
60b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
60c0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
60d0: 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  x);.  UNUSED_PAR
60e0: 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20  AMETER(nVal);.  
60f0: 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74  if( zIn!=0 && st
6100: 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41  rncmp(zIn, "CREA
6110: 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  TE ", 7)==0 ){. 
6120: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
6130: 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66  nt)(sizeof(aPref
6140: 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66  ix)/sizeof(aPref
6150: 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  ix[0])); i++){. 
6160: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
6170: 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d  len30(aPrefix[i]
6180: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
6190: 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65  ncmp(zIn+7, aPre
61a0: 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26  fix[i], n)==0 &&
61b0: 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29   zIn[n+7]==' ' )
61c0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
61d0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  z = 0;.        c
61e0: 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a  har *zFake = 0;.
61f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
6200: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
6210: 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20 71   char cQuote = q
6220: 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61  uoteChar(zSchema
6230: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6240: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
6250: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
6260: 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29 7b  ma,"temp")!=0 ){
6270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
6280: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6290: 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73  ("%.*s \"%w\".%s
62a0: 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63  ", n+7, zIn, zSc
62b0: 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a  hema, zIn+n+8);.
62c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
62d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
62e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
62f0: 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20 6e  ("%.*s %s.%s", n
6300: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
6310: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
6320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6330: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
6340: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ame.         && 
6350: 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27  aPrefix[i][0]=='
6360: 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  V'.         && (
6370: 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b  zFake = shellFak
6380: 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68  eSchema(db, zSch
6390: 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 0a  ema, zName))!=0.
63a0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
63b0: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
63c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
63d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
63e0: 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c  ("%s\n/* %s */",
63f0: 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20 20   zIn, zFake);.  
6400: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6410: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73             z = s
6420: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
6430: 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a  %z\n/* %s */", z
6440: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
6450: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6460: 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20 20  free(zFake);.   
6470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6480: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
6490: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
64a0: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
64b0: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
64c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
64d0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
64e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
64f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6500: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
6510: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
6520: 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   The source code
6530: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e   for several run
6540: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
6550: 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73  xtensions is ins
6560: 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62  erted.** below b
6570: 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b  y the ../tool/mk
6580: 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70  shellc.tcl scrip
6590: 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65  t.  Before proce
65a0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75  ssing that inclu
65b0: 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20  ded.** code, we 
65c0: 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65  need to override
65d0: 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20   some macros to 
65e0: 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65  make the include
65f0: 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a  d program code.*
6600: 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74  * work here in t
6610: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69  he middle of thi
6620: 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61  s regular progra
6630: 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  m..*/.#define SQ
6640: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6650: 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c  NIT1.#define SQL
6660: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
6670: 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58 29  IT2(X) (void)(X)
6680: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
6690: 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65 64  IN32) && defined
66a0: 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55  (_MSC_VER).INCLU
66b0: 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  DE test_windiren
66c0: 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73 74  t.h.INCLUDE test
66d0: 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64 65  _windirent.c.#de
66e0: 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45  fine dirent DIRE
66f0: 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44  NT.#endif.INCLUD
6700: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68  E ../ext/misc/sh
6710: 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45  athree.c.INCLUDE
6720: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c   ../ext/misc/fil
6730: 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e  eio.c.INCLUDE ..
6740: 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65  /ext/misc/comple
6750: 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  tion.c.INCLUDE .
6760: 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65 6e  ./ext/misc/appen
6770: 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53 51  dvfs.c.#ifdef SQ
6780: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6790: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
67a0: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
67b0: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
67c0: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
67d0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
67e0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
67f0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
6800: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6810: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
6820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6830: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
6840: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
6850: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
6860: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
6870: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6880: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6890: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
68a0: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
68b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68d0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
68e0: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
68f0: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
6920: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6930: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
6940: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
6950: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6960: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
6970: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6980: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6990: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
69a0: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
69b0: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
69c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
69d0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
69e0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
69f0: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
6a00: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
6a10: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
6a20: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
6a30: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
6a40: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
6a50: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
6a60: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
6a70: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6a80: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6a90: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6aa0: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6ab0: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6ac0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
6ad0: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
6ae0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6af0: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6b00: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
6b10: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
6b20: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6b30: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
6b40: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
6b50: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
6b60: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6b70: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6b80: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6b90: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6ba0: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6bb0: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6bc0: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
6bd0: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
6be0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74  ;.};../*.** Stat
6bf0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
6c00: 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65  out the database
6c10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
6c20: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a  ontained in an.*
6c30: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
6c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6c50: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
6c60: 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74  f struct ShellSt
6c70: 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b 0a  ate ShellState;.
6c80: 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74  struct ShellStat
6c90: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e {.  sqlite3 *d
6ca0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
6cb0: 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  The database */.
6cc0: 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69 6e    u8 autoExplain
6cd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f  ;        /* Auto
6ce0: 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20 6f  matically turn o
6cf0: 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  n .explain mode 
6d00: 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 3b  */.  u8 autoEQP;
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6d20: 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  un EXPLAIN QUERY
6d30: 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20 73   PLAN prior to s
6d40: 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f  each SQL stmt */
6d50: 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20  .  u8 statsOn;  
6d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6d70: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d  e to display mem
6d80: 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
6d90: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6da0: 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74 73  /.  u8 scanstats
6db0: 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  On;        /* Tr
6dc0: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63  ue to display sc
6dd0: 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  an stats before 
6de0: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
6df0: 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20  .  u8 openMode; 
6e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45            /* SHE
6e10: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20  LL_OPEN_NORMAL, 
6e20: 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f  _APPENDVFS, or _
6e30: 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20  ZIPFILE */.  u8 
6e40: 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20  doXdgOpen;      
6e50: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74      /* Invoke st
6e60: 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
6e70: 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65  n in output_rese
6e80: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74  t() */.  int out
6e90: 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
6ea0: 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64  /* Revert to std
6eb0: 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e  out when reachin
6ec0: 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  g zero */.  int 
6ed0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
6ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ef0: 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65  records displaye
6f00: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49  d so far */.  FI
6f10: 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20  LE *out;        
6f20: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
6f30: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
6f40: 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b 20  FILE *traceOut; 
6f50: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6f60: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74 72 61   for sqlite3_tra
6f70: 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ce() */.  int nE
6f80: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
6f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
6fa0: 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  rors seen */.  i
6fb0: 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20  nt mode;        
6fc0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70        /* An outp
6fd0: 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20  ut mode setting 
6fe0: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 50 72 69  */.  int modePri
6ff0: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  or;         /* S
7000: 61 76 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  aved mode */.  i
7010: 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt cMode;       
7020: 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61        /* tempora
7030: 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 66  ry output mode f
7040: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  or the current q
7050: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  uery */.  int no
7060: 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rmalMode;       
7070: 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65 20   /* Output mode 
7080: 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e  before ".explain
7090: 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77 72   on" */.  int wr
70a0: 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20  itableSchema;   
70b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47   /* True if PRAG
70c0: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
70d0: 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73  ma=ON */.  int s
70e0: 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20  howHeader;      
70f0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f    /* True to sho
7100: 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  w column names i
7110: 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e  n List or Column
7120: 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   mode */.  int n
7130: 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20 20  Check;          
7140: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22    /* Number of "
7150: 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 73  .check" commands
7160: 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   run */.  unsign
7170: 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20  ed shellFlgs;   
7180: 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
7190: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  s */.  char *zDe
71a0: 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a  stTable;      /*
71b0: 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61   Name of destina
71c0: 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20  tion table when 
71d0: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20  MODE_Insert */. 
71e0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65   char *zTempFile
71f0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f  ;       /* Tempo
7200: 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20 6d  rary file that m
7210: 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74 69  ight need deleti
7220: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65  ng */.  char zTe
7230: 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f  stcase[30];    /
7240: 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e  * Name of curren
7250: 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20  t test case */. 
7260: 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74   char colSeparat
7270: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d  or[20]; /* Colum
7280: 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  n separator char
7290: 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61  acter for severa
72a0: 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61  l modes */.  cha
72b0: 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32  r rowSeparator[2
72c0: 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72  0]; /* Row separ
72d0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66  ator character f
72e0: 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f  or MODE_Ascii */
72f0: 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50 72  .  char colSepPr
7300: 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76  ior[20];  /* Sav
7310: 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ed column separa
7320: 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f  tor */.  char ro
7330: 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20  wSepPrior[20];  
7340: 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65 70  /* Saved row sep
7350: 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  arator */.  int 
7360: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  colWidth[100];  
7370: 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20     /* Requested 
7380: 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f  width of each co
7390: 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c  lumn when in col
73a0: 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74  umn mode*/.  int
73b0: 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30   actualWidth[100
73c0: 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69  ];  /* Actual wi
73d0: 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  dth of each colu
73e0: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c  mn */.  char nul
73f0: 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f  lValue[20];    /
7400: 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72  * The text to pr
7410: 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  int when a NULL 
7420: 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a  comes back from.
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
7450: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
7460: 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e  ar outfile[FILEN
7470: 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c  AME_MAX]; /* Fil
7480: 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a  ename for *out *
7490: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
74a0: 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  zDbFilename;    
74b0: 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
74c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
74d0: 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43    char *zFreeOnC
74e0: 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  lose;         /*
74f0: 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65   Filename to fre
7500: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
7510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7520: 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  zVfs;           
7530: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74  /* Name of VFS t
7540: 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  o use */.  sqlit
7550: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
7560: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
7570: 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a  tement if any. *
7580: 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20  /.  FILE *pLog; 
7590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
75a0: 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68  ite log output h
75b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ere */.  int *ai
75c0: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
75d0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65  /* Array of inde
75e0: 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45  nts used in MODE
75f0: 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e  _Explain */.  in
7600: 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20  t nIndent;      
7610: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7620: 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d  array aiIndent[]
7630: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e   */.  int iInden
7640: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
7650: 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
7660: 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b   op in aiIndent[
7670: 5d 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ] */.#if defined
7680: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
7690: 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53  ESSION).  int nS
76a0: 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ession;         
76b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
76c0: 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73   active sessions
76d0: 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f   */.  OpenSessio
76e0: 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20  n aSession[4];  
76f0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73  /* Array of sess
7700: 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e  ions.  [0] is in
7710: 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69   focus. */.#endi
7720: 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65  f.  ExpertInfo e
7730: 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a  xpert;        /*
7740: 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f   Valid if previo
7750: 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22  us command was "
7760: 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20  .expert OPT..." 
7770: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77  */.};.../* Allow
7780: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
7790: 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50  ellState.autoEQP
77a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f  .*/.#define AUTO
77b0: 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 0a 23  EQP_off      0.#
77c0: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f  define AUTOEQP_o
77d0: 6e 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  n       1.#defin
77e0: 65 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  e AUTOEQP_trigge
77f0: 72 20 20 32 0a 23 64 65 66 69 6e 65 20 41 55 54  r  2.#define AUT
7800: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 0a  OEQP_full     3.
7810: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
7820: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
7830: 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64  e.openMode.*/.#d
7840: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7850: 5f 55 4e 53 50 45 43 20 20 20 20 20 30 20 20 20  _UNSPEC     0   
7860: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
7870: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
7880: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7890: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 31 20  EN_NORMAL     1 
78a0: 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64       /* Normal d
78b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
78c0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
78d0: 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 32 20  EN_APPENDVFS  2 
78e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
78f0: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7900: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7910: 49 4c 45 20 20 20 20 33 20 20 20 20 20 20 2f 2a  ILE    3      /*
7920: 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c 65   Use the zipfile
7930: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
7940: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  /../*.** These a
7950: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73  re the allowed s
7960: 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a  hellFlgs values.
7970: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7980: 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20  _Pagecache      
7990: 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68  0x00000001 /* Th
79a0: 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70  e --pagecache op
79b0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
79c0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f  #define SHFLG_Lo
79d0: 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30  okaside      0x0
79e0: 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61  0000002 /* Looka
79f0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
7a00: 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  sed */.#define S
7a10: 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20  HFLG_Backslash  
7a20: 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f      0x00000004 /
7a30: 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73  * The --backslas
7a40: 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  h option is used
7a50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7a60: 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20  G_PreserveRowid 
7a70: 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e   0x00000008 /* .
7a80: 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72  dump preserves r
7a90: 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23  owid values */.#
7aa0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77  define SHFLG_New
7ab0: 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30  lines       0x00
7ac0: 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20  000010 /* .dump 
7ad0: 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a  --newline flag *
7ae0: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7af0: 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30  CountChanges   0
7b00: 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68  x00000020 /* .ch
7b10: 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f  anges setting */
7b20: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45  .#define SHFLG_E
7b30: 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78  cho           0x
7b40: 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68  00000040 /* .ech
7b50: 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74  o or --echo sett
7b60: 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ing */../*.** Ma
7b70: 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67  cros for testing
7b80: 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65   and setting she
7b90: 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  llFlgs.*/.#defin
7ba0: 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50  e ShellHasFlag(P
7bb0: 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68  ,X)    (((P)->sh
7bc0: 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d  ellFlgs & (X))!=
7bd0: 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  0).#define Shell
7be0: 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20  SetFlag(P,X)    
7bf0: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c  ((P)->shellFlgs|
7c00: 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68  =(X)).#define Sh
7c10: 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58  ellClearFlag(P,X
7c20: 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c  )  ((P)->shellFl
7c30: 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a  gs&=(~(X)))../*.
7c40: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
7c50: 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a   allowed modes..
7c60: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7c70: 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f  Line     0  /* O
7c80: 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69  ne column per li
7c90: 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20  ne.  Blank line 
7ca0: 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20  between records 
7cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7cc0: 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f  Column   1  /* O
7cd0: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7ce0: 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d  ne in neat colum
7cf0: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ns */.#define MO
7d00: 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f  DE_List     2  /
7d10: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
7d20: 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70   line with a sep
7d30: 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e  arator */.#defin
7d40: 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20  e MODE_Semi     
7d50: 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f  3  /* Same as MO
7d60: 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65  DE_List but appe
7d70: 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c  nd ";" to each l
7d80: 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ine */.#define M
7d90: 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20  ODE_Html     4  
7da0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58  /* Generate an X
7db0: 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64  HTML table */.#d
7dc0: 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72  efine MODE_Inser
7dd0: 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61  t   5  /* Genera
7de0: 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20  te SQL "insert" 
7df0: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64  statements */.#d
7e00: 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65  efine MODE_Quote
7e10: 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20      6  /* Quote 
7e20: 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51  values as for SQ
7e30: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  L */.#define MOD
7e40: 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a  E_Tcl      7  /*
7e50: 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43   Generate ANSI-C
7e60: 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65   or TCL quoted e
7e70: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  lements */.#defi
7e80: 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20  ne MODE_Csv     
7e90: 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72   8  /* Quote str
7ea0: 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72  ings, numbers ar
7eb0: 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69  e plain */.#defi
7ec0: 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  ne MODE_Explain 
7ed0: 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45   9  /* Like MODE
7ee0: 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20  _Column, but do 
7ef0: 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74  not truncate dat
7f00: 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  a */.#define MOD
7f10: 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a  E_Ascii   10  /*
7f20: 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20   Use ASCII unit 
7f30: 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72  and record separ
7f40: 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45  ators (0x1F/0x1E
7f50: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  ) */.#define MOD
7f60: 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a  E_Pretty  11  /*
7f70: 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63   Pretty-print sc
7f80: 68 65 6d 61 73 20 2a 2f 0a 0a 73 74 61 74 69 63  hemas */..static
7f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
7fa0: 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22  eDescr[] = {.  "
7fb0: 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e  line",.  "column
7fc0: 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22  ",.  "list",.  "
7fd0: 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c  semi",.  "html",
7fe0: 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22  .  "insert",.  "
7ff0: 71 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c  quote",.  "tcl",
8000: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
8010: 6c 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22  lain",.  "ascii"
8020: 2c 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74  ,.  "prettyprint
8030: 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ",.};../*.** The
8040: 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75 6d  se are the colum
8050: 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61 72  n/row/line separ
8060: 61 74 6f 72 73 20 75 73 65 64 20 62 79 20 74 68  ators used by th
8070: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d 70  e various.** imp
8080: 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65 73  ort/export modes
8090: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45 50  ..*/.#define SEP
80a0: 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a 23  _Column    "|".#
80b0: 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20 20  define SEP_Row  
80c0: 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69 6e       "\n".#defin
80d0: 65 20 53 45 50 5f 54 61 62 20 20 20 20 20 20 20  e SEP_Tab       
80e0: 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45 50  "\t".#define SEP
80f0: 5f 53 70 61 63 65 20 20 20 20 20 22 20 22 0a 23  _Space     " ".#
8100: 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d 61  define SEP_Comma
8110: 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e 65       ",".#define
8120: 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20 22   SEP_CrLf      "
8130: 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45  \r\n".#define SE
8140: 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78 31  P_Unit      "\x1
8150: 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  F".#define SEP_R
8160: 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22 0a  ecord    "\x1E".
8170: 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62 61 63  ./*.** A callbac
8180: 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
8190: 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66 61 63  3_log() interfac
81a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
81b0: 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69 64 20  d shellLog(void 
81c0: 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72 43  *pArg, int iErrC
81d0: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
81e0: 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c 6c 53  *zMsg){.  ShellS
81f0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
8200: 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20 69  State*)pArg;.  i
8210: 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20  f( p->pLog==0 ) 
8220: 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38 5f 70  return;.  utf8_p
8230: 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20 22  rintf(p->pLog, "
8240: 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72 72  (%d) %s\n", iErr
8250: 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20 66  Code, zMsg);.  f
8260: 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a  flush(p->pLog);.
8270: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
8280: 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 70 75  ction:  shell_pu
8290: 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20 57 72  tsnl(X).**.** Wr
82a0: 69 74 65 20 74 68 65 20 74 65 78 74 20 58 20 74  ite the text X t
82b0: 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28 6f 72  o the screen (or
82c0: 20 77 68 61 74 65 76 65 72 20 6f 75 74 70 75 74   whatever output
82d0: 20 69 73 20 62 65 69 6e 67 20 64 69 72 65 63 74   is being direct
82e0: 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20 61 20  ed).** adding a 
82f0: 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65 20 65  newline at the e
8300: 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72 65 74  nd, and then ret
8310: 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn X..*/.static
8320: 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74 73 46   void shellPutsF
8330: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
8340: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
8350: 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69  int nVal,.  sqli
8360: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
8370: 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  l.){.  ShellStat
8380: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
8390: 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  te*)sqlite3_user
83a0: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 28  _data(pCtx);.  (
83b0: 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75 74 66  void)nVal;.  utf
83c0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
83d0: 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
83e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
83f0: 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65  l[0]));.  sqlite
8400: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
8410: 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a  Ctx, apVal[0]);.
8420: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
8430: 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28 56 41  ction:   edit(VA
8440: 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  LUE).**         
8450: 20 20 20 20 20 20 20 20 65 64 69 74 28 56 41 4c          edit(VAL
8460: 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a 2a 2a  UE,EDITOR).**.**
8470: 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a 2a 2a   These steps:.**
8480: 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72 69 74  .**     (1) Writ
8490: 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61 20 74  e VALUE into a t
84a0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
84b0: 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20 70 72  *     (2) Run pr
84c0: 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f 6e 20  ogram EDITOR on 
84d0: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 66  that temporary f
84e0: 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  ile..**     (3) 
84f0: 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f 72 61  Read the tempora
8500: 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61 6e 64  ry file back and
8510: 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f 6e 74   return its cont
8520: 65 6e 74 20 61 73 20 74 68 65 20 72 65 73 75 6c  ent as the resul
8530: 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 44 65  t..**     (4) De
8540: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
8550: 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 49 66  ry file.**.** If
8560: 20 74 68 65 20 45 44 49 54 4f 52 20 61 72 67 75   the EDITOR argu
8570: 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 2c  ment is omitted,
8580: 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69   use the value i
8590: 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a 2a 20  n the VISUAL.** 
85a0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
85b0: 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c 6c 20  able.  If still 
85c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44 49 54  there is no EDIT
85d0: 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e 20 65  OR, through an e
85e0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rror..**.** Also
85f0: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   throw an error 
8600: 69 66 20 74 68 65 20 45 44 49 54 4f 52 20 70 72  if the EDITOR pr
8610: 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20 61 20  ogram returns a 
8620: 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20 63 6f  non-zero exit co
8630: 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  de..*/.#ifndef S
8640: 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
8650: 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TEM.static void 
8660: 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  editFunc(.  sqli
8670: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8680: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
8690: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
86a0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
86b0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69 74 6f  nst char *zEdito
86c0: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  r;.  char *zTemp
86d0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
86e0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
86f0: 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e 74  *zCmd = 0;.  int
8700: 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72 63 3b   bBin;.  int rc;
8710: 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 30 3b 0a  .  FILE *f = 0;.
8720: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
8730: 73 7a 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  sz;.  sqlite3_in
8740: 74 36 34 20 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t64 x;.  unsigne
8750: 64 20 63 68 61 72 20 2a 70 20 3d 20 30 3b 0a 0a  d char *p = 0;..
8760: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
8770: 0a 20 20 20 20 7a 45 64 69 74 6f 72 20 3d 20 28  .    zEditor = (
8780: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
8790: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
87a0: 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65  rgv[1]);.  }else
87b0: 7b 0a 20 20 20 20 7a 45 64 69 74 6f 72 20 3d 20  {.    zEditor = 
87c0: 67 65 74 65 6e 76 28 22 56 49 53 55 41 4c 22 29  getenv("VISUAL")
87d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 45 64 69  ;.  }.  if( zEdi
87e0: 74 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tor==0 ){.    sq
87f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8800: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 20  or(context, "no 
8810: 65 64 69 74 6f 72 20 66 6f 72 20 65 64 69 74 28  editor for edit(
8820: 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  )", -1);.    ret
8830: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  urn;.  }.  if( s
8840: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8850: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8860: 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  TE_NULL ){.    s
8870: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8880: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55  ror(context, "NU
8890: 4c 4c 20 69 6e 70 75 74 20 74 6f 20 65 64 69 74  LL input to edit
88a0: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ()", -1);.    re
88b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  turn;.  }.  db =
88c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
88d0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
88e0: 78 74 29 3b 0a 20 20 7a 54 65 6d 70 46 69 6c 65  xt);.  zTempFile
88f0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
8900: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
8910: 20 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   0, SQLITE_FCNTL
8920: 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26  _TEMPFILENAME, &
8930: 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  zTempFile);.  if
8940: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69  {.    sqlite3_ui
8960: 6e 74 36 34 20 72 20 3d 20 30 3b 0a 20 20 20 20  nt64 r = 0;.    
8970: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
8980: 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
8990: 29 3b 0a 20 20 20 20 7a 54 65 6d 70 46 69 6c 65  );.    zTempFile
89a0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
89b0: 74 66 28 22 74 65 6d 70 25 6c 6c 78 22 2c 20 72  tf("temp%llx", r
89c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
89d0: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
89e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
89f0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
8a00: 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ext);.      retu
8a10: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
8a20: 62 42 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  bBin = sqlite3_v
8a30: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
8a40: 5d 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 3b  ])==SQLITE_BLOB;
8a50: 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65  .  f = fopen(zTe
8a60: 6d 70 46 69 6c 65 2c 20 62 42 69 6e 20 3f 20 22  mpFile, bBin ? "
8a70: 77 62 22 20 3a 20 22 77 22 29 3b 0a 20 20 69 66  wb" : "w");.  if
8a80: 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( f==0 ){.    sq
8a90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8aa0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69  or(context, "edi
8ab0: 74 28 29 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  t() cannot open 
8ac0: 74 65 6d 70 20 66 69 6c 65 22 2c 20 2d 31 29 3b  temp file", -1);
8ad0: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8ae0: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 73  unc_end;.  }.  s
8af0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
8b00: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
8b10: 3b 0a 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a  ;.  if( bBin ){.
8b20: 20 20 20 20 78 20 3d 20 66 77 72 69 74 65 28 73      x = fwrite(s
8b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
8b40: 62 28 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73  b(argv[0]), 1, s
8b50: 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  z, f);.  }else{.
8b60: 20 20 20 20 78 20 3d 20 66 77 72 69 74 65 28 73      x = fwrite(s
8b70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8b80: 74 28 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73  t(argv[0]), 1, s
8b90: 7a 2c 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  z, f);.  }.  fcl
8ba0: 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b  ose(f);.  f = 0;
8bb0: 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a  .  if( x!=sz ){.
8bc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8bd0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8be0: 2c 20 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20  , "edit() could 
8bf0: 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 77 68  not write the wh
8c00: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -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 7a 43  nc_end;.  }.  zC
8c30: 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
8c40: 69 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22  intf("%s \"%s\""
8c50: 2c 20 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70  , zEditor, zTemp
8c60: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d  File);.  if( zCm
8c70: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
8c80: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8c90: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8ca0: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8cb0: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72  unc_end;.  }.  r
8cc0: 63 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29  c = system(zCmd)
8cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8ce0: 28 7a 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63  (zCmd);.  if( rc
8cf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8d00: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8d10: 74 65 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65  text, "EDITOR re
8d20: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22  turned non-zero"
8d30: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
8d40: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
8d50: 20 7d 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a   }.  f = fopen(z
8d60: 54 65 6d 70 46 69 6c 65 2c 20 62 42 69 6e 20 3f  TempFile, bBin ?
8d70: 20 22 72 62 22 20 3a 20 22 72 22 29 3b 0a 20 20   "rb" : "r");.  
8d80: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
8d90: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8da0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
8db0: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
8dc0: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
8dd0: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
8de0: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
8df0: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
8e00: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
8e10: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
8e20: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
8e30: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
8e40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
8e50: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
8e60: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
8e70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8e80: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
8e90: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
8ea0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
8eb0: 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e 20 29    }.  if( bBin )
8ec0: 7b 0a 20 20 20 20 78 20 3d 20 66 72 65 61 64 28  {.    x = fread(
8ed0: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
8ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 78 20 3d 20 66  }else{.    x = f
8ef0: 72 65 61 64 28 70 2c 20 31 2c 20 73 7a 2c 20 66  read(p, 1, sz, f
8f00: 29 3b 0a 20 20 20 20 70 5b 73 7a 5d 20 3d 20 30  );.    p[sz] = 0
8f10: 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
8f20: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
8f30: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
8f40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8f50: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f  ror(context, "co
8f60: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 62 61 63  uld not read bac
8f70: 6b 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  k the whole file
8f80: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
8f90: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
8fa0: 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e 20 29    }.  if( bBin )
8fb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8fc0: 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74  sult_blob64(cont
8fd0: 65 78 74 2c 20 70 2c 20 73 7a 2c 20 73 71 6c 69  ext, p, sz, sqli
8fe0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c  te3_free);.  }el
8ff0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
9000: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
9010: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
9020: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9050: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
9060: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
9070: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
9080: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
9090: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
90a0: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
90b0: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
90c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
90d0: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
90e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
90f0: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
9100: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
9110: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
9120: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
9130: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
9140: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
9150: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
9160: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
9170: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9180: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
9190: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
91a0: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
91b0: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
91c0: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
91d0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
91e0: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
91f0: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
9200: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
9210: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
9220: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
9230: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
9240: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
9250: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
9260: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9270: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9280: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9290: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
92a0: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
92b0: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
92c0: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
92d0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
92e0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
92f0: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9300: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
9310: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9320: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
9330: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
9340: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
9350: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
9360: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
9370: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
9380: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9390: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
93a0: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
93b0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
93c0: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
93d0: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
93e0: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
93f0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9400: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
9410: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
9420: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
9430: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9440: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
9450: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
9460: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
9470: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
9480: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
9490: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
94a0: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
94b0: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
94c0: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
94d0: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
94e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
94f0: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
9530: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
9540: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
9550: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
9560: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
9570: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
9580: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
9590: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
95a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
95b0: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
95c0: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
95d0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
95e0: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
95f0: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9600: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
9610: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
9620: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
9630: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
9640: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
9650: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
9660: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
9670: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
9680: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
9690: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
96a0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
96b0: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
96c0: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
96d0: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
96e0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
96f0: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9700: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9710: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9720: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9730: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9740: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9750: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9760: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9770: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9780: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9790: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
97a0: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
97b0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
97c0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
97d0: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
97e0: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
97f0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9800: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9810: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9820: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9830: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9840: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9850: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
9860: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
9870: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9880: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
9890: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
98a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
98b0: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
98c0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
98d0: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
98e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
98f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
9900: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
9910: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9920: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
9930: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9940: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
9950: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
9960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9970: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9980: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
9990: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
99a0: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
99b0: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
99c0: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
99d0: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
99e0: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
99f0: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
9a00: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
9a10: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
9a20: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
9a30: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
9a40: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
9a50: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
9a60: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
9a70: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
9a80: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
9a90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
9aa0: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
9ab0: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
9ac0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9ad0: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
9ae0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9af0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9b00: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9b10: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9b20: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9b30: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9b40: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
9b50: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
9b60: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
9b70: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
9b80: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
9b90: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
9ba0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9bb0: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
9bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
9bd0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
9be0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
9bf0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
9c00: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
9c10: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
9c20: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
9c30: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
9c40: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
9c50: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
9c60: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
9c70: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
9c80: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9c90: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
9ca0: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
9cb0: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
9cc0: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
9cd0: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
9ce0: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
9cf0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9d00: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
9d10: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
9d20: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
9d30: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
9d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
9d50: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
9d60: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
9d70: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
9d80: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
9d90: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
9da0: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
9db0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
9dc0: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
9dd0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
9de0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
9df0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
9e00: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
9e10: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
9e20: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
9e30: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
9e40: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9e50: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
9e60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9e70: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
9e80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
9ea0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
9eb0: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
9ec0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9ed0: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
9ee0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
9f00: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
9f10: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
9f20: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9f30: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
9f40: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
9f50: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
9f60: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
9f70: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
9f80: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
9f90: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9fa0: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
9fb0: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
9fc0: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
9fd0: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
9fe0: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
9ff0: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a000: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a010: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a020: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a030: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a040: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a050: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a060: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a070: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a080: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a090: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a0a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a0b0: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a0c0: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a0d0: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a0e0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a0f0: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a100: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a110: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a120: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a130: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a140: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a150: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a160: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a170: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a180: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a190: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a1a0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a1b0: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a1c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a1d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a1e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a1f0: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a200: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a210: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a220: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a230: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
a240: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
a250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a260: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
a270: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
a280: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
a290: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a2a0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
a2b0: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
a2c0: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
a2d0: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
a2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a2f0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
a300: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a320: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
a330: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
a340: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a350: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
a360: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
a370: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
a380: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
a390: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
a3a0: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
a3b0: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
a3c0: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
a3d0: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
a3e0: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
a3f0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
a400: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
a410: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
a420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
a430: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
a440: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a450: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
a460: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
a470: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a480: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
a490: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
a4a0: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
a4b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a4c0: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
a4d0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
a4e0: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
a4f0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
a500: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
a510: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
a520: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a530: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
a540: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
a550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a560: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
a570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
a580: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
a590: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
a5a0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
a5b0: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
a5c0: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
a5d0: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
a5e0: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
a5f0: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
a600: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
a610: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
a620: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a630: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a640: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a650: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a660: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a670: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a680: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
a690: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
a6a0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a6b0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
a6c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a6d0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a6e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a6f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a700: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
a710: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a720: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a730: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a740: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a750: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a760: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a770: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a780: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
a790: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a7a0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a7b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
a7c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a7d0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a7e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a7f0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a800: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a810: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a820: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a830: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a840: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a850: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a860: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a870: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a880: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a890: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a8a0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a8b0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a8c0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a8d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a8e0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a8f0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a900: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a910: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a920: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a930: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a940: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a950: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
a960: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
a970: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
a980: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
a990: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
a9a0: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
a9b0: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
a9c0: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
a9d0: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
a9e0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
a9f0: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
aa00: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
aa10: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
aa20: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
aa30: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
aa40: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
aa50: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
aa60: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
aa70: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
aa80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
aa90: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
aaa0: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
aab0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
aac0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
aad0: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
aae0: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
aaf0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
ab00: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
ab10: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
ab20: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
ab30: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
ab40: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
ab50: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
ab60: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
ab70: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
ab80: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
ab90: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
aba0: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
abb0: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
abc0: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
abd0: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
abe0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
abf0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ac00: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
ac10: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
ac20: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
ac30: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
ac40: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
ac50: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
ac60: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
ac70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ac80: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
ac90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
aca0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
acb0: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
acc0: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
acd0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ace0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
acf0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
ad00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
ad10: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
ad20: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
ad30: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
ad40: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
ad50: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
ad60: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
ad70: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
ad80: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
ad90: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
ada0: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
adb0: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
adc0: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
add0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
ade0: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
adf0: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
ae00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
ae10: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
ae20: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
ae30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
ae40: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
ae50: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
ae60: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
ae70: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
ae80: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
ae90: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
aea0: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
aeb0: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
aec0: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
aed0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
aee0: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
aef0: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
af00: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
af10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
af20: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
af30: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
af40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
af50: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
af60: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
af70: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
af80: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
af90: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
afa0: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
afb0: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
afc0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
afd0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
afe0: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
aff0: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b000: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b010: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b030: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b040: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b050: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b060: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b070: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b080: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b090: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b0a0: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b0b0: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b0c0: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b0d0: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b0e0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b0f0: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b100: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b110: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b120: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b130: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b140: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b150: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b160: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b170: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b180: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b190: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b1a0: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b1b0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b1c0: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b1d0: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b1e0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b1f0: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b200: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b210: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b220: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b230: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b240: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
b250: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
b260: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
b270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b280: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
b290: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
b2a0: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
b2b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b2c0: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
b2d0: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
b2e0: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
b2f0: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b300: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
b310: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
b320: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
b330: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
b340: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
b350: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
b370: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
b380: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
b390: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
b3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
b3b0: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
b3c0: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
b3d0: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
b3e0: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
b3f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b400: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
b410: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
b420: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
b430: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
b440: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
b450: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
b460: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
b470: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
b480: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
b490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b4b0: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
b4c0: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
b4d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
b4e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b4f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
b500: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
b510: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
b520: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
b530: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
b540: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
b550: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
b560: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
b570: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b580: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
b590: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
b5a0: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
b5b0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
b5c0: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
b5d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b5e0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
b5f0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
b600: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
b610: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
b620: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
b630: 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42  glob("CREATE TAB
b640: 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d  LE ['\"]*", z)==
b650: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
b660: 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54  intf(out, "CREAT
b670: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
b680: 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31  XISTS %s%s", z+1
b690: 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c  3, zTail);.  }el
b6a0: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
b6b0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c  ntf(out, "%s%s",
b6c0: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a   z, zTail);.  }.
b6d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  }.static void pr
b6e0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46  intSchemaLineN(F
b6f0: 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a  ILE *out, char *
b700: 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  z, int n, const 
b710: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
b720: 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20  char c = z[n];. 
b730: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69   z[n] = 0;.  pri
b740: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74  ntSchemaLine(out
b750: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a  , z, zTail);.  z
b760: 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  [n] = c;.}../*.*
b770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
b780: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20   string z[] has 
b790: 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74  nothing but whit
b7a0: 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65  espace and comme
b7b0: 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  nts to the.** en
b7c0: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  d of the first l
b7d0: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
b7e0: 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74  nt wsToEol(const
b7f0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
b800: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   i;.  for(i=0; z
b810: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
b820: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
b830: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
b840: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20  ( IsSpace(z[i]) 
b850: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b860: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26  if( z[i]=='-' &&
b870: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72   z[i+1]=='-' ) r
b880: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
b890: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
b8a0: 75 72 6e 20 31 3b 0a 7d 0a 20 20 20 20 0a 0a 2f  urn 1;.}.    ../
b8b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
b8c0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
b8d0: 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c  e that the shell
b8e0: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20  .** invokes for 
b8f0: 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75  each row of a qu
b900: 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ery result..*/.s
b910: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
b920: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
b930: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41   *pArg,.  int nA
b940: 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  rg,        /* Nu
b950: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
b960: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72  olumns */.  char
b970: 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20   **azArg,    /* 
b980: 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73  Text of each res
b990: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
b9a0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20  char **azCol,   
b9b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
b9c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70   */.  int *aiTyp
b9d0: 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  e      /* Column
b9e0: 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   types */.){.  i
b9f0: 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61  nt i;.  ShellSta
ba00: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
ba10: 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66  ate*)pArg;..  if
ba20: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
ba30: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
ba40: 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20   p->cMode ){.   
ba50: 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a   case MODE_Line:
ba60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d   {.      int w =
ba70: 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a   5;.      if( az
ba80: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
ba90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
baa0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bab0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73       int len = s
bac0: 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
bad0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
bae0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
baf0: 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a  en>w ) w = len;.
bb00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
bb10: 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75  ( p->cnt++>0 ) u
bb20: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bb30: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
bb40: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
bb50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
bb60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
bb70: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
bb80: 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c  ut,"%*s = %s%s",
bb90: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20   w, azCol[i],.  
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
bbb0: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
bbc0: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
bbd0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
bbe0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
bbf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bc00: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70     case MODE_Exp
bc10: 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d  lain:.    case M
bc20: 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20  ODE_Column: {.  
bc30: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
bc40: 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64   int aExplainWid
bc50: 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20  ths[] = {4, 13, 
bc60: 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20  4, 4, 4, 13, 2, 
bc70: 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  13};.      const
bc80: 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a   int *colWidth;.
bc90: 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64        int showHd
bca0: 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72  r;.      char *r
bcb0: 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28  owSep;.      if(
bcc0: 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f   p->cMode==MODE_
bcd0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
bce0: 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e    colWidth = p->
bcf0: 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20  colWidth;.      
bd00: 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73    showHdr = p->s
bd10: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
bd20: 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72     rowSep = p->r
bd30: 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20  owSeparator;.   
bd40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd50: 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78    colWidth = aEx
bd60: 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20  plainWidths;.   
bd70: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31       showHdr = 1
bd80: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
bd90: 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20   = SEP_Row;.    
bda0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
bdb0: 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20  >cnt++==0 ){.   
bdc0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bdd0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
bde0: 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a        int w, n;.
bdf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
be00: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
be10: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
be20: 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64        w = colWid
be30: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
be40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
be50: 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20      w = 0;.     
be60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
be70: 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20   if( w==0 ){.   
be80: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
be90: 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  lenChar(azCol[i]
bea0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
beb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
bec0: 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30  f( w<10 ) w = 10
bed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
bee0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  = strlenChar(azA
bef0: 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f  rg && azArg[i] ?
bf00: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
bf10: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
bf20: 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29         if( w<n )
bf30: 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20   w = n;.        
bf40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
bf50: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
bf60: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
bf70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
bf80: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d  actualWidth[i] =
bf90: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   w;.          }.
bfa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
bfb0: 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20  owHdr ){.       
bfc0: 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f       utf8_width_
bfd0: 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c  print(p->out, w,
bfe0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
bff0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
c000: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
c010: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
c020: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
c030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c040: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c050: 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20  showHdr ){.     
c060: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c070: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c080: 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20          int w;. 
c090: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
c0a0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
c0b0: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
c0d0: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
c0e0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
c0f0: 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d     if( w<0 ) w =
c100: 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -w;.           
c110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c120: 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20         w = 10;. 
c130: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c140: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
c150: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a  intf(p->out,"%-*
c160: 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20  .*s%s",w,w,.    
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20  ----------".    
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20  ----------",.   
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
c230: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
c240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c250: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c260: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
c280: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c290: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
c2a0: 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  w;.        if( i
c2b0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
c2c0: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
c2d0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
c2e0: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
c2f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c300: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
c310: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c320: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
c330: 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26  ==MODE_Explain &
c340: 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74  & azArg[i] && st
c350: 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69  rlenChar(azArg[i
c360: 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>w ){.        
c370: 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    w = strlenChar
c380: 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
c390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c3a0: 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49  ( i==1 && p->aiI
c3b0: 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d  ndent && p->pStm
c3c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
c3d0: 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d  f( p->iIndent<p-
c3e0: 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20  >nIndent ){.    
c3f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
c400: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e  ntf(p->out, "%*.
c410: 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b  s", p->aiIndent[
c420: 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29  p->iIndent], "")
c430: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c440: 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65          p->iInde
c450: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
c460: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
c470: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
c480: 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61   w, azArg[i] ? a
c490: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
c4a0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
c4b0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c4c0: 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41  out, "%s", i==nA
c4d0: 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20  rg-1 ? rowSep : 
c4e0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "  ");.      }. 
c4f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c500: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
c510: 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63  Semi: {   /* .sc
c520: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
c530: 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20  hema output */. 
c540: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
c550: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  Line(p->out, azA
c560: 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20  rg[0], ";\n");. 
c570: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c580: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
c590: 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73  Pretty: {  /* .s
c5a0: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
c5b0: 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64  chema with --ind
c5c0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ent */.      cha
c5d0: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  r *z;.      int 
c5e0: 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  j;.      int nPa
c5f0: 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ren = 0;.      c
c600: 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20  har cEnd = 0;.  
c610: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
c620: 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b    int nLine = 0;
c630: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
c640: 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
c650: 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20  if( azArg[0]==0 
c660: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
c670: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
c680: 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25  ke("CREATE VIEW%
c690: 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d  ", azArg[0], 0)=
c6a0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
c6b0: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52  ite3_strlike("CR
c6c0: 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41  EATE TRIG%", azA
c6d0: 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20  rg[0], 0)==0.   
c6e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74     ){.        ut
c6f0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c700: 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67  , "%s;\n", azArg
c710: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [0]);.        br
c720: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c730: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
c740: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41  printf("%s", azA
c750: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20  rg[0]);.      j 
c760: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
c770: 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d  =0; IsSpace(z[i]
c780: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
c790: 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  for(; (c = z[i])
c7a0: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
c7b0: 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63     if( IsSpace(c
c7c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
c7d0: 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20  f( z[j-1]=='\r' 
c7e0: 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b  ) z[j-1] = '\n';
c7f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
c800: 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c  sSpace(z[j-1]) |
c810: 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20  | z[j-1]=='(' ) 
c820: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c830: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
c840: 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26  '(' || c==')') &
c850: 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65  & j>0 && IsSpace
c860: 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20  (z[j-1]) ){.    
c870: 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
c880: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
c890: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
c8a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e  .      while( j>
c8b0: 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a  0 && IsSpace(z[j
c8c0: 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  -1]) ){ j--; }. 
c8d0: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20       z[j] = 0;. 
c8e0: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33       if( strlen3
c8f0: 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20  0(z)>=79 ){.    
c900: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28      for(i=j=0; (
c910: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
c920: 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61  +){  /* Copy cha
c930: 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62  nges from z[i] b
c940: 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20  ack to z[j] */. 
c950: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
c960: 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  cEnd ){.        
c970: 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20      cEnd = 0;.  
c980: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c990: 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27  ( c=='"' || c=='
c9a0: 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b  \'' || c=='`' ){
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
c9c0: 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  d = c;.         
c9d0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
c9e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
c9f0: 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20   cEnd = ']';.   
ca00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ca10: 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31   c=='-' && z[i+1
ca20: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
ca30: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e        cEnd = '\n
ca40: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ';.          }el
ca50: 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b  se if( c=='(' ){
ca60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61  .            nPa
ca70: 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ren++;.         
ca80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29   }else if( c==')
ca90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
caa0: 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20   nParen--;.     
cab0: 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65         if( nLine
cac0: 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20  >0 && nParen==0 
cad0: 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20  && j>0 ){.      
cae0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68          printSch
caf0: 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c  emaLineN(p->out,
cb00: 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20   z, j, "\n");.  
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20              j = 
cb20: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
cb30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cb40: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
cb50: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
cb60: 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45   nParen==1 && cE
cb70: 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  nd==0.          
cb80: 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63   && (c=='(' || c
cb90: 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c  =='\n' || (c==',
cba0: 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b  ' && !wsToEol(z+
cbb0: 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20 20  i+1))).         
cbc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cbd0: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d  if( c=='\n' ) j-
cbe0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  -;.            p
cbf0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
cc00: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
cc10: 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  n  ");.         
cc20: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
cc30: 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20        nLine++;. 
cc40: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
cc50: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d  ( IsSpace(z[i+1]
cc60: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
cc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cc80: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  }.        z[j] =
cc90: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
cca0: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
ccb0: 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c  e(p->out, z, ";\
ccc0: 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
ccd0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
cce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ccf0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73     case MODE_Lis
cd00: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
cd10: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
cd20: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
cd30: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
cd40: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
cd50: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
cd60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73  ntf(p->out,"%s%s
cd70: 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20  ",azCol[i],.    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d                i=
cd90: 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77  =nArg-1 ? p->row
cda0: 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63  Separator : p->c
cdb0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
cdc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cdd0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
cde0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
cdf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ce00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ce10: 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
ce20: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
ce30: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e   z==0 ) z = p->n
ce40: 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  ullValue;.      
ce50: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
ce60: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
ce70: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41          if( i<nA
ce80: 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rg-1 ){.        
ce90: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
cea0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
ceb0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
cec0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ced0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
cee0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
cef0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
cf00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cf10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
cf20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cf30: 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20   MODE_Html: {.  
cf40: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
cf50: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
cf60: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
cf70: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
cf80: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
cf90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
cfa0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
cfb0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
cfc0: 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20  ->out,"<TH>");. 
cfd0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
cfe0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
cff0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
d000: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
d010: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48  ntf(p->out,"</TH
d020: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  >\n");.        }
d030: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
d040: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
d050: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
d060: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
d070: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
d080: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d090: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
d0a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d0b0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d0c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d0d0: 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20  ut,"<TD>");.    
d0e0: 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f      output_html_
d0f0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
d100: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
d110: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
d120: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  e);.        raw_
d130: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
d140: 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TD>\n");.      
d150: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
d160: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
d170: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
d180: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d190: 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20  e MODE_Tcl: {.  
d1a0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
d1b0: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
d1c0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
d1d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
d1e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d1f0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
d200: 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d  (p->out,azCol[i]
d210: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
d220: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d230: 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70  i<nArg-1) utf8_p
d240: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d250: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
d260: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
d270: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d280: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d290: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
d2a0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
d2b0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
d2c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
d2d0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d2e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74  ++){.        out
d2f0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
d300: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
d310: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
d320: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
d330: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
d340: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d350: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
d360: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
d370: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
d380: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d390: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
d3a0: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
d3b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d3c0: 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20   MODE_Csv: {.   
d3d0: 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65     setBinaryMode
d3e0: 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
d3f0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
d400: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
d410: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
d420: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
d430: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d440: 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a  output_csv(p, az
d450: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
d460: 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31  ] : "", i<nArg-1
d470: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d480: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d490: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d4a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
d4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d4c0: 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  f( nArg>0 ){.   
d4d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d4e0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
d4f0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76        output_csv
d500: 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c  (p, azArg[i], i<
d510: 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nArg-1);.       
d520: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
d530: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
d540: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
d550: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
d560: 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
d570: 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
d580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d590: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e      case MODE_In
d5a0: 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  sert: {.      if
d5b0: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
d5c0: 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ak;.      utf8_p
d5d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e  rintf(p->out,"IN
d5e0: 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d  SERT INTO %s",p-
d5f0: 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zDestTable);.  
d600: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
d610: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
d620: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d630: 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20  ut,"(");.       
d640: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d660: 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f    if( i>0 ) raw_
d670: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
d680: 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,");.          i
d690: 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  f( quoteChar(azC
d6a0: 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[i]) ){.      
d6b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
d6c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
d6d0: 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b  "\"%w\"", azCol[
d6e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
d6f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d700: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
d710: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d720: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
d730: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d740: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
d750: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d760: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
d770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d780: 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
d790: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22  rintf(p->out,")"
d7a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d7b0: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
d7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d7d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d7e0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
d7f0: 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22  t, i>0 ? "," : "
d800: 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20   VALUES(");.    
d810: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
d820: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
d830: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
d840: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
d850: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d860: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c  intf(p->out,"NUL
d870: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  L");.        }el
d880: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
d890: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
d8a0: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
d8b0: 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61       if( ShellHa
d8c0: 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  sFlag(p, SHFLG_N
d8d0: 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20  ewlines) ){.    
d8e0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
d8f0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
d900: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
d910: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
d920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
d930: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
d940: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
d950: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
d960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d970: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
d980: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
d990: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
d9a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
d9b0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d9c0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
d9d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d9e0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
d9f0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c  pe[i]==SQLITE_FL
da00: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
da10: 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20   char z[50];.   
da20: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
da30: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
da40: 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74  _double(p->pStmt
da50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
da60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
da70: 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20  (50,z,"%!.20g", 
da80: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  r);.          ra
da90: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
daa0: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
dab0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
dac0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
dad0: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
dae0: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
daf0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
db00: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
db10: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
db20: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
db30: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
db40: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
db50: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
db60: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
db70: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
db80: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
db90: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
dba0: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
dbb0: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
dbc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
dbd0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
dbe0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
dbf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dc00: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
dc10: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
dc20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ) ){.          o
dc30: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
dc40: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
dc50: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
dc60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
dc70: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
dc80: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
dc90: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
dca0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dcb0: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
dcc0: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22  tf(p->out,");\n"
dcd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
dcf0: 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20  ODE_Quote: {.   
dd00: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
dd10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
dd20: 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20  f( p->cnt==0 && 
dd30: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
dd40: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
dd50: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
dd60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
dd70: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
dd80: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
dd90: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
dda0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
ddb0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
ddc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ddd0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
dde0: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
ddf0: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
de00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
de10: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
de20: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
de30: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
de40: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
de50: 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d    if( (azArg[i]=
de60: 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26  =0) || (aiType &
de70: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
de80: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
de90: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
dea0: 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22  tf(p->out,"NULL"
deb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
dec0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
ded0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
dee0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
def0: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
df00: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
df10: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
df20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
df30: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
df40: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
df50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
df60: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
df70: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
df80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
df90: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
dfa0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
dfb0: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
dfc0: 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20     char z[50];. 
dfd0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
dfe0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
dff0: 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74  mn_double(p->pSt
e000: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
e010: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e020: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
e030: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
e040: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e050: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
e060: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
e070: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
e080: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
e090: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
e0a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
e0b0: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
e0c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
e0d0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
e0e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
e0f0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
e100: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
e110: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
e120: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
e130: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
e140: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
e150: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
e160: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
e170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
e180: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e190: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
e1a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e1b0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e1c0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
e1d0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e1e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e1f0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
e200: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e  rintf(p->out,"\n
e210: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
e220: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e230: 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20  MODE_Ascii: {.  
e240: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
e250: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
e260: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
e270: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e280: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e290: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
e2a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e2b0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
e2c0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ator);.         
e2d0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e2e0: 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69  out,"%s",azCol[i
e2f0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
e300: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
e310: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e320: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e330: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e350: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
e360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
e370: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e380: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
e390: 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66  >0 ) utf8_printf
e3a0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e3b0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
e3c0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e3d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
e3e0: 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72  ,azArg[i] ? azAr
e3f0: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
e400: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
e410: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e420: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e430: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
e440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e450: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e460: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
e470: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
e480: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
e490: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
e4a0: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20  .** invokes for 
e4b0: 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75  each row of a qu
e4c0: 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ery result..*/.s
e4d0: 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61  tatic int callba
e4e0: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
e4f0: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
e500: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
e510: 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65  Col){.  /* since
e520: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
e530: 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74  ype info, call t
e540: 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  he shell_callbac
e550: 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  k with a NULL va
e560: 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lue */.  return 
e570: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70  shell_callback(p
e580: 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67  Arg, nArg, azArg
e590: 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a  , azCol, NULL);.
e5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e5b0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
e5c0: 75 74 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74  utine from sqlit
e5d0: 65 33 5f 65 78 65 63 28 29 20 74 68 61 74 20 61  e3_exec() that a
e5e0: 70 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75  ppends all.** ou
e5f0: 74 70 75 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e  tput onto the en
e600: 64 20 6f 66 20 61 20 53 68 65 6c 6c 54 65 78 74  d of a ShellText
e610: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
e620: 69 63 20 69 6e 74 20 63 61 70 74 75 72 65 4f 75  ic int captureOu
e630: 74 70 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69  tputCallback(voi
e640: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
e650: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
e660: 20 63 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53   char **az){.  S
e670: 68 65 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28 53  hellText *p = (S
e680: 68 65 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a  hellText*)pArg;.
e690: 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45    int i;.  UNUSE
e6a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 29 3b  D_PARAMETER(az);
e6b0: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
e6c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e6d0: 28 20 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54  ( p->n ) appendT
e6e0: 65 78 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a  ext(p, "|", 0);.
e6f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e700: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
e710: 20 69 20 29 20 61 70 70 65 6e 64 54 65 78 74 28   i ) appendText(
e720: 70 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  p, ",", 0);.    
e730: 69 66 28 20 61 7a 41 72 67 5b 69 5d 20 29 20 61  if( azArg[i] ) a
e740: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 61 7a 41  ppendText(p, azA
e750: 72 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20  rg[i], 0);.  }. 
e760: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e770: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
e780: 61 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 46  appropriate SELF
e790: 54 45 53 54 20 74 61 62 6c 65 20 69 6e 20 74 68  TEST table in th
e7a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
e7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e7c0: 63 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61  createSelftestTa
e7d0: 62 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ble(ShellState *
e7e0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  p){.  char *zErr
e7f0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
e800: 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
e810: 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20 73 65     "SAVEPOINT se
e820: 6c 66 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a  lftest_init;\n".
e830: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
e840: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
e850: 73 65 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20 20  selftest(\n".   
e860: 20 22 20 20 74 6e 6f 20 49 4e 54 45 47 45 52 20   "  tno INTEGER 
e870: 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20  PRIMARY KEY,\n" 
e880: 20 20 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65 72    /* Test number
e890: 20 2a 2f 0a 20 20 20 20 22 20 20 6f 70 20 54 45   */.    "  op TE
e8a0: 58 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20  XT,\n"          
e8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72           /* Oper
e8c0: 61 74 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20  ator:  memo run 
e8d0: 2a 2f 0a 20 20 20 20 22 20 20 63 6d 64 20 54 45  */.    "  cmd TE
e8e0: 58 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20  XT,\n"          
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61          /* Comma
e900: 6e 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 22  nd text */.    "
e910: 20 20 61 6e 73 20 54 45 58 54 5c 6e 22 20 20 20    ans TEXT\n"   
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e930: 2f 2a 20 44 65 73 69 72 65 64 20 61 6e 73 77 65  /* Desired answe
e940: 72 20 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20  r */.    ");".  
e950: 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54    "CREATE TEMP T
e960: 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  ABLE [_shell$sel
e970: 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c  f](op,cmd,ans);\
e980: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
e990: 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  NTO [_shell$self
e9a0: 5d 28 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c  ](rowid,op,cmd)\
e9b0: 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53  n".    "  VALUES
e9c0: 28 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43  (coalesce((SELEC
e9d0: 54 20 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29  T (max(tno)+100)
e9e0: 2f 31 30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73  /10 FROM selftes
e9f0: 74 29 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22  t),10),\n".    "
ea00: 20 20 20 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c           'memo',
ea10: 27 54 65 73 74 73 20 67 65 6e 65 72 61 74 65 64  'Tests generated
ea20: 20 62 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22   by --init');\n"
ea30: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
ea40: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
ea50: 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  n".    "  SELECT
ea60: 20 27 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22   'run',\n".    "
ea70: 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28      'SELECT hex(
ea80: 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c  sha3_query(''SEL
ea90: 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
eaa0: 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20  l_name,sql ".   
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46                "F
ead0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
eae0: 72 20 4f 52 44 45 52 20 42 59 20 32 27 27 2c 32  r ORDER BY 2'',2
eaf0: 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20  24))',\n".    " 
eb00: 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72     hex(sha3_quer
eb10: 79 28 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e  y('SELECT type,n
eb20: 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c  ame,tbl_name,sql
eb30: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52               "FR
eb50: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
eb60: 20 4f 52 44 45 52 20 42 59 20 32 27 2c 32 32 34   ORDER BY 2',224
eb70: 29 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ));\n".    "INSE
eb80: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
eb90: 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20  self]\n".    "  
eba0: 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a 20  SELECT 'run',". 
ebb0: 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20     "    'SELECT 
ebc0: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
ebd0: 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  'SELECT * FROM \
ebe0: 22 27 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20  "' ||".    "    
ebf0: 20 20 20 20 70 72 69 6e 74 66 28 27 25 77 27 2c      printf('%w',
ec00: 6e 61 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54  name) || '\" NOT
ec10: 20 49 4e 44 45 58 45 44 27 27 2c 32 32 34 29 29   INDEXED'',224))
ec20: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68  ',\n".    "    h
ec30: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 70 72  ex(sha3_query(pr
ec40: 69 6e 74 66 28 27 53 45 4c 45 43 54 20 2a 20 46  intf('SELECT * F
ec50: 52 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49  ROM \"%w\" NOT I
ec60: 4e 44 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32  NDEXED',name),22
ec70: 34 29 29 5c 6e 22 0a 20 20 20 20 22 20 20 46 52  4))\n".    "  FR
ec80: 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20  OM (\n".    "   
ec90: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
eca0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c  M sqlite_master\
ecb0: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 57 48 45  n".    "     WHE
ecc0: 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 5c  RE type='table'\
ecd0: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41  n".    "       A
ece0: 4e 44 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65  ND name<>'selfte
ecf0: 73 74 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  st'\n".    "    
ed00: 20 20 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28     AND coalesce(
ed10: 72 6f 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22  rootpage,0)>0\n"
ed20: 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20  .    "  )\n".   
ed30: 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
ed40: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
ed50: 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65   INTO [_shell$se
ed60: 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56 41  lf]\n".    "  VA
ed70: 4c 55 45 53 28 27 72 75 6e 27 2c 27 50 52 41 47  LUES('run','PRAG
ed80: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
ed90: 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20  ck','ok');\n".  
eda0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
edb0: 65 6c 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63  elftest(tno,op,c
edc0: 6d 64 2c 61 6e 73 29 22 0a 20 20 20 20 22 20 20  md,ans)".    "  
edd0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2a 31 30 2c  SELECT rowid*10,
ede0: 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20  op,cmd,ans FROM 
edf0: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e  [_shell$self];\n
ee00: 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  ".    "DROP TABL
ee10: 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b  E [_shell$self];
ee20: 22 0a 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72  ".    ,0,0,&zErr
ee30: 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  Msg);.  if( zErr
ee40: 4d 73 67 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Msg ){.    utf8_
ee50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
ee60: 53 45 4c 46 54 45 53 54 20 69 6e 69 74 69 61 6c  SELFTEST initial
ee70: 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a  ization failure:
ee80: 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
ee90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
eea0: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  ee(zErrMsg);.  }
eeb0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
eec0: 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20  p->db, "RELEASE 
eed0: 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c 30  selftest_init",0
eee0: 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ,0,0);.}.../*.**
eef0: 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e 61   Set the destina
ef00: 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64  tion table field
ef10: 20 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61   of the ShellSta
ef20: 74 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a  te structure to.
ef30: 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** the name of t
ef40: 68 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20  he table given. 
ef50: 20 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74   Escape any quot
ef60: 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
ef70: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d  the.** table nam
ef80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
ef90: 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65  d set_table_name
efa0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
efb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
efc0: 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
efd0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20    char cQuote;. 
efe0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
eff0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29   p->zDestTable )
f000: 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44  {.    free(p->zD
f010: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  estTable);.    p
f020: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30  ->zDestTable = 0
f030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
f040: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
f050: 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43   cQuote = quoteC
f060: 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20  har(zName);.  n 
f070: 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  = strlen30(zName
f080: 29 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20  );.  if( cQuote 
f090: 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20  ) n += n+2;.  z 
f0a0: 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  = p->zDestTable 
f0b0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b  = malloc( n+1 );
f0c0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
f0d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
f0e0: 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74  derr,"Error: out
f0f0: 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
f100: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
f110: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  n = 0;.  if( 
f120: 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
f130: 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28  = cQuote;.  for(
f140: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
f150: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20  ++){.    z[n++] 
f160: 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20  = zName[i];.    
f170: 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51  if( zName[i]==cQ
f180: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
f190: 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66  cQuote;.  }.  if
f1a0: 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  ( cQuote ) z[n++
f1b0: 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b  ] = cQuote;.  z[
f1c0: 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n] = 0;.}.../*.*
f1d0: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
f1e0: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
f1f0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53   will generate S
f200: 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e  QL output.  Prin
f210: 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  t.** the result 
f220: 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73  columns, comma-s
f230: 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c  eparated, on a l
f240: 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64  ine and then add
f250: 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20   a.** semicolon 
f260: 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68  terminator to th
f270: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69  e end of that li
f280: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
f290: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
f2a0: 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74  ns is 1 and that
f2b0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
f2c0: 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68   text "--".** th
f2d0: 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d  en write the sem
f2e0: 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61  icolon on a sepa
f2f0: 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74  rate line.  That
f300: 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d   way, if a.** "-
f310: 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72  -" comment occur
f320: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
f330: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
f340: 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f  he comment.** wo
f350: 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20  n't consume the 
f360: 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e  semicolon termin
f370: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
f380: 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  int run_table_du
f390: 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c  mp_query(.  Shel
f3a0: 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20  lState *p,      
f3b0: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f       /* Query co
f3c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
f3d0: 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20   char *zSelect, 
f3e0: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
f3f0: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61  atement to extra
f400: 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ct content */.  
f410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72  const char *zFir
f420: 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e  stRow    /* Prin
f430: 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72  t before first r
f440: 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ow, if not NULL 
f450: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
f460: 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20  stmt *pSelect;. 
f470: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
f480: 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b  Result;.  int i;
f490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f4a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
f4b0: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
f4c0: 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20  b, zSelect, -1, 
f4d0: 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
f4e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f4f0: 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b  K || !pSelect ){
f500: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
f510: 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20  (p->out, "/**** 
f520: 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a  ERROR: (%d) %s *
f530: 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20  ****/\n", rc,.  
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f550: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
f560: 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72  db));.    if( (r
f570: 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f  c&0xff)!=SQLITE_
f580: 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72  CORRUPT ) p->nEr
f590: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
f5a0: 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rc;.  }.  rc = s
f5b0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
f5c0: 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20  ect);.  nResult 
f5d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f5e0: 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b  _count(pSelect);
f5f0: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
f600: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
f610: 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b  if( zFirstRow ){
f620: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
f630: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f640: 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20   zFirstRow);.   
f650: 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30     zFirstRow = 0
f660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20  ;.    }.    z = 
f670: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
f680: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
f690: 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
f6a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f6b0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
f6c0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
f6d0: 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
f6e0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f6f0: 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73  p->out, ",%s", s
f700: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
f710: 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b  xt(pSelect, i));
f720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
f730: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
f740: 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26    while( z[0] &&
f750: 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a   (z[0]!='-' || z
f760: 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b  [1]!='-') ) z++;
f770: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b  .    if( z[0] ){
f780: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
f790: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e  f(p->out, "\n;\n
f7a0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
f7b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f7c0: 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
f7d0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f7e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
f7f0: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ect);.  }.  rc =
f800: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
f810: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
f820: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f830: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
f840: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
f850: 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73  * ERROR: (%d) %s
f860: 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a   *****/\n", rc,.
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
f890: 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20  ->db));.    if( 
f8a0: 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54  (rc&0xff)!=SQLIT
f8b0: 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e  E_CORRUPT ) p->n
f8c0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
f8d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f8e0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
f8f0: 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72  and save off cur
f900: 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e  rent error strin
f910: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  g..*/.static cha
f920: 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28  r *save_err_msg(
f930: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20  .  sqlite3 *db  
f940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
f950: 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
f960: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d  /.){.  int nErrM
f970: 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28  sg = 1+strlen30(
f980: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
f990: 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  b));.  char *zEr
f9a0: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
f9b0: 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29  alloc64(nErrMsg)
f9c0: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
f9d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  ){.    memcpy(zE
f9e0: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
f9f0: 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d  rrmsg(db), nErrM
fa00: 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
fa10: 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69  n zErrMsg;.}..#i
fa20: 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f  fdef __linux__./
fa30: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
fa40: 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74  display I/O stat
fa50: 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67  s on Linux using
fa60: 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f   /proc/PID/io.*/
fa70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
fa80: 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73  playLinuxIoStats
fa90: 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46  (FILE *out){.  F
faa0: 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
fab0: 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  z[200];.  sqlite
fac0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
fad0: 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f  f(z), z, "/proc/
fae0: 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29  %d/io", getpid()
faf0: 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  );.  in = fopen(
fb00: 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20  z, "rb");.  if( 
fb10: 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
fb20: 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a    while( fgets(z
fb30: 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29  , sizeof(z), in)
fb40: 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  !=0 ){.    stati
fb50: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
fb60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
fb70: 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20  r *zPattern;.   
fb80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fb90: 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61  Desc;.    } aTra
fba0: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ns[] = {.      {
fbb0: 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "rchar: ",     
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
fbd0: 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20  tes received by 
fbe0: 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20  read():" },.    
fbf0: 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20    { "wchar: ",  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77  "Bytes sent to w
fc20: 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20  rite():"    },. 
fc30: 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22       { "syscr: "
fc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fc50: 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65     "Read() syste
fc60: 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d  m calls:"      }
fc70: 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77  ,.      { "syscw
fc80: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
fc90: 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73        "Write() s
fca0: 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20  ystem calls:"   
fcb0: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65    },.      { "re
fcc0: 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20  ad_bytes: ",    
fcd0: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
fce0: 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67  read from storag
fcf0: 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  e:"  },.      { 
fd00: 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c  "write_bytes: ",
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
fd20: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74  es written to st
fd30: 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20  orage:" },.     
fd40: 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72   { "cancelled_wr
fd50: 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22  ite_bytes: ",  "
fd60: 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20  Cancelled write 
fd70: 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20  bytes:"    },.  
fd80: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
fd90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
fda0: 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29  rraySize(aTrans)
fdb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
fdc0: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  t n = strlen30(a
fdd0: 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72  Trans[i].zPatter
fde0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  n);.      if( st
fdf0: 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e  rncmp(aTrans[i].
fe00: 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d  zPattern, z, n)=
fe10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
fe20: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
fe30: 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e  %-36s %s", aTran
fe40: 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e  s[i].zDesc, &z[n
fe50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ]);.        brea
fe60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
fe70: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
fe80: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
fe90: 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e  ** Display a sin
fea0: 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74  gle line of stat
feb0: 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20  us using 64-bit 
fec0: 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
fed0: 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74  c void displaySt
fee0: 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53  atLine(.  ShellS
fef0: 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tate *p,        
ff00: 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c      /* The shell
ff10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68   context */.  ch
ff20: 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20  ar *zLabel,     
ff30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
ff40: 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69   for this one li
ff50: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ne */.  char *zF
ff60: 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20  ormat,          
ff70: 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20    /* Format for 
ff80: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
ff90: 69 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c  int iStatusCtrl,
ffa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
ffb0: 63 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73  ch status to dis
ffc0: 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  play */.  int bR
ffd0: 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
ffe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
fff0: 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a  eset the stats *
10000 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  /.){.  sqlite3_i
10010 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a  nt64 iCur = -1;.
10020 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10030 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69  iHiwtr = -1;.  i
10040 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a  nt i, nPercent;.
10050 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30    char zLine[200
10060 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ];.  sqlite3_sta
10070 74 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72  tus64(iStatusCtr
10080 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  l, &iCur, &iHiwt
10090 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f  r, bReset);.  fo
100a0 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d  r(i=0, nPercent=
100b0 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69  0; zFormat[i]; i
100c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f  ++){.    if( zFo
100d0 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e  rmat[i]=='%' ) n
100e0 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  Percent++;.  }. 
100f0 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20   if( nPercent>1 
10100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
10110 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
10120 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46  Line), zLine, zF
10130 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69  ormat, iCur, iHi
10140 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wtr);.  }else{. 
10150 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10160 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
10170 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61  ), zLine, zForma
10180 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a  t, iHiwtr);.  }.
10190 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
101a0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
101b0 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65  ", zLabel, zLine
101c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  );.}../*.** Disp
101d0 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73  lay memory stats
101e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
101f0 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20  display_stats(. 
10200 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10220 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
10230 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74  y */.  ShellStat
10240 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
10250 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10260 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
10270 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20   int bReset     
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10290 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68  True to reset th
102a0 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20  e stats */.){.  
102b0 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
102c0 69 48 69 77 74 72 3b 0a 0a 20 20 69 66 28 20 70  iHiwtr;..  if( p
102d0 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74  Arg && pArg->out
102e0 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53   ){.    displayS
102f0 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d  tatLine(pArg, "M
10300 65 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20  emory Used:",.  
10310 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
10320 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51  %lld) bytes", SQ
10330 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f  LITE_STATUS_MEMO
10340 52 59 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29  RY_USED, bReset)
10350 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  ;.    displaySta
10360 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
10370 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64 69  ber of Outstandi
10380 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22  ng Allocations:"
10390 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28  ,.       "%lld (
103a0 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49  max %lld)", SQLI
103b0 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
103c0 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b  _COUNT, bReset);
103d0 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
103e0 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
103f0 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20  _Pagecache ){.  
10400 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
10410 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65  ine(pArg, "Numbe
10420 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65  r of Pcache Page
10430 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20  s Used:",.      
10440 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
10450 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49  ld) pages", SQLI
10460 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
10470 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74  CHE_USED, bReset
10480 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73  );.    }.    dis
10490 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
104a0 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63  g, "Number of Pc
104b0 61 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79  ache Overflow By
104c0 74 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  tes:",.       "%
104d0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62  lld (max %lld) b
104e0 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
104f0 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f  ATUS_PAGECACHE_O
10500 56 45 52 46 4c 4f 57 2c 20 62 52 65 73 65 74 29  VERFLOW, bReset)
10510 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  ;.    displaySta
10520 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72  tLine(pArg, "Lar
10530 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a  gest Allocation:
10540 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
10550 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
10560 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
10570 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  E, bReset);.    
10580 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
10590 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50  pArg, "Largest P
105a0 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e  cache Allocation
105b0 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
105c0 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
105d0 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
105e0 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a  _SIZE, bReset);.
105f0 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41  #ifdef YYTRACKMA
10600 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 20 20  XSTACKDEPTH.    
10610 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
10620 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50  pArg, "Deepest P
10630 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20  arser Stack:",. 
10640 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
10650 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f   %lld)", SQLITE_
10660 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54  STATUS_PARSER_ST
10670 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65  ACK, bReset);.#e
10680 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
10690 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75  pArg && pArg->ou
106a0 74 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20 69  t && db ){.    i
106b0 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c  f( pArg->shellFl
106c0 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  gs & SHFLG_Looka
106d0 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48  side ){.      iH
106e0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
106f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10700 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
10710 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
10720 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20  OKASIDE_USED,.  
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
10750 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
10760 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
10770 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
10780 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73           "Lookas
10790 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20  ide Slots Used: 
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
107b0 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20  d (max %d)\n",. 
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
107d0 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  r, iHiwtr);.    
107e0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
107f0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
10800 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
10810 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20  E_HIT,.         
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
10830 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
10840 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
10850 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10860 75 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20  ut, "Successful 
10870 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70  lookaside attemp
10880 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  ts:       %d\n",
10890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
108a0 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
108b0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
108c0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
108d0 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
108e0 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  SS_SIZE,.       
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
10910 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
10920 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
10930 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
10940 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
10950 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e   size:      %d\n
10960 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10970 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
10980 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
10990 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
109a0 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
109b0 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20  MISS_FULL,.     
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109d0 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
109e0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
109f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
10a00 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69  g->out, "Lookasi
10a10 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20  de failures due 
10a20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64  to OOM:       %d
10a30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10a40 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
10a50 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  }.    iHiwtr = i
10a60 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
10a70 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
10a80 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
10a90 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20  TUS_CACHE_USED, 
10aa0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
10ab0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
10ac0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
10ad0 74 2c 20 22 50 61 67 65 72 20 48 65 61 70 20 55  t, "Pager Heap U
10ae0 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
10af0 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
10b00 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
10b10 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69    iCur);.    iHi
10b20 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
10b30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
10b40 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
10b50 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
10b60 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48  _HIT, &iCur, &iH
10b70 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
10b80 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10b90 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
10ba0 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20 20  hits:           
10bb0 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
10bc0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
10bd0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
10be0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
10bf0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
10c00 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
10c10 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48  MISS, &iCur, &iH
10c20 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
10c30 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10c40 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
10c50 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20  misses:         
10c60 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
10c70 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
10c80 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
10c90 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
10ca0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
10cb0 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
10cc0 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69  WRITE, &iCur, &i
10cd0 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
10ce0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
10cf0 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
10d00 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20   writes:        
10d10 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
10d20 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
10d30 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
10d40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
10d50 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
10d60 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d  E_DBSTATUS_SCHEM
10d70 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  A_USED, &iCur, &
10d80 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
10d90 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
10da0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65  pArg->out, "Sche
10db0 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  ma Heap Usage:  
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
10de0 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
10df0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
10e00 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
10e10 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
10e20 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
10e30 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69  US_STMT_USED, &i
10e40 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
10e50 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
10e60 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
10e70 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70   "Statement Heap
10e80 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65  /Lookaside Usage
10e90 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c  :      %d bytes\
10ea0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10eb0 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  iCur);.  }..  if
10ec0 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
10ed0 6f 75 74 20 26 26 20 64 62 20 26 26 20 70 41 72  out && db && pAr
10ee0 67 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  g->pStmt ){.    
10ef0 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
10f00 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
10f10 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
10f20 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
10f30 41 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20  AN_STEP,.       
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 20 20 20 20 20 62 52 65 73 65 74 29 3b          bReset);
10f60 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
10f70 70 41 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c  pArg->out, "Full
10f80 73 63 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20  scan Steps:     
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
10fb0 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
10fc0 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
10fd0 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
10fe0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
10ff0 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  T, bReset);.    
11000 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11010 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72  >out, "Sort Oper
11020 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
11030 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11040 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
11050 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
11060 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
11070 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
11080 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
11090 58 2c 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  X,bReset);.    r
110a0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
110b0 6f 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20  out, "Autoindex 
110c0 49 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20  Inserts:        
110d0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
110e0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
110f0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
11100 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
11110 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
11120 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20  STATUS_VM_STEP, 
11130 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
11140 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
11150 74 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68  t, "Virtual Mach
11160 69 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20 20  ine Steps:      
11170 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
11180 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  iCur);.  }..#ifd
11190 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64  ef __linux__.  d
111a0 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61  isplayLinuxIoSta
111b0 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23  ts(pArg->out);.#
111c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e  endif..  /* Do n
111d0 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d  ot remove this m
111e0 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20  achine readable 
111f0 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73  comment: extra-s
11200 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65  tats-output-here
11210 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   */..  return 0;
11220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
11230 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f  y scan stats..*/
11240 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
11250 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a  play_scanstats(.
11260 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
11290 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c   query */.  Shel
112a0 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20  lState *pArg    
112b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
112c0 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
112d0 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  tate */.){.#ifnd
112e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
112f0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
11300 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11310 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
11320 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
11330 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69  );.#else.  int i
11340 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61  , k, n, mx;.  ra
11350 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11360 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63  ut, "-------- sc
11370 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d  anstats --------
11380 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a  \n");.  mx = 0;.
11390 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78    for(k=0; k<=mx
113a0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62  ; k++){.    doub
113b0 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e  le rEstLoop = 1.
113c0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  0;.    for(i=n=0
113d0 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ; 1; i++){.     
113e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
113f0 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a   = pArg->pStmt;.
11400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
11410 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69  t64 nLoop, nVisi
11420 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  t;.      double 
11430 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  rEst;.      int 
11440 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73  iSid;.      cons
11450 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e  t char *zExplain
11460 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11470 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
11480 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
11490 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c  _SCANSTAT_NLOOP,
114a0 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20   (void*)&nLoop) 
114b0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
114c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
114d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
114e0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
114f0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45  LITE_SCANSTAT_SE
11500 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26  LECTID, (void*)&
11510 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  iSid);.      if(
11520 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20   iSid>mx ) mx = 
11530 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iSid;.      if( 
11540 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e  iSid!=k ) contin
11550 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ue;.      if( n=
11560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45  =0 ){.        rE
11570 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65  stLoop = (double
11580 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  )nLoop;.        
11590 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72  if( k>0 ) raw_pr
115a0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
115b0 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65  "-------- subque
115c0 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  ry %d -------\n"
115d0 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , k);.      }.  
115e0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73      n++;.      s
115f0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
11600 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
11610 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49  ITE_SCANSTAT_NVI
11620 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69  SIT, (void*)&nVi
11630 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sit);.      sqli
11640 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
11650 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
11660 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28  _SCANSTAT_EST, (
11670 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20  void*)&rEst);.  
11680 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
11690 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
116a0 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
116b0 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64  T_EXPLAIN, (void
116c0 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  *)&zExplain);.  
116d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
116e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70  pArg->out, "Loop
116f0 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20   %2d: %s\n", n, 
11700 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
11710 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73   rEstLoop *= rEs
11720 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  t;.      raw_pri
11730 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
11740 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
11750 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20     nLoop=%-8lld 
11760 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  nRow=%-8lld estR
11770 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
11780 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20  /Loop=%-8g\n",. 
11790 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20           nLoop, 
117a0 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33  nVisit, (sqlite3
117b0 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70  _int64)(rEstLoop
117c0 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20  +0.5), rEst.    
117d0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    );.    }.  }. 
117e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
117f0 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
11800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11810 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ---\n");.#endif.
11820 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
11830 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74  er azArray point
11840 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d  s to a zero-term
11850 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20  inated array of 
11860 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a  strings. zStr.**
11870 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e   points to a sin
11880 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  gle nul-terminat
11890 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72  ed string. Retur
118a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53  n non-zero if zS
118b0 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20  tr.** is equal, 
118c0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72  according to str
118d0 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66  cmp(), to any of
118e0 20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20   the strings in 
118f0 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74  the array..** Ot
11900 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
11910 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
11920 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  int str_in_array
11930 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
11940 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  r, const char **
11950 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20  azArray){.  int 
11960 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a  i;.  for(i=0; az
11970 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  Array[i]; i++){.
11980 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
11990 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b  p(zStr, azArray[
119a0 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i]) ) return 1;.
119b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
119c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70  }../*.** If comp
119d0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70  iled statement p
119e0 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62  Sql appears to b
119f0 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  e an EXPLAIN sta
11a00 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65  tement, allocate
11a10 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
11a20 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
11a30 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
11a40 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
11a50 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61   of.** spaces ea
11a60 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64  ch opcode should
11a70 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66   be indented bef
11a80 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74  ore it is output
11a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
11aa0 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a  nting rules are:
11ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
11ac0 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50   each "Next", "P
11ad0 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72  rev", "VNext" or
11ae0 20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63   "VPrev" instruc
11af0 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20  tion, indent.** 
11b00 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65        all opcode
11b10 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74  s that occur bet
11b20 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70  ween the p2 jump
11b30 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64   destination and
11b40 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20   the opcode.**  
11b50 20 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32       itself by 2
11b60 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   spaces..**.**  
11b70 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47     * For each "G
11b80 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d  oto", if the jum
11b90 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  p destination is
11ba0 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
11bb0 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20  program.**      
11bc0 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65   and ends on one
11bd0 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20   of:.**         
11be0 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20   Yield  SeekGt  
11bf0 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65  SeekLt  RowSetRe
11c00 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20  ad  Rewind.**   
11c10 20 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31      or if the P1
11c20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e   parameter is on
11c30 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72  e instead of zer
11c40 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  o,.**       then
11c50 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f   indent all opco
11c60 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  des between the 
11c70 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74  earlier instruct
11c80 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ion.**       and
11c90 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61   "Goto" by 2 spa
11ca0 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
11cb0 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61  oid explain_data
11cc0 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74  _prepare(ShellSt
11cd0 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ate *p, sqlite3_
11ce0 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63  stmt *pSql){.  c
11cf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d10 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
11d20 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
11d30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11d40 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
11d50 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
11d60 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  check if this is
11d70 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20   an EXPLAIN */. 
11d80 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20   int *abYield = 
11d90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11da0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69   /* True if op i
11db0 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f  s an OP_Yield */
11dc0 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
11dd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11de0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
11df0 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64  size of p->aiInd
11e00 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a  ent[], abYield *
11e10 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20  /.  int iOp;    
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11e40 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e  operation in p->
11e50 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20  aiIndent[] */.. 
11e60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e   const char *azN
11e70 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22  ext[] = { "Next"
11e80 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76  , "Prev", "VPrev
11e90 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72  ", "VNext", "Sor
11ea0 74 65 72 4e 65 78 74 22 2c 0a 20 20 20 20 20 20  terNext",.      
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 20 20 22 4e 65 78 74 49 66 4f 70 65 6e       "NextIfOpen
11ed0 22 2c 20 22 50 72 65 76 49 66 4f 70 65 6e 22 2c  ", "PrevIfOpen",
11ee0 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68   0 };.  const ch
11ef0 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20  ar *azYield[] = 
11f00 7b 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65 6b  { "Yield", "Seek
11f10 4c 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20 22  LT", "SeekGT", "
11f20 52 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20 20  RowSetRead",.   
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 20 20 20 20 20 22 52 65 77 69 6e 64           "Rewind
11f50 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ", 0 };.  const 
11f60 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d  char *azGoto[] =
11f70 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a   { "Goto", 0 };.
11f80 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67  .  /* Try to fig
11f90 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20  ure out if this 
11fa0 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50  is really an EXP
11fb0 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20  LAIN statement. 
11fc0 49 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e  If this.  ** can
11fd0 6e 6f 74 20 62 65 20 76 65 72 69 66 69 65 64 2c  not be verified,
11fe0 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20   return early.  
11ff0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12000 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
12010 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d  ql)!=8 ){.    p-
12020 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
12030 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
12040 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  }.  zSql = sqlit
12050 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20  e3_sql(pSql);.  
12060 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
12070 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53  turn;.  for(z=zS
12080 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a  ql; *z==' ' || *
12090 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\t' || *z=='
120a0 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20  \n' || *z=='\f' 
120b0 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b  || *z=='\r'; z++
120c0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
120d0 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78  _strnicmp(z, "ex
120e0 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20  plain", 7) ){.  
120f0 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
12100 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  mode;.    return
12110 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70  ;.  }..  for(iOp
12120 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  =0; SQLITE_ROW==
12130 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
12140 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20  l); iOp++){.    
12150 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69  int i;.    int i
12160 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  Addr = sqlite3_c
12170 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
12180 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
12190 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74  ar *zOp = (const
121a0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
121b0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
121c0 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   1);..    /* Set
121d0 20 70 32 20 74 6f 20 74 68 65 20 50 32 20 66 69   p2 to the P2 fi
121e0 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  eld of the curre
121f0 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c  nt opcode. Then,
12200 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20   assuming that. 
12210 20 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69     ** p2 is an i
12220 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65  nstruction addre
12230 73 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65  ss, set variable
12240 20 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64   p2op to the ind
12250 65 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a  ex of that.    *
12260 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  * instruction in
12270 20 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20   the aiIndent[] 
12280 61 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32  array. p2 and p2
12290 6f 70 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  op may be differ
122a0 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ent if.    ** th
122b0 65 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75  e current instru
122c0 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
122d0 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67   a sub-program g
122e0 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20  enerated by an. 
122f0 20 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65     ** SQL trigge
12300 72 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79  r or foreign key
12310 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32  .  */.    int p2
12320 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
12330 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a  n_int(pSql, 3);.
12340 20 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28      int p2op = (
12350 70 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29  p2 + (iOp-iAddr)
12360 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20  );..    /* Grow 
12370 74 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20  the p->aiIndent 
12380 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65  array as require
12390 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70  d */.    if( iOp
123a0 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >=nAlloc ){.    
123b0 20 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a    if( iOp==0 ){.
123c0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75          /* Do fu
123d0 72 74 68 65 72 20 76 65 72 66 69 63 61 74 69 6f  rther verficatio
123e0 6e 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  n that this is e
123f0 78 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20 20  xplain output.  
12400 41 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20 20  Abort if.       
12410 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f   ** it is not */
12420 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20  .        static 
12430 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70 6c  const char *expl
12440 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20  ainCols[] = {.  
12450 20 20 20 20 20 20 20 20 20 22 61 64 64 72 22 2c           "addr",
12460 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c   "opcode", "p1",
12470 20 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34   "p2", "p3", "p4
12480 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e  ", "p5", "commen
12490 74 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e  t" };.        in
124a0 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  t jj;.        fo
124b0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79  r(jj=0; jj<Array
124c0 53 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73  Size(explainCols
124d0 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ); jj++){.      
124e0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 73      if( strcmp(s
124f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
12500 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c  me(pSql,jj),expl
12510 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20  ainCols[jj])!=0 
12520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
12530 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
12540 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
12550 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71  qlite3_reset(pSq
12560 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
12570 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
12580 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
12590 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c      }.      nAll
125a0 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20  oc += 100;.     
125b0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28   p->aiIndent = (
125c0 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
125d0 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64 65  lloc64(p->aiInde
125e0 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  nt, nAlloc*sizeo
125f0 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 61  f(int));.      a
12600 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73  bYield = (int*)s
12610 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
12620 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63  (abYield, nAlloc
12630 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
12640 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64     }.    abYield
12650 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61  [iOp] = str_in_a
12660 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c  rray(zOp, azYiel
12670 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64  d);.    p->aiInd
12680 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20  ent[iOp] = 0;.  
12690 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69    p->nIndent = i
126a0 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73  Op+1;..    if( s
126b0 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
126c0 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20   azNext) ){.    
126d0 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c    for(i=p2op; i<
126e0 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49  iOp; i++) p->aiI
126f0 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20  ndent[i] += 2;. 
12700 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
12710 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
12720 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70  zGoto) && p2op<p
12730 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26  ->nIndent.     &
12740 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d  & (abYield[p2op]
12750 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
12760 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29  mn_int(pSql, 2))
12770 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f  .    ){.      fo
12780 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b  r(i=p2op; i<iOp;
12790 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
127a0 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
127b0 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65  .  }..  p->iInde
127c0 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  nt = 0;.  sqlite
127d0 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b  3_free(abYield);
127e0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  .  sqlite3_reset
127f0 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (pSql);.}../*.**
12800 20 46 72 65 65 20 74 68 65 20 61 72 72 61 79 20   Free the array 
12810 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70  allocated by exp
12820 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
12830 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
12840 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61  oid explain_data
12850 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61  _delete(ShellSta
12860 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  te *p){.  sqlite
12870 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65  3_free(p->aiInde
12880 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65  nt);.  p->aiInde
12890 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e  nt = 0;.  p->nIn
128a0 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  dent = 0;.  p->i
128b0 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  Indent = 0;.}../
128c0 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e 64  *.** Disable and
128d0 20 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65 74   restore .wheret
128e0 72 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63 74  race and .select
128f0 74 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e 0a  trace settings..
12900 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
12910 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
12920 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
12930 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
12940 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  E).extern int sq
12950 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
12960 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
12970 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23  edSelectTrace;.#
12980 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
12990 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
129a0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
129b0 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
129c0 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20  ACE).extern int 
129d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
129e0 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  e;.static int sa
129f0 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23  vedWhereTrace;.#
12a00 65 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69  endif.static voi
12a10 64 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f  d disable_debug_
12a20 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64  trace_modes(void
12a30 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
12a40 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
12a50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
12a60 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
12a70 45 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63 74  E).  savedSelect
12a80 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 53  Trace = sqlite3S
12a90 65 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73 71  electTrace;.  sq
12aa0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
12ab0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
12ac0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12ad0 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
12ae0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
12af0 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 61  WHERETRACE).  sa
12b00 76 65 64 57 68 65 72 65 54 72 61 63 65 20 3d 20  vedWhereTrace = 
12b10 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
12b20 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  e;.  sqlite3Wher
12b30 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  eTrace = 0;.#end
12b40 69 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  if.}.static void
12b50 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74   restore_debug_t
12b60 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29  race_modes(void)
12b70 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
12b80 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
12b90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12ba0 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
12bb0 29 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ).  sqlite3Selec
12bc0 74 54 72 61 63 65 20 3d 20 73 61 76 65 64 53 65  tTrace = savedSe
12bd0 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69  lectTrace;.#endi
12be0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
12bf0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
12c00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12c10 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
12c20 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  .  sqlite3WhereT
12c30 72 61 63 65 20 3d 20 73 61 76 65 64 57 68 65 72  race = savedWher
12c40 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d  eTrace;.#endif.}
12c50 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72  ../*.** Run a pr
12c60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12c70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12c80 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74  exec_prepared_st
12c90 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  mt(.  ShellState
12ca0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12cd0 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
12ce0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
12cf0 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20 20  t *pStmt,       
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e        /* Statmen
12d20 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 69 6e  t to run */.  in
12d30 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
12d40 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c  oid*,int,char**,
12d50 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 20 20 20 2f  char**,int*)   /
12d60 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
12d70 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
12d80 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72  rc;..  /* perfor
12d90 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  m the first step
12da0 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c  .  this will tel
12db0 6c 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20  l us if we.  ** 
12dc0 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65  have a result se
12dd0 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77  t or not and how
12de0 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a   wide it is..  *
12df0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
12e00 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
12e10 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
12e20 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f  result set... */
12e30 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
12e40 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f  W == rc ){.    /
12e50 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 63  * if we have a c
12e60 61 6c 6c 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20  allback... */.  
12e70 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 20    if( xCallback 
12e80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
12e90 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63  cate space for c
12ea0 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c  ol name ptr, val
12eb0 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65  ue ptr, and type
12ec0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
12ed0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
12ee0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
12ef0 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  ;.      void *pD
12f00 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
12f10 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
12f20 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
12f30 29 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 69 66  ) + 1);.      if
12f40 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20  ( !pData ){.    
12f50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12f60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
12f70 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
12f80 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61   **azCols = (cha
12f90 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20  r **)pData;     
12fa0 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73   /* Names of res
12fb0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
12fc0 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a         char **az
12fd0 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e  Vals = &azCols[n
12fe0 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52  Col];       /* R
12ff0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
13000 20 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d    int *aiTypes =
13010 20 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b   (int *)&azVals[
13020 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74  nCol]; /* Result
13030 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20   types */.      
13040 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20    int i, x;.    
13050 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
13060 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
13070 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
13080 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70     /* save off p
13090 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61  trs to column na
130a0 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  mes */.        f
130b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
130c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
130d0 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
130e0 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
130f0 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
13100 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13110 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
13120 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68     /* extract th
13130 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61 20  e data and data 
13140 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
13150 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
13160 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
13170 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
13180 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
13190 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
131a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
131b0 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f    if( x==SQLITE_
131c0 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20  BLOB && pArg && 
131d0 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
131e0 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  E_Insert ){.    
131f0 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73            azVals
13200 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  [i] = "";.      
13210 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13220 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c             azVal
13230 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71  s[i] = (char*)sq
13240 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
13250 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  t(pStmt, i);.   
13260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13270 20 20 20 20 20 20 20 69 66 28 20 21 61 7a 56 61         if( !azVa
13280 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65  ls[i] && (aiType
13290 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  s[i]!=SQLITE_NUL
132a0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
132b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
132c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
132d0 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
132e0 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
132f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13300 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20     } /* end for 
13310 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  */..          /*
13320 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
13330 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
13340 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
13350 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 51            if( SQ
13360 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
13370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
13380 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69   call the suppli
13390 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ed callback with
133a0 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20   the result row 
133b0 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20  data */.        
133c0 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63      if( xCallbac
133d0 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a  k(pArg, nCol, az
133e0 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69  Vals, azCols, ai
133f0 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20  Types) ){.      
13400 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13410 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20  ITE_ABORT;.     
13420 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13430 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
13440 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
13450 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
13460 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13470 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
13480 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72   SQLITE_ROW == r
13490 63 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  c );.        sql
134a0 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
134b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
134c0 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  lse{.      do{. 
134d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
134e0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
134f0 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20  .      } while( 
13500 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57  rc == SQLITE_ROW
13510 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
13520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13530 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13540 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  E./*.** This fun
13550 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13560 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69  to process SQL i
13570 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
13580 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  hell command.** 
13590 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49  was ".expert". I
135a0 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c  t passes the SQL
135b0 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
135c0 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79  rgument directly
135d0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   to.** the sqlit
135e0 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e  e3expert object.
135f0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
13600 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
13610 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
13620 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
13630 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e  e error.** code.
13640 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28   In this case, (
13650 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73  *pzErr) may be s
13660 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
13670 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
13680 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68  ng.** an English
13690 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
136a0 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
136b0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
136c0 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
136d0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
136e0 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
136f0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
13700 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
13710 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64  c int expertHand
13720 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74  leSQL(.  ShellSt
13730 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20  ate *pState, .  
13740 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
13750 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
13760 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  r.){.  assert( p
13770 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
13780 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72  xpert );.  asser
13790 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a  t( pzErr==0 || *
137a0 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65  pzErr==0 );.  re
137b0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70  turn sqlite3_exp
137c0 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e  ert_sql(pState->
137d0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20  expert.pExpert, 
137e0 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a  zSql, pzErr);.}.
137f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13800 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65  tion is called e
13810 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c  ither to silentl
13820 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f  y clean up the o
13830 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64  bject.** created
13840 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74   by the ".expert
13850 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43  " command (if bC
13860 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f  ancel==1), or to
13870 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20   generate a .** 
13880 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61  report from it a
13890 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74  nd then clean it
138a0 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d   up (if bCancel=
138b0 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  =0)..**.** If su
138c0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
138d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
138e0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
138f0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
13900 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
13910 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20  e, (*pzErr) may 
13920 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
13930 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
13940 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67  aining.** an Eng
13950 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
13960 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20  ror message. It 
13970 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
13980 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
13990 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
139a0 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
139b0 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
139c0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
139d0 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
139e0 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53  Finish(.  ShellS
139f0 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20  tate *pState,.  
13a00 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63  int bCancel,.  c
13a10 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
13a20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13a30 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78  _OK;.  sqlite3ex
13a40 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65  pert *p = pState
13a50 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
13a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
13a70 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63  .  assert( bCanc
13a80 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c  el || pzErr==0 |
13a90 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  | *pzErr==0 );. 
13aa0 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20   if( bCancel==0 
13ab0 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  ){.    FILE *out
13ac0 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a   = pState->out;.
13ad0 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65      int bVerbose
13ae0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
13af0 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20  t.bVerbose;..   
13b00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
13b10 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20  pert_analyze(p, 
13b20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  pzErr);.    if( 
13b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13b40 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72  .      int nQuer
13b50 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  y = sqlite3_expe
13b60 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20  rt_count(p);.   
13b70 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
13b80 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
13b90 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13ba0 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c  har *zCand = sql
13bb0 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
13bc0 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45  rt(p,0,EXPERT_RE
13bd0 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29  PORT_CANDIDATES)
13be0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
13bf0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61  intf(out, "-- Ca
13c00 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d  ndidates -------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c20 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20  ------\n");.    
13c30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
13c40 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e  ut, "%s\n", zCan
13c50 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
13c60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75    for(i=0; i<nQu
13c70 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ery; i++){.     
13c80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13c90 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Sql = sqlite3_ex
13ca0 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69  pert_report(p, i
13cb0 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  , EXPERT_REPORT_
13cc0 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  SQL);.        co
13cd0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
13ce0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
13cf0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
13d00 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58  ERT_REPORT_INDEX
13d10 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ES);.        con
13d20 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
13d30 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
13d40 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
13d50 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b  RT_REPORT_PLAN);
13d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64  .        if( zId
13d70 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28  x==0 ) zIdx = "(
13d80 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c  no new indexes)\
13d90 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n";.        if( 
13da0 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
13db0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
13dc0 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20  (out, "-- Query 
13dd0 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  %d -------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13df0 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20  ---\n",i+1);.   
13e00 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
13e10 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c  f(out, "%s\n\n",
13e20 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
13e30 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
13e40 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
13e50 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , zIdx);.       
13e60 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
13e70 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a   "%s\n", zEQP);.
13e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13e90 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65  }.  sqlite3_expe
13ea0 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20  rt_destroy(p);. 
13eb0 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
13ec0 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72  pExpert = 0;.  r
13ed0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13ee0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
13ef0 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64  n of ".expert" d
13f00 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
13f10 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
13f20 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
13f30 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
13f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13f50 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
13f60 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
13f70 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f90 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
13fa0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
13fb0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
13fc0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
13ff0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
14000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
14010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
14020 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
14030 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61  int i;.  int iSa
14040 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  mple = 0;..  ass
14050 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70  ert( pState->exp
14060 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29  ert.pExpert==0 )
14070 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61  ;.  memset(&pSta
14080 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73  te->expert, 0, s
14090 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f  izeof(ExpertInfo
140a0 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ));..  for(i=1; 
140b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
140c0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
140d0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41     char *z = azA
140e0 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rg[i];.    int n
140f0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
14100 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
14110 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20   ) z++;.    n = 
14120 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
14130 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d   if( n>=2 && 0==
14140 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72  strncmp(z, "-ver
14150 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  bose", n) ){.   
14160 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
14170 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a  t.bVerbose = 1;.
14180 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
14190 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74  f( n>=2 && 0==st
141a0 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c  rncmp(z, "-sampl
141b0 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20  e", n) ){.      
141c0 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20  if( i==(nArg-1) 
141d0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
141e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
141f0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
14200 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e  n argument: %s\n
14210 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
14220 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
14230 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14240 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d         iSample =
14250 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
14260 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a  ue(azArg[++i]);.
14270 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d          if( iSam
14280 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65  ple<0 || iSample
14290 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
142a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
142b0 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20  err, "value out 
142c0 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c  of range: %s\n",
142d0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
142e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
142f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
14300 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14310 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14320 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
14330 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
14340 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ion: %s\n", z);.
14350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14360 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
14370 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
14380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
14390 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
143a0 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  xpert = sqlite3_
143b0 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74  expert_new(pStat
143c0 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20  e->db, &zErr);. 
143d0 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65     if( pState->e
143e0 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30  xpert.pExpert==0
143f0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
14400 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
14410 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77  lite3_expert_new
14420 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
14430 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14440 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
14450 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14460 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28  3_expert_config(
14470 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74  .          pStat
14480 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
14490 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47  t, EXPERT_CONFIG
144a0 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65  _SAMPLE, iSample
144b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
144c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
144d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
144e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
144f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
14500 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14510 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
14520 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
14530 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20  .  Print.** any 
14540 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75  result rows/colu
14550 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  mns depending on
14560 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64   the current mod
14570 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65  e.** set via the
14580 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61   supplied callba
14590 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ck..**.** This i
145a0 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74  s very similar t
145b0 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74  o SQLite's built
145c0 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63  -in sqlite3_exec
145d0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65  ().** function e
145e0 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61  xcept it takes a
145f0 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
14600 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ent callback.** 
14610 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74  and callback dat
14620 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  a argument..*/.s
14630 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
14640 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20  exec(.  sqlite3 
14650 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74    /* An open dat
14680 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
14690 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
146c0 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20  e evaluated */. 
146d0 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
146e0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
146f0 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 2c  **,char**,int*),
14700 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
14710 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20 74         /* (not t
14750 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
14760 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53 68  e3_exec) */.  Sh
14770 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
147a0 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
147b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
147c0 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69  /* Error msg wri
147f0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
14800 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14810 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20  pStmt = NULL;   
14820 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
14830 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
14840 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14850 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
14860 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
14870 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63  /.  int rc2;.  c
14880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
14890 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  over;          /
148a0 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63  * Tail of unproc
148b0 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20 20  essed SQL */..  
148c0 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
148d0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
148e0 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  NULL;.  }..#ifnd
148f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14900 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
14910 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70  ( pArg->expert.p
14920 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63  Expert ){.    rc
14930 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53   = expertHandleS
14940 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70  QL(pArg, zSql, p
14950 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
14960 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73  turn expertFinis
14970 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c  h(pArg, (rc!=SQL
14980 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73  ITE_OK), pzErrMs
14990 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  g);.  }.#endif..
149a0 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d    while( zSql[0]
149b0 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d   && (SQLITE_OK =
149c0 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61  = rc) ){.    sta
149d0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
149e0 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63  zStmtSql;.    rc
149f0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
14a00 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
14a10 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65  -1, &pStmt, &zLe
14a20 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28  ftover);.    if(
14a30 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63   SQLITE_OK != rc
14a40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a   ){.      if( pz
14a50 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
14a60 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61    *pzErrMsg = sa
14a70 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a  ve_err_msg(db);.
14a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14a90 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53  e{.      if( !pS
14aa0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  tmt ){.        /
14ab0 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66  * this happens f
14ac0 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20  or a comment or 
14ad0 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20  white-space */. 
14ae0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
14af0 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
14b00 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
14b10 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
14b20 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  +;.        conti
14b30 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
14b40 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71     zStmtSql = sq
14b50 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
14b60 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d  ;.      if( zStm
14b70 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53  tSql==0 ) zStmtS
14b80 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77  ql = "";.      w
14b90 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
14ba0 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74  tmtSql[0]) ) zSt
14bb0 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20  mtSql++;..      
14bc0 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20  /* save off the 
14bd0 70 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e  prepared statmen
14be0 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73  t handle and res
14bf0 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a  et row count */.
14c00 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
14c10 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
14c20 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
14c30 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74         pArg->cnt
14c40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
14c50 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65       /* echo the
14c60 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69   sql statement i
14c70 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20  f echo on */.   
14c80 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53     if( pArg && S
14c90 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67  hellHasFlag(pArg
14ca0 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b  , SHFLG_Echo) ){
14cb0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
14cc0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
14cd0 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c  "%s\n", zStmtSql
14ce0 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53   ? zStmtSql : zS
14cf0 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ql);.      }..  
14d00 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20      /* Show the 
14d10 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
14d20 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e  AN if .eqp is on
14d30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
14d40 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f  rg && pArg->auto
14d50 45 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73  EQP && sqlite3_s
14d60 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25  trlike("EXPLAIN%
14d70 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30  ",zStmtSql,0)!=0
14d80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14d90 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
14da0 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  in;.        char
14db0 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20   *zEQP;.        
14dc0 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d  int triggerEQP =
14dd0 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61   0;.        disa
14de0 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ble_debug_trace_
14df0 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20  modes();.       
14e00 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
14e10 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
14e20 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
14e30 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72  QP, -1, &trigger
14e40 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
14e50 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
14e60 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
14e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14e80 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
14e90 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
14ea0 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
14eb0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
14ec0 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d  }.        zEQP =
14ed0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14ee0 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
14ef0 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53  PLAN %s", zStmtS
14f00 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ql);.        rc 
14f10 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
14f20 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
14f30 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
14f40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14f60 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14f70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
14f80 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52  plain)==SQLITE_R
14f90 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
14fa0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
14fb0 67 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d 20  g->out,"--EQP-- 
14fc0 25 64 2c 22 2c 73 71 6c 69 74 65 33 5f 63 6f 6c  %d,",sqlite3_col
14fd0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
14fe0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 0));.         
14ff0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
15000 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73  rg->out,"%d,", s
15010 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
15020 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 29 3b  t(pExplain, 1));
15030 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
15040 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
15050 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33  t,"%d,", sqlite3
15060 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
15070 6c 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20  lain, 2));.     
15080 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
15090 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 73  tf(pArg->out,"%s
150a0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
150b0 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69  umn_text(pExplai
150c0 6e 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20  n, 3));.        
150d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
150e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
150f0 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
15100 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15110 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
15120 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
15130 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50  autoEQP>=AUTOEQP
15140 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _full ){.       
15150 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e     /* Also do an
15160 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65   EXPLAIN for ".e
15170 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f  qp full" mode */
15180 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20  .          zEQP 
15190 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
151a0 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20  f("EXPLAIN %s", 
151b0 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20  zStmtSql);.     
151c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
151d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
151e0 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
151f0 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
15200 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15220 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65       pArg->cMode
15230 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
15240 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70  .            exp
15250 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
15260 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e  e(pArg, pExplain
15270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
15280 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
15290 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e  t(pArg, pExplain
152a0 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  , xCallback);.  
152b0 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
152c0 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
152d0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg);.          }
152e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
152f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
15300 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
15310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
15320 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  QP);.        }. 
15330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
15340 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c  b_config(db, SQL
15350 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
15360 47 47 45 52 5f 45 51 50 2c 20 74 72 69 67 67 65  GGER_EQP, trigge
15370 72 45 51 50 2c 20 30 29 3b 0a 20 20 20 20 20 20  rEQP, 0);.      
15380 20 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f    restore_debug_
15390 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20  trace_modes();. 
153a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
153b0 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
153c0 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
153d0 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20  pArg->mode;.    
153e0 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
153f0 74 6f 45 78 70 6c 61 69 6e 0a 20 20 20 20 20 20  toExplain.      
15400 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f     && sqlite3_co
15410 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
15420 29 3d 3d 38 0a 20 20 20 20 20 20 20 20 20 26 26  )==8.         &&
15430 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
15440 28 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a 53 74  ("EXPLAIN%", zSt
15450 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20 20 20  mtSql,0)==0.    
15460 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
15470 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
15480 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
15490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
154a0 2f 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20  /* If the shell 
154b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
154c0 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c  ".explain" mode,
154d0 20 67 61 74 68 65 72 20 74 68 65 20 65 78 74 72   gather the extr
154e0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  a.        ** dat
154f0 61 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 64  a required to ad
15500 64 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65  d indents to the
15510 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20   output.*/.     
15520 20 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f     if( pArg->cMo
15530 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
15540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78   ){.          ex
15550 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
15560 72 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b  re(pArg, pStmt);
15570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15580 20 7d 0a 0a 20 20 20 20 20 20 65 78 65 63 5f 70   }..      exec_p
15590 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72  repared_stmt(pAr
155a0 67 2c 20 70 53 74 6d 74 2c 20 78 43 61 6c 6c 62  g, pStmt, xCallb
155b0 61 63 6b 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ack);.      expl
155c0 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
155d0 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pArg);..      /*
155e0 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61   print usage sta
155f0 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a  ts if stats on *
15600 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15610 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f   && pArg->statsO
15620 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  n ){.        dis
15630 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70  play_stats(db, p
15640 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Arg, 0);.      }
15650 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74  ..      /* print
15660 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69   loop-counters i
15670 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
15680 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
15690 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f  pArg->scanstatsO
156a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  n ){.        dis
156b0 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64  play_scanstats(d
156c0 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20  b, pArg);.      
156d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  }..      /* Fina
156e0 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65  lize the stateme
156f0 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64  nt just executed
15700 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  . If this fails,
15710 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
15720 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72   copy of the err
15730 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65  or message. Othe
15740 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20  rwise, set zSql 
15750 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
15760 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74        ** next st
15770 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
15780 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32  te. */.      rc2
15790 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
157a0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
157b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
157c0 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63  _NOMEM ) rc = rc
157d0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  2;.      if( rc=
157e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
157f0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
15800 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
15810 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
15820 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
15830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15840 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
15850 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
15860 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64  = save_err_msg(d
15870 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  b);.      }..   
15880 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65     /* clear save
15890 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f  d stmt handle */
158a0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
158b0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
158c0 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20  >pStmt = NULL;. 
158d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
158e0 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f   /* end while */
158f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15900 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
15910 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c  memory previousl
15920 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  y allocated by t
15930 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29  ableColumnList()
15940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15950 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
15960 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
15970 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
15980 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
15990 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
159a0 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ree(azCol[i]);. 
159b0 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d   }.  /* azCol[0]
159c0 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72   is a static str
159d0 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
159e0 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a  _free(azCol);.}.
159f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15a00 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73  list of pointers
15a10 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63   to strings whic
15a20 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  h are the names 
15a30 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e  of all.** column
15a40 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e  s in table zTab.
15a50 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f     The memory to
15a60 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
15a70 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  is dynamically.*
15a80 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
15a90 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64  must be released
15aa0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
15ab0 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e  sing a subsequen
15ac0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65  t call.** to fre
15ad0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a  eColumnList()..*
15ae0 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30  *.** The azCol[0
15af0 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c  ] entry is usual
15b00 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65  ly NULL.  Howeve
15b10 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61  r, if zTab conta
15b20 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76  ins a rowid.** v
15b30 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20  alue that needs 
15b40 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c  to be preserved,
15b50 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69   then azCol[0] i
15b60 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
15b70 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
15b80 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  the rowid column
15b90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
15ba0 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  t regular column
15bb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73   in the table is
15bc0 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20   azCol[1].  The 
15bd0 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74  list is terminat
15be0 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72  ed.** by an entr
15bf0 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d  y with azCol[i]=
15c00 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  =0..*/.static ch
15c10 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e  ar **tableColumn
15c20 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20  List(ShellState 
15c30 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
15c40 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a  zTab){.  char **
15c50 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  azCol = 0;.  sql
15c60 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
15c70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
15c80 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a    int nCol = 0;.
15c90 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
15ca0 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b  ;.  int nPK = 0;
15cb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15cc0 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20   of PRIMARY KEY 
15cd0 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a  columns seen */.
15ce0 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b    int isIPK = 0;
15cf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
15d00 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  one PRIMARY KEY 
15d10 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49  column of type I
15d20 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20  NTEGER */.  int 
15d30 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20  preserveRowid = 
15d40 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
15d50 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
15d60 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  wid);.  int rc;.
15d70 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
15d80 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
15d90 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22  A table_info=%Q"
15da0 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20  , zTab);.  rc = 
15db0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
15dc0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
15dd0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
15de0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15df0 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
15e00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
15e10 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
15e20 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
15e30 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ROW ){.    if( n
15e40 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b  Col>=nAlloc-2 ){
15e50 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20  .      nAlloc = 
15e60 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20  nAlloc*2 + nCol 
15e70 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f  + 10;.      azCo
15e80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  l = sqlite3_real
15e90 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f  loc(azCol, nAllo
15ea0 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  c*sizeof(azCol[0
15eb0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
15ec0 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCol==0 ){.     
15ed0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
15ee0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
15ef0 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
15f00 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
15f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15f20 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c      azCol[++nCol
15f30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
15f40 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
15f50 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
15f60 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
15f70 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
15f80 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29  _int(pStmt, 5) )
15f90 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20  {.      nPK++;. 
15fa0 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a       if( nPK==1.
15fb0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
15fc0 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74  3_stricmp((const
15fd0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
15fe0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
15ff0 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,2),.           
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16010 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
16020 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73     ){.        is
16030 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  IPK = 1;.      }
16040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
16050 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  IPK = 0;.      }
16060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
16070 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
16080 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f  tmt);.  if( azCo
16090 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
160a0 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b  .  azCol[0] = 0;
160b0 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d  .  azCol[nCol+1]
160c0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 0;..  /* The 
160d0 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74  decision of whet
160e0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77  her or not a row
160f0 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20  id really needs 
16100 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a  to be preserved.
16110 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20    ** is tricky. 
16120 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74   We never need t
16130 6f 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77  o preserve a row
16140 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  id for a WITHOUT
16150 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a   ROWID table.  *
16160 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74  * or a table wit
16170 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  h an INTEGER PRI
16180 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72  MARY KEY.  We ar
16190 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73  e unable to pres
161a0 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73  erve.  ** rowids
161b0 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65   on tables where
161c0 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e   the rowid is in
161d0 61 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75  accessible becau
161e0 73 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  se there are oth
161f0 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  er.  ** columns 
16200 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  in the table nam
16210 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f  ed "rowid", "_ro
16220 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22  wid_", and "oid"
16230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
16240 73 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73  serveRowid && is
16250 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  IPK ){.    /* If
16260 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52   a single PRIMAR
16270 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74  Y KEY column wit
16280 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77  h type INTEGER w
16290 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74  as seen, then it
162a0 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
162b0 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68   an alise for th
162c0 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74  e ROWID.  But it
162d0 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
162e0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
162f0 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61     ** table or a
16300 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
16310 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e   KEY DESC column
16320 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69  , neither of whi
16330 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f  ch are.    ** RO
16340 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f  WID aliases.  To
16350 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65   distinguish the
16360 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20  se cases, check 
16370 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  to see if.    **
16380 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22   there is a "pk"
16390 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d   entry in "PRAGM
163a0 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20  A index_list".  
163b0 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20  There will be.  
163c0 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64    ** no "pk" ind
163d0 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52  ex if the PRIMAR
163e0 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20  Y KEY really is 
163f0 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
16400 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20   ROWID..    */. 
16410 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
16420 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
16430 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  T 1 FROM pragma_
16440 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a  index_list(%Q)".
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
16470 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c  RE origin='pk'",
16480 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d   zTab);.    rc =
16490 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
164a0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
164b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
164c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
164d0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
164e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65   rc ){.      fre
164f0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
16500 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
16510 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63   0;.    }.    rc
16520 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
16530 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
16540 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
16550 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76  mt);.    preserv
16560 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c  eRowid = rc==SQL
16570 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69  ITE_ROW;.  }.  i
16580 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  f( preserveRowid
16590 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
165a0 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77  preserve the row
165b0 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e  id if we can fin
165c0 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  d a name to use 
165d0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
165e0 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74  owid */.    stat
165f0 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64  ic char *azRowid
16600 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20  [] = { "rowid", 
16610 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22  "_rowid_", "oid"
16620 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   };.    int i, j
16630 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16640 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
16650 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c  for(i=1; i<=nCol
16660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16670 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
16680 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61  cmp(azRowid[j],a
16690 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72  zCol[i])==0 ) br
166a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
166b0 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b     if( i>nCol ){
166c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
166d0 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
166e0 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  ow that azRowid[
166f0 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  j] is not the na
16700 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20  me of any.      
16710 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f    ** ordinary co
16720 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
16730 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  e.  Verify that 
16740 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20  azRowid[j] is a 
16750 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a  valid.        **
16760 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f   name for the ro
16770 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e  wid before addin
16780 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d  g it to azCol[0]
16790 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  .  WITHOUT ROWID
167a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
167b0 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69  es will fail thi
167c0 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a  s last check */.
167d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
167e0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
167f0 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
16800 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b  ,0,zTab,azRowid[
16810 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  j],0,0,0,0,0);. 
16820 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16830 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c  QLITE_OK ) azCol
16840 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d  [0] = azRowid[j]
16850 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16870 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f   }.  return azCo
16880 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67  l;.}../*.** Togg
16890 6c 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75  le the reverse_u
168a0 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
168b0 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   setting..*/.sta
168c0 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53  tic void toggleS
168d0 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74  electOrder(sqlit
168e0 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74  e3 *db){.  sqlit
168f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
16900 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69   0;.  int iSetti
16910 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ng = 0;.  char z
16920 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  Stmt[100];.  sql
16930 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
16940 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65  db, "PRAGMA reve
16950 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
16960 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74  lects", -1, &pSt
16970 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  mt, 0);.  if( sq
16980 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
16990 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
169a0 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20  .    iSetting = 
169b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
169c0 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
169d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
169e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73  lize(pStmt);.  s
169f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
16a00 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a  sizeof(zStmt), z
16a10 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52  Stmt,.       "PR
16a20 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
16a30 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25  rdered_selects(%
16a40 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b  d)", !iSetting);
16a50 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
16a60 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c  db, zStmt, 0, 0,
16a70 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
16a80 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  is is a differen
16a90 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  t callback routi
16aa0 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70  ne used for dump
16ab0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
16ac0 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65  ..** Each row re
16ad0 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63  ceived by this c
16ae0 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  allback consists
16af0 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
16b00 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74  ,.** the table t
16b10 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20  ype ("index" or 
16b20 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c  "table") and SQL
16b30 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
16b40 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  able..** This ro
16b50 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69  utine should pri
16b60 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65  nt text sufficie
16b70 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  nt to recreate t
16b80 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
16b90 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c  tic int dump_cal
16ba0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
16bb0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
16bc0 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
16bd0 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69  *azNotUsed){.  i
16be0 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
16bf0 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
16c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
16c10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16c20 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61  zSql;.  ShellSta
16c30 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
16c40 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55  ate *)pArg;..  U
16c50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16c60 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  azNotUsed);.  if
16c70 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41  ( nArg!=3 || azA
16c80 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
16c90 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41  ;.  zTable = azA
16ca0 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d  rg[0];.  zType =
16cb0 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71   azArg[1];.  zSq
16cc0 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20  l = azArg[2];.. 
16cd0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
16ce0 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
16cf0 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
16d00 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
16d10 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
16d20 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
16d30 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
16d40 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
16d50 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f  ob("sqlite_stat?
16d60 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b  ", zTable)==0 ){
16d70 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
16d80 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
16d90 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
16da0 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
16db0 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c   strncmp(zTable,
16dc0 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
16dd0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16de0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
16df0 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52  trncmp(zSql, "CR
16e00 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
16e10 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20  LE", 20)==0 ){. 
16e20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20     char *zIns;. 
16e30 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61     if( !p->writa
16e40 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
16e50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
16e60 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
16e70 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
16e80 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
16e90 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
16ea0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
16eb0 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ns = sqlite3_mpr
16ec0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e  intf(.       "IN
16ed0 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
16ee0 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d  _master(type,nam
16ef0 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
16f00 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20  age,sql)".      
16f10 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27   "VALUES('table'
16f20 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71  ,'%q','%q',0,'%q
16f30 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61  ');",.       zTa
16f40 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71  ble, zTable, zSq
16f50 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
16f60 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
16f70 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73  n", zIns);.    s
16f80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
16f90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
16fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
16fb0 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
16fc0 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e  >out, zSql, ";\n
16fd0 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  ");.  }..  if( s
16fe0 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
16ff0 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
17000 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
17010 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  t;.    ShellText
17020 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61   sTable;.    cha
17030 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69  r **azCol;.    i
17040 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a  nt i;.    char *
17050 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
17060 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64      int savedMod
17070 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20  e;..    azCol = 
17080 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
17090 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  p, zTable);.    
170a0 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a  if( azCol==0 ){.
170b0 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b        p->nErr++;
170c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
170d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
170e0 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20  lways quote the 
170f0 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e  table name, even
17100 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74   if it appears t
17110 6f 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c  o be pure ascii,
17120 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
17130 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e  it is a keyword.
17140 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54   Ex:  INSERT INT
17150 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f  O "table" ... */
17160 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
17170 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65  Table);.    appe
17180 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
17190 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
171a0 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  r(zTable));.    
171b0 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67  /* If preserving
171c0 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20   the rowid, add 
171d0 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66  a column list af
171e0 74 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ter the table na
171f0 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74  me..    ** In ot
17200 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53  her words:  "INS
17210 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77  ERT INTO tab(row
17220 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41  id,a,b,c,...) VA
17230 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a  LUES(...)".    *
17240 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
17250 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49   usual "INSERT I
17260 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e  NTO tab VALUES(.
17270 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17280 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
17290 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
172a0 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20  t(&sTable, "(", 
172b0 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
172c0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
172d0 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  Col[0], 0);.    
172e0 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
172f0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
17300 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
17310 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a  Table, ",", 0);.
17320 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
17330 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
17340 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
17350 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
17360 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
17370 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29  Text(&sTable, ")
17380 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ", 0);.    }..  
17390 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70    /* Build an ap
173a0 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54  propriate SELECT
173b0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
173c0 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c    initText(&sSel
173d0 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ect);.    append
173e0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
173f0 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
17400 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29    if( azCol[0] )
17410 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
17420 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
17430 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
17440 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
17450 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  lect, ",", 0);. 
17460 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31     }.    for(i=1
17470 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
17480 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
17490 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
174a0 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
174b0 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20  (azCol[i]));.   
174c0 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31     if( azCol[i+1
174d0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ] ){.        app
174e0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
174f0 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
17500 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
17510 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
17520 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  l);.    appendTe
17530 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46  xt(&sSelect, " F
17540 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61  ROM ", 0);.    a
17550 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
17560 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74  ct, zTable, quot
17570 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a  eChar(zTable));.
17580 0a 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61  .    savedDestTa
17590 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61  ble = p->zDestTa
175a0 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f  ble;.    savedMo
175b0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
175c0 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
175d0 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20  = sTable.z;.    
175e0 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f  p->mode = p->cMo
175f0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
17600 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  ;.    rc = shell
17610 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65  _exec(p->db, sSe
17620 6c 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61  lect.z, shell_ca
17630 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20  llback, p, 0);. 
17640 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
17650 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
17660 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
17670 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
17680 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e  ***** CORRUPTION
17690 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c   ERROR *******/\
176a0 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c  n");.      toggl
176b0 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e  eSelectOrder(p->
176c0 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  db);.      shell
176d0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65  _exec(p->db, sSe
176e0 6c 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61  lect.z, shell_ca
176f0 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20  llback, p, 0);. 
17700 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63       toggleSelec
17710 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20  tOrder(p->db);. 
17720 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73     }.    p->zDes
17730 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65  tTable = savedDe
17740 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e  stTable;.    p->
17750 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65  mode = savedMode
17760 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
17770 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65  sTable);.    fre
17780 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
17790 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d  .    if( rc ) p-
177a0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
177b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
177c0 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
177d0 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
177e0 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
177f0 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
17800 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
17810 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
17820 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
17830 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
17840 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
17850 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
17860 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
17870 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
17880 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
17890 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
178a0 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
178b0 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
178c0 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
178d0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
178e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
178f0 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Query.){.  int r
17900 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
17910 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
17920 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
17930 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c  zQuery, dump_cal
17940 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
17950 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17960 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
17970 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20    char *zQ2;.   
17980 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
17990 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  n30(zQuery);.   
179a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
179b0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
179c0 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
179d0 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
179e0 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
179f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
17a00 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25  >out, "/****** %
17a10 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
17a20 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
17a30 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
17a40 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20       zErr = 0;. 
17a50 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d     }.    zQ2 = m
17a60 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
17a70 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
17a80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17a90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
17aa0 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c  tf(len+100, zQ2,
17ab0 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f   "%s ORDER BY ro
17ac0 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72  wid DESC", zQuer
17ad0 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
17ae0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
17af0 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62   zQ2, dump_callb
17b00 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
17b10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
17b20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
17b30 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
17b40 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a   ERROR: %s *****
17b50 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
17b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
17b70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
17b80 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
17b90 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
17ba0 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b  ;.    free(zQ2);
17bb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  ;.}../*.** Text 
17bd0 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67  of a help messag
17be0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
17bf0 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20 64   zHelp[] =.#if d
17c00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
17c10 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66  VE_ZLIB) && !def
17c20 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17c30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
17c40 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20   ".archive ...  
17c50 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20           Manage 
17c60 53 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c 22  SQL archives: \"
17c70 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c  .archive --help\
17c80 22 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e 22  " for details\n"
17c90 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
17ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
17cb0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75  ORIZATION.  ".au
17cc0 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  th ON|OFF       
17cd0 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72 69      Show authori
17ce0 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e 22  zer callbacks\n"
17cf0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b  .#endif.  ".back
17d00 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  up ?DB? FILE    
17d10 20 20 42 61 63 6b 75 70 20 44 42 20 28 64 65 66    Backup DB (def
17d20 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74  ault \"main\") t
17d30 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62 61  o FILE\n".  ".ba
17d40 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  il on|off       
17d50 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20 68      Stop after h
17d60 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  itting an error.
17d70 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22    Default OFF\n"
17d80 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f  .  ".binary on|o
17d90 66 66 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  ff         Turn 
17da0 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e  binary output on
17db0 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c   or off.  Defaul
17dc0 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64 20  t OFF\n".  ".cd 
17dd0 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20 20  DIRECTORY       
17de0 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f     Change the wo
17df0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
17e00 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 0a  to DIRECTORY\n".
17e10 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f    ".changes on|o
17e20 66 66 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e  ff        Show n
17e30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68  umber of rows ch
17e40 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22 0a  anged by SQL\n".
17e50 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20    ".check GLOB  
17e60 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69            Fail i
17e70 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e  f output since .
17e80 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f  testcase does no
17e90 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e 63  t match\n".  ".c
17ea0 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20  lone NEWDB      
17eb0 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20       Clone data 
17ec0 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20  into NEWDB from 
17ed0 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
17ee0 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74  abase\n".  ".dat
17ef0 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20  abases          
17f00 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e     List names an
17f10 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63  d files of attac
17f20 68 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22  hed databases\n"
17f30 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f  .  ".dbinfo ?DB?
17f40 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
17f50 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69  status informati
17f60 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74  on about the dat
17f70 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75 6d  abase\n".  ".dum
17f80 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20  p ?TABLE? ...   
17f90 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74 61     Dump the data
17fa0 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20 74  base in an SQL t
17fb0 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20 20  ext format\n".  
17fc0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
17fd0 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
17fe0 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e  LE specified, on
17ff0 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20 6d  ly dump tables m
18000 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20  atching\n".  "  
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74         LIKE patt
18030 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20  ern TABLE.\n".  
18040 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20  ".echo on|off   
18050 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d          Turn com
18060 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20  mand echo on or 
18070 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20 6f  off\n".  ".eqp o
18080 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20 20  n|off|full      
18090 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
180a0 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50  le automatic EXP
180b0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 5c  LAIN QUERY PLAN\
180c0 6e 22 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20  n".  ".excel    
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73               Dis
180e0 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20  play the output 
180f0 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20  of next command 
18100 69 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74  in a spreadsheet
18110 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20  \n".  ".exit    
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
18130 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c  it this program\
18140 6e 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20  n".  ".expert   
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 50               EXP
18160 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65  ERIMENTAL. Sugge
18170 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73  st indexes for s
18180 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65 73  pecified queries
18190 5c 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20 65  \n"./* Because e
181a0 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65  xplain mode come
181b0 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  s on automatical
181c0 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78  ly now, the ".ex
181d0 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69  plain" mode.** i
181e0 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
181f0 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20  he help screen. 
18200 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70   It is still sup
18210 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63  ported for legac
18220 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a  y, however */./*
18230 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66  ".explain ?on|of
18240 66 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58 50  f|auto? Turn EXP
18250 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65  LAIN output mode
18260 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f   on or off or to
18270 20 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a   automatic\n"*/.
18280 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f    ".fullschema ?
18290 2d 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73  --indent? Show s
182a0 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f  chema and the co
182b0 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f  ntent of sqlite_
182c0 73 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20  stat tables\n". 
182d0 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66   ".headers on|of
182e0 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 64 69  f        Turn di
182f0 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73  splay of headers
18300 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
18310 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20  ".help          
18320 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69          Show thi
18330 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22  s message\n".  "
18340 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42  .import FILE TAB
18350 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61  LE     Import da
18360 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74  ta from FILE int
18370 6f 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64  o TABLE\n".#ifnd
18380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
18390 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e  EST_CONTROL.  ".
183a0 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54  imposter INDEX T
183b0 41 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d 70  ABLE  Create imp
183c0 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c  oster table TABL
183d0 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58  E on index INDEX
183e0 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69  \n".#endif.  ".i
183f0 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20  ndexes ?TABLE?  
18400 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20       Show names 
18410 6f 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e  of all indexes\n
18420 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
18440 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64   TABLE specified
18450 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65  , only show inde
18460 78 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e  xes for tables\n
18470 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
18490 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74  tching LIKE patt
184a0 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69  ern TABLE.\n".#i
184b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
184c0 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69  LE_IOTRACE.  ".i
184d0 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20  otrace FILE     
184e0 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20       Enable I/O 
184f0 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69  diagnostic loggi
18500 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65  ng to FILE\n".#e
18510 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f  ndif.  ".limit ?
18520 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44  LIMIT? ?VAL?   D
18530 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65  isplay or change
18540 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e   the value of an
18550 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22   SQLITE_LIMIT\n"
18560 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e  .  ".lint OPTION
18570 53 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72  S          Repor
18580 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65  t potential sche
18590 6d 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69 6f  ma issues. Optio
185a0 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ns:\n".  "      
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185c0 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20     fkey-indexes 
185d0 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67      Find missing
185e0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64   foreign key ind
185f0 65 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20  exes\n".#ifndef 
18600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
18610 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c  _EXTENSION.  ".l
18620 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f  oad FILE ?ENTRY?
18630 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74       Load an ext
18640 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e  ension library\n
18650 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67  ".#endif.  ".log
18660 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20   FILE|off       
18670 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20     Turn logging 
18680 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45  on or off.  FILE
18690 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73   can be stderr/s
186a0 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64  tdout\n".  ".mod
186b0 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20  e MODE ?TABLE?  
186c0 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f     Set output mo
186d0 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73  de where MODE is
186e0 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20   one of:\n".  " 
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 20 20 20 20 61 73 63 69 69 20 20 20          ascii   
18710 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65   Columns/rows de
18720 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20  limited by 0x1F 
18730 61 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22 20  and 0x1E\n".  " 
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20 20          csv     
18760 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   Comma-separated
18770 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20   values\n".  "  
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18790 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20         column   
187a0 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c  Left-aligned col
187b0 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64  umns.  (See .wid
187c0 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  th)\n".  "      
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187e0 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c     html     HTML
187f0 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22   <table> code\n"
18800 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73               ins
18820 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74  ert   SQL insert
18830 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20   statements for 
18840 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20  TABLE\n".  "    
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e       line     On
18870 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65  e value per line
18880 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20  list     Values 
188b0 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c  delimited by \"|
188c0 5c 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  \"\n".  "       
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70    quote    Escap
188f0 65 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72  e answers as for
18900 20 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20   SQL\n".  "     
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62      tabs     Tab
18930 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
18940 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69   tcl      TCL li
18970 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20  st elements\n". 
18980 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
18990 49 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52  ING      Use STR
189a0 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ING in place of 
189b0 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20  NULL values\n". 
189c0 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46   ".once (-e|-x|F
189d0 49 4c 45 29 20 20 20 20 20 4f 75 74 70 75 74 20  ILE)     Output 
189e0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c  for the next SQL
189f0 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f   command only to
18a00 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20   FILE\n".  "    
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 20 20 6f 72 20 69 6e 76 6f 6b 65 20 73       or invoke s
18a30 79 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f  ystem text edito
18a40 72 20 28 2d 65 29 20 6f 72 20 73 70 72 65 61 64  r (-e) or spread
18a50 73 68 65 65 74 20 28 2d 78 29 5c 6e 22 0a 20 20  sheet (-x)\n".  
18a60 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18a70 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65            on the
18a80 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 22 2e   output.\n".  ".
18a90 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f  open ?OPTIONS? ?
18aa0 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69 73  FILE? Close exis
18ab0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e  ting database an
18ac0 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e 22  d reopen FILE\n"
18ad0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
18af0 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73 74   --new option st
18b00 61 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70  arts with an emp
18b10 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 2e 6f  ty file\n".  ".o
18b20 75 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20  utput ?FILE?    
18b30 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
18b40 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f   to FILE or stdo
18b50 75 74 5c 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20  ut\n".  ".print 
18b60 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20  STRING...       
18b70 50 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54  Print literal ST
18b80 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d  RING\n".  ".prom
18b90 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45  pt MAIN CONTINUE
18ba0 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74    Replace the st
18bb0 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e  andard prompts\n
18bc0 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20  ".  ".quit      
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
18be0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22   this program\n"
18bf0 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41  .  ".read FILENA
18c00 4d 45 20 20 20 20 20 20 20 20 20 45 78 65 63 75  ME         Execu
18c10 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41  te SQL in FILENA
18c20 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72  ME\n".  ".restor
18c30 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20  e ?DB? FILE     
18c40 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20  Restore content 
18c50 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  of DB (default \
18c60 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49  "main\") from FI
18c70 4c 45 5c 6e 22 0a 20 20 22 2e 73 61 76 65 20 46  LE\n".  ".save F
18c80 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
18c90 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  Write in-memory 
18ca0 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49  database into FI
18cb0 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74  LE\n".  ".scanst
18cc0 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ats on|off      
18cd0 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  Turn sqlite3_stm
18ce0 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d  t_scanstatus() m
18cf0 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66  etrics on or off
18d00 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f  \n".  ".schema ?
18d10 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20 53 68  PATTERN?      Sh
18d20 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ow the CREATE st
18d30 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e  atements matchin
18d40 67 20 50 41 54 54 45 52 4e 5c 6e 22 0a 20 20 22  g PATTERN\n".  "
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 20 20 20 20 20 20 20 20 41 64 64 20 2d 2d            Add --
18d70 69 6e 64 65 6e 74 20 66 6f 72 20 70 72 65 74 74  indent for prett
18d80 79 2d 70 72 69 6e 74 69 6e 67 5c 6e 22 0a 20 20  y-printing\n".  
18d90 22 2e 73 65 6c 66 74 65 73 74 20 3f 2d 2d 69 6e  ".selftest ?--in
18da0 69 74 3f 20 20 20 20 20 52 75 6e 20 74 65 73 74  it?     Run test
18db0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
18dc0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 5c   SELFTEST table\
18dd0 6e 22 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72  n".  ".separator
18de0 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 43 68 61   COL ?ROW?   Cha
18df0 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73  nge the column s
18e00 65 70 61 72 61 74 6f 72 20 61 6e 64 20 6f 70 74  eparator and opt
18e10 69 6f 6e 61 6c 6c 79 20 74 68 65 20 72 6f 77 5c  ionally the row\
18e20 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18e40 65 70 61 72 61 74 6f 72 20 66 6f 72 20 62 6f 74  eparator for bot
18e50 68 20 74 68 65 20 6f 75 74 70 75 74 20 6d 6f 64  h the output mod
18e60 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22  e and .import\n"
18e70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18e80 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
18e90 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20  ON).  ".session 
18ea0 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 43 72  CMD ...       Cr
18eb0 65 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20  eate or control 
18ec0 73 65 73 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64  sessions\n".#end
18ed0 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 3f  if.  ".sha3sum ?
18ee0 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d  OPTIONS...?  Com
18ef0 70 75 74 65 20 61 20 53 48 41 33 20 68 61 73 68  pute a SHA3 hash
18f00 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
18f10 74 65 6e 74 5c 6e 22 0a 23 69 66 6e 64 65 66 20  tent\n".#ifndef 
18f20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
18f30 53 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43  STEM.  ".shell C
18f40 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 52  MD ARGS...     R
18f50 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
18f60 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
18f70 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73  \n".#endif.  ".s
18f80 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  how             
18f90 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75       Show the cu
18fa0 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
18fb0 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67   various setting
18fc0 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 3f  s\n".  ".stats ?
18fd0 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 53  on|off?        S
18fe0 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72  how stats or tur
18ff0 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66  n stats on or of
19000 66 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c  f\n".#ifndef SQL
19010 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
19020 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44  M.  ".system CMD
19030 20 41 52 47 53 2e 2e 2e 20 20 20 20 52 75 6e 20   ARGS...    Run 
19040 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61  CMD ARGS... in a
19050 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22   system shell\n"
19060 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c  .#endif.  ".tabl
19070 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20  es ?TABLE?      
19080 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20    List names of 
19090 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20  tables\n".  "   
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
190c0 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c  pecified, only l
190d0 69 73 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ist tables match
190e0 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ing\n".  "      
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20     LIKE pattern 
19110 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 65  TABLE.\n".  ".te
19120 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20  stcase NAME     
19130 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72 65      Begin redire
19140 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20  cting output to 
19150 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  'testcase-out.tx
19160 74 27 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75  t'\n".  ".timeou
19170 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20  t MS            
19180 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b  Try opening lock
19190 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53  ed tables for MS
191a0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22   milliseconds\n"
191b0 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66  .  ".timer on|of
191c0 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
191d0 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20  SQL timer on or 
191e0 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65  off\n".  ".trace
191f0 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20   FILE|off       
19200 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c   Output each SQL
19210 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
19220 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76   is run\n".  ".v
19230 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20  fsinfo ?AUX?    
19240 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e       Information
19250 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c   about the top-l
19260 65 76 65 6c 20 56 46 53 5c 6e 22 0a 20 20 22 2e  evel VFS\n".  ".
19270 76 66 73 6c 69 73 74 20 20 20 20 20 20 20 20 20  vfslist         
19280 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61        List all a
19290 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 5c 6e  vailable VFSes\n
192a0 22 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41  ".  ".vfsname ?A
192b0 55 58 3f 20 20 20 20 20 20 20 20 20 50 72 69 6e  UX?         Prin
192c0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
192d0 65 20 56 46 53 20 73 74 61 63 6b 5c 6e 22 0a 20  e VFS stack\n". 
192e0 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55   ".width NUM1 NU
192f0 4d 32 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f 6c  M2 ...   Set col
19300 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c  umn widths for \
19310 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e  "column\" mode\n
19320 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 65                Ne
19340 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 72 69  gative values ri
19350 67 68 74 2d 6a 75 73 74 69 66 79 5c 6e 22 0a 3b  ght-justify\n".;
19360 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
19370 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
19380 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ION)./*.** Print
19390 20 68 65 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f   help informatio
193a0 6e 20 66 6f 72 20 74 68 65 20 22 2e 73 65 73 73  n for the ".sess
193b0 69 6f 6e 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f  ions" command.*/
193c0 0a 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 68 65  .void session_he
193d0 6c 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  lp(ShellState *p
193e0 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  ){.  raw_printf(
193f0 70 2d 3e 6f 75 74 2c 0a 20 20 20 20 22 2e 73 65  p->out,.    ".se
19400 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55 42  ssion ?NAME? SUB
19410 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 2e 2e 2e  COMMAND ?ARGS...
19420 3f 5c 6e 22 0a 20 20 20 20 22 49 66 20 3f 4e 41  ?\n".    "If ?NA
19430 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20  ME? is omitted, 
19440 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e 65  the first define
19450 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65  d session is use
19460 64 2e 5c 6e 22 0a 20 20 20 20 22 53 75 62 63 6f  d.\n".    "Subco
19470 6d 6d 61 6e 64 73 3a 5c 6e 22 0a 20 20 20 20 22  mmands:\n".    "
19480 20 20 20 61 74 74 61 63 68 20 54 41 42 4c 45 20     attach TABLE 
19490 20 20 20 20 20 20 20 20 20 20 20 20 41 74 74 61              Atta
194a0 63 68 20 54 41 42 4c 45 5c 6e 22 0a 20 20 20 20  ch TABLE\n".    
194b0 22 20 20 20 63 68 61 6e 67 65 73 65 74 20 46 49  "   changeset FI
194c0 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72 69  LE           Wri
194d0 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 69  te a changeset i
194e0 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 20 20  nto FILE\n".    
194f0 22 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20  "   close       
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
19510 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 5c 6e  se one session\n
19520 22 0a 20 20 20 20 22 20 20 20 65 6e 61 62 6c 65  ".    "   enable
19530 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
19540 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20     Set or query 
19550 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 5c 6e  the enable bit\n
19560 22 0a 20 20 20 20 22 20 20 20 66 69 6c 74 65 72  ".    "   filter
19570 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20   GLOB...        
19580 20 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73     Reject tables
19590 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 5c   matching GLOBs\
195a0 6e 22 0a 20 20 20 20 22 20 20 20 69 6e 64 69 72  n".    "   indir
195b0 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20  ect ?BOOLEAN?   
195c0 20 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72      Mark or quer
195d0 79 20 74 68 65 20 69 6e 64 69 72 65 63 74 20 73  y the indirect s
195e0 74 61 74 75 73 5c 6e 22 0a 20 20 20 20 22 20 20  tatus\n".    "  
195f0 20 69 73 65 6d 70 74 79 20 20 20 20 20 20 20 20   isempty        
19600 20 20 20 20 20 20 20 20 20 20 51 75 65 72 79 20            Query 
19610 77 68 65 74 68 65 72 20 74 68 65 20 73 65 73 73  whether the sess
19620 69 6f 6e 20 69 73 20 65 6d 70 74 79 5c 6e 22 0a  ion is empty\n".
19630 20 20 20 20 22 20 20 20 6c 69 73 74 20 20 20 20      "   list    
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 4c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20   List currently 
19660 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d  open session nam
19670 65 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 6f 70  es\n".    "   op
19680 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20 20  en DB NAME      
19690 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e 65         Open a ne
196a0 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42 5c  w session on DB\
196b0 6e 22 0a 20 20 20 20 22 20 20 20 70 61 74 63 68  n".    "   patch
196c0 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20  set FILE        
196d0 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74 63      Write a patc
196e0 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e  hset into FILE\n
196f0 22 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ".  );.}.#endif.
19700 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
19710 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
19720 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70   int process_inp
19730 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ut(ShellState *p
19740 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a  , FILE *in);../*
19750 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
19760 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61  tent of file zNa
19770 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  me into memory o
19780 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
19790 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a  ite3_malloc64().
197a0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ** and return a 
197b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
197c0 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65  uffer. The calle
197d0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
197e0 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20   for freeing.** 
197f0 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  the memory..**.*
19800 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 70  * If parameter p
19810 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c  nByte is not NUL
19820 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20  L, (*pnByte) is 
19830 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
19840 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65  r of bytes.** re
19850 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f  ad..**.** For co
19860 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c  nvenience, a nul
19870 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
19880 20 69 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e   is always appen
19890 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
198a0 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  read.** from the
198b0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
198c0 20 62 75 66 66 65 72 20 69 73 20 72 65 74 75 72   buffer is retur
198d0 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65 20 69  ned. This byte i
198e0 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69  s not included i
198f0 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76  n.** the final v
19900 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65  alue of (*pnByte
19910 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65  ), if applicable
19920 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20  ..**.** NULL is 
19930 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20  returned if any 
19940 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
19950 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20  ered. The final 
19960 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65  value of *pnByte
19970 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64  .** is undefined
19980 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
19990 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
199a0 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  eadFile(const ch
199b0 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a  ar *zName, int *
199c0 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20  pnByte){.  FILE 
199d0 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d  *in = fopen(zNam
199e0 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67  e, "rb");.  long
199f0 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e   nIn;.  size_t n
19a00 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42  Read;.  char *pB
19a10 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  uf;.  if( in==0 
19a20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73  ) return 0;.  fs
19a30 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f  eek(in, 0, SEEK_
19a40 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74  END);.  nIn = ft
19a50 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e  ell(in);.  rewin
19a60 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20  d(in);.  pBuf = 
19a70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
19a80 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28  ( nIn+1 );.  if(
19a90 20 70 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72   pBuf==0 ) retur
19aa0 6e 20 30 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66  n 0;.  nRead = f
19ab0 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20  read(pBuf, nIn, 
19ac0 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65  1, in);.  fclose
19ad0 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61  (in);.  if( nRea
19ae0 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  d!=1 ){.    sqli
19af0 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a  te3_free(pBuf);.
19b00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19b10 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20  }.  pBuf[nIn] = 
19b20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20  0;.  if( pnByte 
19b30 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b  ) *pnByte = nIn;
19b40 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
19b50 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
19b60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
19b70 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  SION)./*.** Clos
19b80 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53  e a single OpenS
19b90 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e  ession object an
19ba0 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  d release all of
19bb0 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a   its associated.
19bc0 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ** resources..*/
19bd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
19be0 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53  sion_close(OpenS
19bf0 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
19c00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
19c10 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c  lite3session_del
19c20 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29  ete(pSession->p)
19c30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
19c40 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65  (pSession->zName
19c50 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
19c60 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
19c70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
19c80 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
19c90 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29  on->azFilter[i])
19ca0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
19cb0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61  free(pSession->a
19cc0 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73  zFilter);.  mems
19cd0 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20  et(pSession, 0, 
19ce0 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69  sizeof(OpenSessi
19cf0 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  on));.}.#endif..
19d00 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
19d10 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
19d20 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20  cts and release 
19d30 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72  all associated r
19d40 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66  esources..*/.#if
19d50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19d60 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
19d70 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
19d80 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68  ion_close_all(Sh
19d90 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
19da0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
19db0 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
19dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69   i++){.    sessi
19dd0 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65  on_close(&p->aSe
19de0 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20  ssion[i]);.  }. 
19df0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30   p->nSession = 0
19e00 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
19e10 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  ne session_close
19e20 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a  _all(X).#endif..
19e30 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
19e40 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c  tion of the xFil
19e50 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ter function for
19e60 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e   an open session
19e70 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74  .  Omit.** any t
19e80 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22  ables named by "
19e90 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22  .session filter"
19ea0 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68   but let all oth
19eb0 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68  er table through
19ec0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
19ed0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
19ee0 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69  ESSION).static i
19ef0 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65  nt session_filte
19f00 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f  r(void *pCtx, co
19f10 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b  nst char *zTab){
19f20 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a  .  OpenSession *
19f30 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e  pSession = (Open
19f40 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20  Session*)pCtx;. 
19f50 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
19f60 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
19f70 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
19f80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
19f90 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e  rglob(pSession->
19fa0 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61  azFilter[i], zTa
19fb0 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  b)==0 ) return 0
19fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
19fd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19fe0 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63 65 20  * Try to deduce 
19ff0 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c 65  the type of file
1a000 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65 64   for zName based
1a010 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e   on its content.
1a020 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20    Return.** one 
1a030 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45  of the SHELL_OPE
1a040 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a  N_* constants..*
1a050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 64  /.static int ded
1a060 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
1a070 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1a080 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20  e){.  FILE *f = 
1a090 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62  fopen(zName, "rb
1a0a0 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a  ");.  size_t n;.
1a0b0 20 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c    int rc = SHELL
1a0c0 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20  _OPEN_UNSPEC;.  
1a0d0 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1a0e0 20 20 69 66 28 20 66 3d 3d 30 20 29 20 72 65 74    if( f==0 ) ret
1a0f0 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  urn SHELL_OPEN_N
1a100 4f 52 4d 41 4c 3b 0a 20 20 66 73 65 65 6b 28 66  ORMAL;.  fseek(f
1a110 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29  , -25, SEEK_END)
1a120 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42  ;.  n = fread(zB
1a130 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20  uf, 25, 1, f);. 
1a140 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d   if( n==1 && mem
1a150 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61 72 74  cmp(zBuf, "Start
1a160 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31  -Of-SQLite3-", 1
1a170 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  7)==0 ){.    rc 
1a180 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  = SHELL_OPEN_APP
1a190 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b  ENDVFS;.  }else{
1a1a0 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20 2d 32  .    fseek(f, -2
1a1b0 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  2, SEEK_END);.  
1a1c0 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
1a1d0 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20  , 22, 1, f);.   
1a1e0 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75   if( n==1 && zBu
1a1f0 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42  f[0]==0x50 && zB
1a200 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a  uf[1]==0x4b && z
1a210 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20  Buf[2]==0x05.   
1a220 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d      && zBuf[3]==
1a230 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20 72 63  0x06 ){.      rc
1a240 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49   = SHELL_OPEN_ZI
1a250 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  PFILE;.    }.  }
1a260 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20  .  fclose(f);.  
1a270 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a  return rc;  .}..
1a280 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1a290 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1a2a0 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20  open.  If it is 
1a2b0 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69  not, then open i
1a2c0 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61  t.  If.** the da
1a2d0 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20  tabase fails to 
1a2e0 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65  open, print an e
1a2f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
1a300 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   exit..*/.static
1a310 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68   void open_db(Sh
1a320 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
1a330 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20 69   keepAlive){.  i
1a340 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
1a350 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69     sqlite3_initi
1a360 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 69 66 28  alize();.    if(
1a370 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1a380 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20  ELL_OPEN_UNSPEC 
1a390 26 26 20 61 63 63 65 73 73 28 70 2d 3e 7a 44 62  && access(p->zDb
1a3a0 46 69 6c 65 6e 61 6d 65 2c 30 29 3d 3d 30 20 29  Filename,0)==0 )
1a3b0 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d  {.      p->openM
1a3c0 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63 65  ode = (u8)deduce
1a3d0 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e  DatabaseType(p->
1a3e0 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
1a3f0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
1a400 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20  p->openMode ){. 
1a410 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1a420 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20  OPEN_APPENDVFS: 
1a430 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a440 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62  3_open_v2(p->zDb
1a450 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
1a460 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  , .           SQ
1a470 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1a480 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1a490 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73  CREATE, "apndvfs
1a4a0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
1a4b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1a4c0 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1a4d0 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _ZIPFILE: {.    
1a4e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
1a4f0 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d  (":memory:", &p-
1a500 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1a510 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1a520 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1a530 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20 20  EN_UNSPEC:.     
1a540 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1a550 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20  _NORMAL: {.     
1a560 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1a570 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1a580 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
1a590 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a5a0 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c      }.    global
1a5b0 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  Db = p->db;.    
1a5c0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  if( p->db==0 || 
1a5d0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1a5e0 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
1a5f0 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
1a600 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
1a610 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20  rror: unable to 
1a620 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22  open database \"
1a630 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  %s\": %s\n",.   
1a640 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c         p->zDbFil
1a650 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  ename, sqlite3_e
1a660 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
1a670 20 20 20 20 20 69 66 28 20 6b 65 65 70 41 6c 69       if( keepAli
1a680 76 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ve ) return;.   
1a690 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
1a6a0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1a6b0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1a6c0 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33  SION.    sqlite3
1a6d0 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
1a6e0 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29  ension(p->db, 1)
1a6f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
1a700 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
1a710 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1a720 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68     sqlite3_shath
1a730 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ree_init(p->db, 
1a740 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1a750 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e  e3_completion_in
1a760 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1a770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1a780 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
1a790 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
1a7a0 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1a7b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
1a7c0 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
1a7d0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1a7e0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1a7f0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1a800 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
1a810 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
1a820 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a840 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
1a850 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
1a860 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1a870 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
1a880 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
1a890 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
1a8a0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
1a8d0 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
1a8e0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1a8f0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1a900 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
1a910 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1a920 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20  8, p,.          
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
1a950 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
1a960 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
1a970 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33  STEM.    sqlite3
1a980 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1a990 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20  (p->db, "edit", 
1a9a0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1a9b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1a9d0 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ditFunc, 0, 0);.
1a9e0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1a9f0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1aa00 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51  b, "edit", 2, SQ
1aa10 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75            editFu
1aa40 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  nc, 0, 0);.#endi
1aa50 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65  f.    if( p->ope
1aa60 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1aa70 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20  N_ZIPFILE ){.   
1aa80 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1aa90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1aaa0 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
1aab0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1aac0 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c  zip USING zipfil
1aad0 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46  e(%Q);", p->zDbF
1aae0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
1aaf0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1ab00 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
1ab10 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1ab20 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1ab30 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 48    }.  }.}..#if H
1ab40 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20  AVE_READLINE || 
1ab50 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a  HAVE_EDITLINE./*
1ab60 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d  .** Readline com
1ab70 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
1ab80 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s.*/.static char
1ab90 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c   *readline_compl
1aba0 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28  etion_generator(
1abb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74  const char *text
1abc0 2c 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20  , int state){.  
1abd0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
1abe0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1abf0 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20    char *zRet;.  
1ac00 69 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a  if( state==0 ){.
1ac10 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
1ac20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1ac30 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1ac40 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1ac50 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1ac60 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
1ac70 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
1ac80 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1aca0 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e   FROM completion
1acb0 28 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  (%Q) ORDER BY 1"
1acc0 2c 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c  , text);.    sql
1acd0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1ace0 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
1acf0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1ad00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ad10 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  (zSql);.  }.  if
1ad20 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1ad30 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
1ad40 57 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20  W ){.    zRet = 
1ad50 73 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68  strdup((const ch
1ad60 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1ad70 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
1ad80 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1ad90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1ada0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
1adb0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65  tmt = 0;.    zRe
1adc0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1add0 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74  urn zRet;.}.stat
1ade0 69 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69  ic char **readli
1adf0 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  ne_completion(co
1ae00 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
1ae10 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1ae20 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74   iEnd){.  rl_att
1ae30 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f  empted_completio
1ae40 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65  n_over = 1;.  re
1ae50 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69  turn rl_completi
1ae60 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74  on_matches(zText
1ae70 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c  , readline_compl
1ae80 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29  etion_generator)
1ae90 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f  ;.}..#elif HAVE_
1aea0 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20  LINENOISE./*.** 
1aeb0 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65  Linenoise comple
1aec0 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f  tion callback.*/
1aed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e  .static void lin
1aee0 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f  enoise_completio
1aef0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  n(const char *zL
1af00 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f  ine, linenoiseCo
1af10 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a  mpletions *lc){.
1af20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74    int nLine = st
1af30 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20  rlen30(zLine);. 
1af40 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a   int i, iStart;.
1af50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1af60 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1af70 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
1af80 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69  zBuf[1000];..  i
1af90 66 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28  f( nLine>sizeof(
1afa0 7a 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72  zBuf)-30 ) retur
1afb0 6e 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30  n;.  if( zLine[0
1afc0 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b  ]=='.' ) return;
1afd0 0a 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31  .  for(i=nLine-1
1afe0 3b 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e  ; i>=0 && (isaln
1aff0 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20  um(zLine[i]) || 
1b000 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20  zLine[i]=='_'); 
1b010 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d  i--){}.  if( i==
1b020 6e 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e  nLine-1 ) return
1b030 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31  ;.  iStart = i+1
1b040 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c  ;.  memcpy(zBuf,
1b050 20 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b   zLine, iStart);
1b060 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1b070 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
1b080 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69  T DISTINCT candi
1b090 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  date COLLATE noc
1b0a0 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ase".           
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1b0c0 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e   FROM completion
1b0d0 28 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59  (%Q,%Q) ORDER BY
1b0e0 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   1",.           
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
1b100 4c 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c  Line[iStart], zL
1b110 69 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ine);.  sqlite3_
1b120 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61  prepare_v2(globa
1b130 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  lDb, zSql, -1, &
1b140 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
1b150 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
1b160 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
1b170 67 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d  globalDb, "PRAGM
1b180 41 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30  A page_count", 0
1b190 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64  , 0, 0); /* Load
1b1a0 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
1b1b0 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
1b1c0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
1b1d0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
1b1e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70  onst char *zComp
1b1f0 6c 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  letion = (const 
1b200 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
1b210 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
1b220 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f   0);.    int nCo
1b230 6d 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74  mpletion = sqlit
1b240 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1b250 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
1b260 66 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c  f( iStart+nCompl
1b270 65 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a  etion < sizeof(z
1b280 42 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20  Buf)-1 ){.      
1b290 6d 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61  memcpy(zBuf+iSta
1b2a0 72 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c  rt, zCompletion,
1b2b0 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b   nCompletion+1);
1b2c0 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65  .      linenoise
1b2d0 41 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63  AddCompletion(lc
1b2e0 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  , zBuf);.    }. 
1b2f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
1b300 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
1b310 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
1b320 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c   C-language styl
1b330 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a  e dequoting..**.
1b340 2a 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61  **    \a    -> a
1b350 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20  larm.**    \b   
1b360 20 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a   -> backspace.**
1b370 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62      \t    -> tab
1b380 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20  .**    \n    -> 
1b390 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76  newline.**    \v
1b3a0 20 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20      -> vertical 
1b3b0 74 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20  tab.**    \f    
1b3c0 2d 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20  -> form feed.** 
1b3d0 20 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72     \r    -> carr
1b3e0 69 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20  iage return.**  
1b3f0 20 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65    \s    -> space
1b400 0a 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20  .**    \"    -> 
1b410 22 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e  ".**    \'    ->
1b420 20 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d   '.**    \\    -
1b430 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20  > backslash.**  
1b440 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69    \NNN  -> ascii
1b450 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69   character NNN i
1b460 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69  n octal.*/.stati
1b470 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62  c void resolve_b
1b480 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20  ackslashes(char 
1b490 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *z){.  int i, j;
1b4a0 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69  .  char c;.  whi
1b4b0 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  le( *z && *z!='\
1b4c0 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28  \' ) z++;.  for(
1b4d0 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  i=j=0; (c = z[i]
1b4e0 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  )!=0; i++, j++){
1b4f0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27  .    if( c=='\\'
1b500 20 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b   && z[i+1]!=0 ){
1b510 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69  .      c = z[++i
1b520 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
1b530 27 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'a' ){.        c
1b540 20 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d   = '\a';.      }
1b550 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20  else if( c=='b' 
1b560 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1b570 5c 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \b';.      }else
1b580 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
1b590 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
1b5a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b5b0 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20   c=='n' ){.     
1b5c0 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20     c = '\n';.   
1b5d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1b5e0 27 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'v' ){.        c
1b5f0 20 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d   = '\v';.      }
1b600 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20  else if( c=='f' 
1b610 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1b620 5c 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \f';.      }else
1b630 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20   if( c=='r' ){. 
1b640 20 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b         c = '\r';
1b650 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b660 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
1b670 20 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20     c = '"';.    
1b680 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1b690 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  \'' ){.        c
1b6a0 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d   = '\'';.      }
1b6b0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27  else if( c=='\\'
1b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1b6d0 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\\';.      }els
1b6e0 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20  e if( c>='0' && 
1b6f0 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  c<='7' ){.      
1b700 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20    c -= '0';.    
1b710 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d      if( z[i+1]>=
1b720 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27  '0' && z[i+1]<='
1b730 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7' ){.          
1b740 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  i++;.          c
1b750 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
1b760 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
1b770 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
1b780 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
1b790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b7a0 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
1b7b0 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b   c = (c<<3) + z[
1b7c0 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  i] - '0';.      
1b7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1b7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b7f0 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a    z[j] = c;.  }.
1b800 20 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d    if( j<i ) z[j]
1b810 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
1b820 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73  nterpret zArg as
1b830 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
1b840 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  er or a boolean 
1b850 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31  value.  Return 1
1b860 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55   or 0.** for TRU
1b870 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65  E and FALSE.  Re
1b880 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72  turn the integer
1b890 20 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70   value if approp
1b8a0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
1b8b0 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   int booleanValu
1b8c0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
1b8d0 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rg){.  int i;.  
1b8e0 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
1b8f0 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
1b900 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b   ){.    for(i=2;
1b910 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a   hexDigitValue(z
1b920 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29  Arg[i])>=0; i++)
1b930 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  {}.  }else{.    
1b940 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d  for(i=0; zArg[i]
1b950 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d  >='0' && zArg[i]
1b960 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  <='9'; i++){}.  
1b970 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a  }.  if( i>0 && z
1b980 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75  Arg[i]==0 ) retu
1b990 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72  rn (int)(integer
1b9a0 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78  Value(zArg) & 0x
1b9b0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28  ffffffff);.  if(
1b9c0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
1b9d0 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20  (zArg, "on")==0 
1b9e0 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
1b9f0 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d  mp(zArg,"yes")==
1ba00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ba10 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
1ba20 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
1ba30 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20  g, "off")==0 || 
1ba40 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1ba50 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b  zArg,"no")==0 ){
1ba60 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1ba70 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66   }.  utf8_printf
1ba80 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
1ba90 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76   Not a boolean v
1baa0 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73  alue: \"%s\". As
1bab0 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e  suming \"no\".\n
1bac0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72  ",.          zAr
1bad0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  g);.  return 0;.
1bae0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20  }../*.** Set or 
1baf0 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c  clear a shell fl
1bb00 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ag according to 
1bb10 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
1bb20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bb30 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53  setOrClearFlag(S
1bb40 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e  hellState *p, un
1bb50 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f  signed mFlag, co
1bb60 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
1bb70 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61  .  if( booleanVa
1bb80 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20  lue(zArg) ){.   
1bb90 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
1bba0 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65   mFlag);.  }else
1bbb0 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  {.    ShellClear
1bbc0 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a  Flag(p, mFlag);.
1bbd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
1bbe0 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  se an output fil
1bbf0 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69  e, assuming it i
1bc00 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20  s not stderr or 
1bc10 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63  stdout.*/.static
1bc20 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c   void output_fil
1bc30 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29  e_close(FILE *f)
1bc40 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d  {.  if( f && f!=
1bc50 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64  stdout && f!=std
1bc60 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  err ) fclose(f);
1bc70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1bc80 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20   open an output 
1bc90 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65  file.   The name
1bca0 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22  s "stdout" and "
1bcb0 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72  stderr" are.** r
1bcc0 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f  ecognized and do
1bcd0 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67   the right thing
1bce0 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
1bcf0 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ned if the outpu
1bd00 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73  t.** filename is
1bd10 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69   "off"..*/.stati
1bd20 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66  c FILE *output_f
1bd30 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ile_open(const c
1bd40 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
1bd50 62 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49  bTextMode){.  FI
1bd60 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72  LE *f;.  if( str
1bd70 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75  cmp(zFile,"stdou
1bd80 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  t")==0 ){.    f 
1bd90 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73  = stdout;.  }els
1bda0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
1bdb0 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30  le, "stderr")==0
1bdc0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65   ){.    f = stde
1bdd0 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rr;.  }else if( 
1bde0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f  strcmp(zFile, "o
1bdf0 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ff")==0 ){.    f
1be00 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1be10 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69     f = fopen(zFi
1be20 6c 65 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20  le, bTextMode ? 
1be30 22 77 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20  "w" : "wb");.   
1be40 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1be50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1be60 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
1be70 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
1be80 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
1be90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bea0 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69   f;.}..#if !defi
1beb0 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53  ned(SQLITE_UNTES
1bec0 54 41 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69  TABLE).#if !defi
1bed0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bee0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
1bef0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
1bf00 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f  LOATING_POINT)./
1bf10 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66  *.** A routine f
1bf20 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70  or handling outp
1bf30 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ut from sqlite3_
1bf40 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  trace()..*/.stat
1bf50 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65  ic int sql_trace
1bf60 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73  _callback(.  uns
1bf70 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76  igned mType,.  v
1bf80 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69  oid *pArg,.  voi
1bf90 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70  d *pP,.  void *p
1bfa0 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  X.){.  FILE *f =
1bfb0 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20   (FILE*)pArg;.  
1bfc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bfd0 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45  (mType);.  UNUSE
1bfe0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b  D_PARAMETER(pP);
1bff0 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20  .  if( f ){.    
1c000 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1c010 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b  (const char*)pX;
1c020 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72  .    int i = str
1c030 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68  len30(z);.    wh
1c040 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d  ile( i>0 && z[i-
1c050 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20  1]==';' ){ i--; 
1c060 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  }.    utf8_print
1c070 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20  f(f, "%.*s;\n", 
1c080 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i, z);.  }.  ret
1c090 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1c0a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1c0b0 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68  no-op routine th
1c0c0 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65  at runs with the
1c0d0 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64   ".breakpoint" d
1c0e0 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69  oc-command.  Thi
1c0f0 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c  s is.** a useful
1c100 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64   spot to set a d
1c110 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
1c120 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1c130 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  id test_breakpoi
1c140 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
1c150 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
1c160 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a  ;.  nCall++;.}..
1c170 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
1c180 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43  used to read a C
1c190 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c  SV and other fil
1c1a0 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a  es for import..*
1c1b0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1c1c0 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72   ImportCtx Impor
1c1d0 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70  tCtx;.struct Imp
1c1e0 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74  ortCtx {.  const
1c1f0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f   char *zFile;  /
1c200 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
1c210 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49  put file */.  FI
1c220 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
1c230 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53    /* Read the CS
1c240 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73  V text from this
1c250 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f   input stream */
1c260 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1c270 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
1c280 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61  lated text for a
1c290 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
1c2a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1c2b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1c2c0 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74  es in z */.  int
1c2d0 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
1c2e0 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
1c2f0 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20  ted for z[] */. 
1c300 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
1c310 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1c320 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
1c330 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20   int bNotFirst; 
1c340 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c350 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65  one or more byte
1c360 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a  s already read *
1c370 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20  /.  int cTerm;  
1c380 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
1c390 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e  cter that termin
1c3a0 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65  ated the most re
1c3b0 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20  cent field */.  
1c3c0 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20  int cColSep;    
1c3d0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1c3e0 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  n separator char
1c3f0 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79  acter.  (Usually
1c400 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63   ",") */.  int c
1c410 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f  RowSep;        /
1c420 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72 61  * The row separa
1c430 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20  tor character.  
1c440 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a  (Usually "\n") *
1c450 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  /.};../* Append 
1c460 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
1c470 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76   z[] */.static v
1c480 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e  oid import_appen
1c490 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78  d_char(ImportCtx
1c4a0 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69   *p, int c){.  i
1c4b0 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41  f( p->n+1>=p->nA
1c4c0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
1c4d0 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c  Alloc += p->nAll
1c4e0 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d  oc + 100;.    p-
1c4f0 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  >z = sqlite3_rea
1c500 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e  lloc64(p->z, p->
1c510 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
1c520 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   p->z==0 ){.    
1c530 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
1c540 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  err, "out of mem
1c550 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  ory\n");.      e
1c560 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
1c570 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d  }.  p->z[p->n++]
1c580 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f   = (char)c;.}../
1c590 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
1c5a0 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78  field of CSV tex
1c5b0 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77  t.  Compatible w
1c5c0 69 74 68 20 72 66 63 34 31 38 30 20 61 6e 64 20  ith rfc4180 and 
1c5d0 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68  extended.** with
1c5e0 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68   the option of h
1c5f0 61 76 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f  aving a separato
1c600 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22  r other than ","
1c610 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
1c620 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
1c630 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
1c640 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
1c650 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
1c660 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
1c670 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
1c680 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
1c690 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
1c6a0 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
1c6b0 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
1c6c0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1c6d0 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a  default is ","..
1c6e0 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72  **   +  Use p->r
1c6f0 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73  Sep as the row s
1c700 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
1c710 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a  efault is "\n"..
1c720 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61  **   +  Keep tra
1c730 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
1c740 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e  umber in p->nLin
1c750 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  e..**   +  Store
1c760 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
1c770 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
1c780 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63  he field in p->c
1c790 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Term.  Store.** 
1c7a0 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d       EOF on end-
1c7b0 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20  of-file..**   + 
1c7c0 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65   Report syntax e
1c7d0 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a  rrors on stderr.
1c7e0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1c7f0 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76  SQLITE_CDECL csv
1c800 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
1c810 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20  ImportCtx *p){. 
1c820 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53   int c;.  int cS
1c830 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b  ep = p->cColSep;
1c840 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d  .  int rSep = p-
1c850 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e  >cRowSep;.  p->n
1c860 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74   = 0;.  c = fget
1c870 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20  c(p->in);.  if( 
1c880 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e  c==EOF || seenIn
1c890 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70  terrupt ){.    p
1c8a0 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20  ->cTerm = EOF;. 
1c8b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c8c0 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  .  if( c=='"' ){
1c8d0 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63  .    int pc, ppc
1c8e0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c  ;.    int startL
1c8f0 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a  ine = p->nLine;.
1c900 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d      int cQuote =
1c910 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63   c;.    pc = ppc
1c920 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1c930 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20   1 ){.      c = 
1c940 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1c950 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
1c960 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20  ) p->nLine++;.  
1c970 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74      if( c==cQuot
1c980 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
1c990 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20   pc==cQuote ){. 
1c9a0 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b           pc = 0;
1c9b0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1c9c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
1c9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c9e0 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d   (c==cSep && pc=
1c9f0 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1ca00 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70  || (c==rSep && p
1ca10 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1ca20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
1ca30 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63   pc=='\r' && ppc
1ca40 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1ca50 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70   || (c==EOF && p
1ca60 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1ca70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20   ){.        do{ 
1ca80 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20  p->n--; }while( 
1ca90 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f  p->z[p->n]!=cQuo
1caa0 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  te );.        p-
1cab0 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
1cac0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1cad0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d   }.      if( pc=
1cae0 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c  =cQuote && c!='\
1caf0 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  r' ){.        ut
1cb00 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1cb10 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61  , "%s:%d: unesca
1cb20 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72  ped %c character
1cb30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1cb40 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70       p->zFile, p
1cb50 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  ->nLine, cQuote)
1cb60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cb70 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20  if( c==EOF ){.  
1cb80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1cb90 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
1cba0 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25  : unterminated %
1cbb0 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e  c-quoted field\n
1cbc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cbd0 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61     p->zFile, sta
1cbe0 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b  rtLine, cQuote);
1cbf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
1cc00 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
1cc10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1cc20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
1cc30 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
1cc40 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20      ppc = pc;.  
1cc50 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
1cc60 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1cc70 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1cc80 20 66 69 72 73 74 20 66 69 65 6c 64 20 62 65 69   first field bei
1cc90 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20 69 74  ng parsed and it
1cca0 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65   begins with the
1ccb0 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f  .    ** UTF-8 BO
1ccc0 4d 20 20 28 30 78 45 46 20 42 42 20 42 46 29 20  M  (0xEF BB BF) 
1ccd0 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f  then skip the BO
1cce0 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26  M */.    if( (c&
1ccf0 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70  0xff)==0xef && p
1cd00 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29  ->bNotFirst==0 )
1cd10 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
1cd20 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1cd30 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
1cd40 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
1cd50 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
1cd60 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d  bb ){.        im
1cd70 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
1cd80 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20  (p, c);.        
1cd90 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1cda0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  ;.        if( (c
1cdb0 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a  &0xff)==0xbf ){.
1cdc0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f            p->bNo
1cdd0 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  tFirst = 1;.    
1cde0 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a        p->n = 0;.
1cdf0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ce00 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
1ce10 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20  eld(p);.        
1ce20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ce30 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f      while( c!=EO
1ce40 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20  F && c!=cSep && 
1ce50 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20  c!=rSep ){.     
1ce60 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1ce70 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
1ce80 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1ce90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1cea0 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
1ceb0 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
1cec0 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26      if( p->n>0 &
1ced0 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d  & p->z[p->n-1]==
1cee0 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20  '\r' ) p->n--;. 
1cef0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72     }.    p->cTer
1cf00 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  m = c;.  }.  if(
1cf10 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
1cf20 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f  n] = 0;.  p->bNo
1cf30 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65  tFirst = 1;.  re
1cf40 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a  turn p->z;.}../*
1cf50 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66   Read a single f
1cf60 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65  ield of ASCII de
1cf70 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a  limited text..**
1cf80 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63  .**   +  Input c
1cf90 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e  omes from p->in.
1cfa0 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72  .**   +  Store r
1cfb0 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f  esults in p->z o
1cfc0 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20  f length p->n.  
1cfd0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d  Space to hold p-
1cfe0 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20  >z comes.**     
1cff0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1d000 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b  lloc64()..**   +
1d010 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73    Use p->cSep as
1d020 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
1d030 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1d040 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a  ult is "\x1F"..*
1d050 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53  *   +  Use p->rS
1d060 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65  ep as the row se
1d070 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1d080 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e  fault is "\x1E".
1d090 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72  .**   +  Keep tr
1d0a0 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e  ack of the row n
1d0b0 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e  umber in p->nLin
1d0c0 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  e..**   +  Store
1d0d0 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
1d0e0 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
1d0f0 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63  he field in p->c
1d100 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Term.  Store.** 
1d110 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d       EOF on end-
1d120 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20  of-file..**   + 
1d130 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65   Report syntax e
1d140 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a  rrors on stderr.
1d150 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1d160 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63  SQLITE_CDECL asc
1d170 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  ii_read_one_fiel
1d180 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
1d190 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1d1a0 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
1d1b0 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
1d1c0 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
1d1d0 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
1d1e0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
1d1f0 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
1d200 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
1d210 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
1d220 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d230 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45   }.  while( c!=E
1d240 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26  OF && c!=cSep &&
1d250 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c!=rSep ){.    
1d260 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1d270 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20  ar(p, c);.    c 
1d280 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1d290 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65    }.  if( c==rSe
1d2a0 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e  p ){.    p->nLin
1d2b0 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54  e++;.  }.  p->cT
1d2c0 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70  erm = c;.  if( p
1d2d0 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
1d2e0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
1d2f0 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  ->z;.}../*.** Tr
1d300 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61  y to transfer da
1d310 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61  ta for table zTa
1d320 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ble.  If an erro
1d330 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a  r is seen while.
1d340 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72  ** moving forwar
1d350 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63  d, try to go bac
1d360 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62 61 63  kwards.  The bac
1d370 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20  kwards movement 
1d380 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f  won't.** work fo
1d390 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1d3a0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1d3b0 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
1d3c0 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74  eData(.  ShellSt
1d3d0 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65  ate *p,.  sqlite
1d3e0 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73  3 *newDb,.  cons
1d3f0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29  t char *zTable.)
1d400 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1d410 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
1d420 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
1d430 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61  nsert = 0;.  cha
1d440 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1d450 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d   char *zInsert =
1d460 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1d470 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69  int i, j, n;.  i
1d480 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c  nt nTable = strl
1d490 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20  en30(zTable);.  
1d4a0 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  int k = 0;.  int
1d4b0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73   cnt = 0;.  cons
1d4c0 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d  t int spinRate =
1d4d0 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72   10000;..  zQuer
1d4e0 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1d4f0 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
1d500 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62  OM \"%w\"", zTab
1d510 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  le);.  rc = sqli
1d520 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1d530 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
1d540 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
1d550 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1d560 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1d570 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
1d580 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1d590 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d5a0 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1d5b0 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
1d5c0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
1d5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
1d5e0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1d5f0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1d600 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  }.  n = sqlite3_
1d610 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75  column_count(pQu
1d620 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20  ery);.  zInsert 
1d630 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1d640 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20  64(200 + nTable 
1d650 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49  + n*3);.  if( zI
1d660 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nsert==0 ){.    
1d670 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1d680 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
1d690 79 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  y\n");.    goto 
1d6a0 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
1d6b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
1d6c0 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65  rintf(200+nTable
1d6d0 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20  ,zInsert,.      
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
1d6f0 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
1d700 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45  NTO \"%s\" VALUE
1d710 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
1d720 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49   i = strlen30(zI
1d730 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d  nsert);.  for(j=
1d740 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<n; j++){.  
1d750 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74    memcpy(zInsert
1d760 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20  +i, ",?", 2);.  
1d770 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20    i += 2;.  }.  
1d780 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
1d790 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63  , ");", 3);.  rc
1d7a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1d7b0 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e  re_v2(newDb, zIn
1d7c0 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65  sert, -1, &pInse
1d7d0 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  rt, 0);.  if( rc
1d7e0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1d7f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d800 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73  or %d: %s on [%s
1d810 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1d820 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
1d830 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62  ed_errcode(newDb
1d840 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
1d850 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20  g(newDb),.      
1d860 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1d870 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61     goto end_data
1d880 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72  _xfer;.  }.  for
1d890 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b  (k=0; k<2; k++){
1d8a0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
1d8b0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1d8c0 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
1d8d0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ROW ){.      for
1d8e0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
1d8f0 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
1d900 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d910 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20  type(pQuery, i) 
1d920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
1d930 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
1d940 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d950 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
1d960 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20  Insert, i+1);.  
1d970 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d980 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d990 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1d9a0 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
1d9b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d9c0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e  3_bind_int64(pIn
1d9d0 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
1d9e0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1d9f0 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20  pQuery,i));.    
1da00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1da10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1da20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1da30 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1da40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1da50 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72  nd_double(pInser
1da60 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
1da70 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51  column_double(pQ
1da80 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
1da90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1daa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dab0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1dac0 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  EXT: {.         
1dad0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1dae0 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b  text(pInsert, i+
1daf0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1db20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1db30 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c           -1, SQL
1db60 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1db70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1db80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1db90 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1dba0 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
1dbb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1dbc0 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c  nd_blob(pInsert,
1dbd0 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
1dbe0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79  lumn_blob(pQuery
1dbf0 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1dc30 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c  bytes(pQuery,i),
1dc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1dc70 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1dc80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1dc90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
1dcb0 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20   End for */.    
1dcc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
1dcd0 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
1dce0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dcf0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1dd00 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53  ITE_ROW && rc!=S
1dd10 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1dd20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1dd30 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1dd40 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69   %d: %s\n", sqli
1dd50 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
1dd60 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20  code(newDb),.   
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
1dd90 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20  msg(newDb));.   
1dda0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ddb0 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74  e3_reset(pInsert
1ddc0 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  );.      cnt++;.
1ddd0 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73        if( (cnt%s
1dde0 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20  pinRate)==0 ){. 
1ddf0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
1de00 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63  c\b", "|/-\\"[(c
1de10 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29  nt/spinRate)%4])
1de20 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
1de30 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1de40 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77  }.    } /* End w
1de50 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  hile */.    if( 
1de60 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1de70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
1de80 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1de90 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1dea0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1deb0 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1dec0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1ded0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
1dee0 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77  w\" ORDER BY row
1def0 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20  id DESC;",.     
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b          zTable);
1df20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1df30 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1df40 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1df50 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
1df60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1df70 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1df80 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63  err, "Warning: c
1df90 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c  annot step \"%s\
1dfa0 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54  " backwards", zT
1dfb0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
1dfc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a  ak;.    }.  } /*
1dfd0 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29   End for(k=0...)
1dfe0 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66   */..end_data_xf
1dff0 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er:.  sqlite3_fi
1e000 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
1e010 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1e020 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73  ze(pInsert);.  s
1e030 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
1e040 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
1e050 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a  ree(zInsert);.}.
1e060 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74  ../*.** Try to t
1e070 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73  ransfer all rows
1e080 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74   of the schema t
1e090 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65  hat match zWhere
1e0a0 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72  .  For.** each r
1e0b0 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45  ow, invoke xForE
1e0c0 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a  ach() on the obj
1e0d0 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20 74  ect defined by t
1e0e0 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61  hat row..** If a
1e0f0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
1e100 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76  ntered while mov
1e110 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f  ing forward thro
1e120 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ugh the.** sqlit
1e130 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20  e_master table, 
1e140 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67  try again moving
1e150 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73   backwards..*/.s
1e160 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
1e170 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53  CloneSchema(.  S
1e180 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20  hellState *p,.  
1e190 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a  sqlite3 *newDb,.
1e1a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
1e1b0 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78  here,.  void (*x
1e1c0 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74  ForEach)(ShellSt
1e1d0 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f  ate*,sqlite3*,co
1e1e0 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20  nst char*).){.  
1e1f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
1e200 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
1e210 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *zQuery = 0;.  
1e220 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
1e230 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
1e240 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Name;.  const un
1e250 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71  signed char *zSq
1e260 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  l;.  char *zErrM
1e270 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72  sg = 0;..  zQuer
1e280 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1e290 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
1e2a0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
1e2b0 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2d0 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73 22       " WHERE %s"
1e2e0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20  , zWhere);.  rc 
1e2f0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1e300 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
1e310 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
1e320 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
1e330 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1e340 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1e350 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d   (%d) %s on [%s]
1e360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e380 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1e390 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
1e3a0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
1e3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e3c0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1e3d0 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d    goto end_schem
1e3e0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68  a_xfer;.  }.  wh
1e3f0 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1e400 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1e410 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1e420 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1e430 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1e440 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1e450 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  zSql = sqlite3_c
1e460 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
1e470 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74  y, 1);.    print
1e480 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d  f("%s... ", zNam
1e490 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75  e); fflush(stdou
1e4a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1e4b0 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e  exec(newDb, (con
1e4c0 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30  st char*)zSql, 0
1e4d0 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
1e4e0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
1e4f0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
1e500 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1e510 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25  ror: %s\nSQL: [%
1e520 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20  s]\n", zErrMsg, 
1e530 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
1e540 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
1e550 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73  g);.      zErrMs
1e560 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
1e570 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b   if( xForEach ){
1e580 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28  .      xForEach(
1e590 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  p, newDb, (const
1e5a0 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20   char*)zName);. 
1e5b0 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
1e5c0 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20  "done\n");.  }. 
1e5d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e5e0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  DONE ){.    sqli
1e5f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
1e600 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
1e610 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a  3_free(zQuery);.
1e620 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c      zQuery = sql
1e630 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1e640 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46  LECT name, sql F
1e650 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1e660 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52  " WHERE %s ORDER
1e690 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c   BY rowid DESC",
1e6a0 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63   zWhere);.    rc
1e6b0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1e6c0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1e6d0 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1e6e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1e6f0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1e700 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1e710 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e  rror: (%d) %s on
1e720 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1e750 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1e760 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1e770 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51                zQ
1e790 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74  uery);.      got
1e7a0 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  o end_schema_xfe
1e7b0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  r;.    }.    whi
1e7c0 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
1e7d0 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
1e7e0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1e7f0 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
1e800 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1e810 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1e820 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1e830 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
1e840 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  uery, 1);.      
1e850 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c  printf("%s... ",
1e860 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28   zName); fflush(
1e870 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73  stdout);.      s
1e880 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1e890 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
1e8a0 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
1e8b0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
1e8c0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
1e8d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1e8e0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1e8f0 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  %s\nSQL: [%s]\n"
1e900 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29  , zErrMsg, zSql)
1e910 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e920 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
1e930 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67  .        zErrMsg
1e940 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1e950 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68      if( xForEach
1e960 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72   ){.        xFor
1e970 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28  Each(p, newDb, (
1e980 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d  const char*)zNam
1e990 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e9a0 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e    printf("done\n
1e9b0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e  ");.    }.  }.en
1e9c0 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20  d_schema_xfer:. 
1e9d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1e9e0 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c  e(pQuery);.  sql
1e9f0 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1ea00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1ea10 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1ea20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77  file named "zNew
1ea30 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63  Db".  Try to rec
1ea40 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66  over as much inf
1ea50 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70  ormation.** as p
1ea60 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74  ossible out of t
1ea70 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1ea80 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62 65   (which might be
1ea90 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72   corrupt) and wr
1eaa0 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a  ite it.** into z
1eab0 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  NewDb..*/.static
1eac0 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65   void tryToClone
1ead0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1eae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
1eaf0 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Db){.  int rc;. 
1eb00 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20   sqlite3 *newDb 
1eb10 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73  = 0;.  if( acces
1eb20 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29  s(zNewDb,0)==0 )
1eb30 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1eb40 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20  f(stderr, "File 
1eb50 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65  \"%s\" already e
1eb60 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44  xists.\n", zNewD
1eb70 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  b);.    return;.
1eb80 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1eb90 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20  e3_open(zNewDb, 
1eba0 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72  &newDb);.  if( r
1ebb0 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1ebc0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61  intf(stderr, "Ca
1ebd0 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70  nnot create outp
1ebe0 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c  ut database: %s\
1ebf0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ec00 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e  sqlite3_errmsg(n
1ec10 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ewDb));.  }else{
1ec20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
1ec30 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
1ec40 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
1ec50 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  =ON;", 0, 0, 0);
1ec60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
1ec70 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20  c(newDb, "BEGIN 
1ec80 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20  EXCLUSIVE;", 0, 
1ec90 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f  0, 0);.    tryTo
1eca0 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e  CloneSchema(p, n
1ecb0 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62  ewDb, "type='tab
1ecc0 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65  le'", tryToClone
1ecd0 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f  Data);.    tryTo
1ece0 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e  CloneSchema(p, n
1ecf0 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61  ewDb, "type!='ta
1ed00 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73  ble'", 0);.    s
1ed10 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1ed20 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c  b, "COMMIT;", 0,
1ed30 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1ed40 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
1ed50 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1ed60 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
1ed70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
1ed80 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77  qlite3_close(new
1ed90 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Db);.}../*.** Ch
1eda0 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20  ange the output 
1edb0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64  file back to std
1edc0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  out..**.** If th
1edd0 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66  e p->doXdgOpen f
1ede0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74  lag is set, that
1edf0 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75   means the outpu
1ee00 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72  t was being.** r
1ee10 65 64 69 72 65 63 74 65 64 20 74 6f 20 61 20 74  edirected to a t
1ee20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1ee30 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46  med by p->zTempF
1ee40 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ile.  In that ca
1ee50 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74  se,.** launch st
1ee60 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
1ee70 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  n on that tempor
1ee80 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ary file..*/.sta
1ee90 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
1eea0 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65  reset(ShellState
1eeb0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f   *p){.  if( p->o
1eec0 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29  utfile[0]=='|' )
1eed0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1eee0 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20  _OMIT_POPEN.    
1eef0 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a  pclose(p->out);.
1ef00 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
1ef10 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f      output_file_
1ef20 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23  close(p->out);.#
1ef30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1ef40 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20  HAVE_SYSTEM.    
1ef50 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  if( p->doXdgOpen
1ef60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1ef70 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d  char *zXdgOpenCm
1ef80 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d =.#if defined(
1ef90 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73  _WIN32).      "s
1efa0 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66  tart";.#elif def
1efb0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1efc0 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65        "open";.#e
1efd0 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f  lse.      "xdg-o
1efe0 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pen";.#endif.   
1eff0 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20     char *zCmd;. 
1f000 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69       zCmd = sqli
1f010 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
1f020 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64  %s", zXdgOpenCmd
1f030 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b  , p->zTempFile);
1f040 0a 20 20 20 20 20 20 69 66 28 20 73 79 73 74 65  .      if( syste
1f050 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20  m(zCmd) ){.     
1f060 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1f070 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20  tderr, "Failed: 
1f080 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a  [%s]\n", zCmd);.
1f090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1f0a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
1f0b0 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f  ;.      outputMo
1f0c0 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20  dePop(p);.      
1f0d0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30  p->doXdgOpen = 0
1f0e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1f0f0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1f100 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29  E_NOHAVE_SYSTEM)
1f110 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74   */.  }.  p->out
1f120 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  file[0] = 0;.  p
1f130 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
1f140 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20  }../*.** Run an 
1f150 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  SQL command and 
1f160 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c  return the singl
1f170 65 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  e integer result
1f180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f190 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74  db_int(ShellStat
1f1a0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1f1b0 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74   *zSql){.  sqlit
1f1c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1f1d0 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
1f1e0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1f1f0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
1f200 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1f210 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20  .  if( pStmt && 
1f220 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1f230 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1f240 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  ){.    res = sql
1f250 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
1f260 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20  pStmt,0);.  }.  
1f270 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1f280 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
1f290 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1f2a0 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65  Convert a 2-byte
1f2b0 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65   or 4-byte big-e
1f2c0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e  ndian integer in
1f2d0 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65  to a native inte
1f2e0 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ger.*/.static un
1f2f0 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62  signed int get2b
1f300 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20  yteInt(unsigned 
1f310 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75  char *a){.  retu
1f320 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61  rn (a[0]<<8) + a
1f330 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e  [1];.}.static un
1f340 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62  signed int get4b
1f350 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20  yteInt(unsigned 
1f360 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75  char *a){.  retu
1f370 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20  rn (a[0]<<24) + 
1f380 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b  (a[1]<<16) + (a[
1f390 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d  2]<<8) + a[3];.}
1f3a0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1f3b0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e  tation of the ".
1f3c0 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  info" command..*
1f3d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e  *.** Return 1 on
1f3e0 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69   error, 2 to exi
1f3f0 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69  t, and 0 otherwi
1f400 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f410 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63  t shell_dbinfo_c
1f420 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74  ommand(ShellStat
1f430 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20  e *p, int nArg, 
1f440 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20  char **azArg){. 
1f450 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1f460 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61  ruct { const cha
1f470 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66  r *zName; int of
1f480 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d  st; } aField[] =
1f490 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20   {.     { "file 
1f4a0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22  change counter:"
1f4b0 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  24  },.     {
1f4c0 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20   "database page 
1f4d0 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c  count:",  28  },
1f4e0 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73  .     { "freelis
1f4f0 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  t page count:", 
1f500 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   36  },.     { "
1f510 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c  schema cookie:",
1f520 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20          40  },. 
1f530 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f      { "schema fo
1f540 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34  rmat:",        4
1f550 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65  4  },.     { "de
1f560 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
1f570 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20  :",   48  },.   
1f580 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20    { "autovacuum 
1f590 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20  top root:",  52 
1f5a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72   },.     { "incr
1f5b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22  emental vacuum:"
1f5c0 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20  ,   64  },.     
1f5d0 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  { "text encoding
1f5e0 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d  :",        56  }
1f5f0 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76  ,.     { "user v
1f600 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20  ersion:",       
1f610 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20    60  },.     { 
1f620 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a  "application id:
1f630 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a  ",       68  },.
1f640 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65       { "software
1f650 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20   version:",     
1f660 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74  96  },.  };.  st
1f670 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1f680 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  t { const char *
1f690 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61  zName; const cha
1f6a0 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72  r *zSql; } aQuer
1f6b0 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  y[] = {.     { "
1f6c0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
1f6d0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1f6e0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1f6f0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
1f700 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20  table'" },.     
1f710 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  { "number of ind
1f720 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  exes:",.       "
1f730 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1f740 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
1f750 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20  pe='index'" },. 
1f760 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
1f770 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20   triggers:",.   
1f780 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
1f790 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
1f7a0 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72  RE type='trigger
1f7b0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
1f7c0 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c  mber of views:",
1f7d0 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1f7e0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
1f7f0 20 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65   WHERE type='vie
1f800 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  w'" },.     { "s
1f810 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20  chema size:",.  
1f820 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74       "SELECT tot
1f830 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20  al(length(sql)) 
1f840 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b  FROM %s" },.  };
1f850 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1f860 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20   *zSchemaTab;.  
1f870 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67  char *zDb = nArg
1f880 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
1f890 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74   "main";.  sqlit
1f8a0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1f8b0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
1f8c0 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20  har aHdr[100];. 
1f8d0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
1f8e0 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
1f8f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c   return 1;.  sql
1f900 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1f910 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61  p->db,"SELECT da
1f920 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
1f930 62 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20  bpage(?1) WHERE 
1f940 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20  pgno=1",.       
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
1f960 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1f970 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1f980 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c  t(pStmt, 1, zDb,
1f990 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1f9a0 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  IC);.  if( sqlit
1f9b0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
1f9c0 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26  SQLITE_ROW.   &&
1f9d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1f9e0 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31  bytes(pStmt,0)>1
1f9f0 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  00.  ){.    memc
1fa00 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33  py(aHdr, sqlite3
1fa10 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
1fa20 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20  mt,0), 100);.   
1fa30 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1fa40 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  e(pStmt);.  }els
1fa50 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
1fa60 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c  f(stderr, "unabl
1fa70 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  e to read databa
1fa80 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20  se header\n");. 
1fa90 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1faa0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1fab0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1fac0 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28  i = get2byteInt(
1fad0 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20  aHdr+16);.  if( 
1fae0 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36  i==1 ) i = 65536
1faf0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1fb00 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1fb10 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20  d\n", "database 
1fb20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b  page size:", i);
1fb30 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
1fb40 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1fb50 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d  \n", "write form
1fb60 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b  at:", aHdr[18]);
1fb70 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
1fb80 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1fb90 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61  \n", "read forma
1fba0 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a  t:", aHdr[19]);.
1fbb0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1fbc0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
1fbd0 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62 79  n", "reserved by
1fbe0 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29  tes:", aHdr[20])
1fbf0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
1fc00 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29  rraySize(aField)
1fc10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1fc20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d  ofst = aField[i]
1fc30 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67  .ofst;.    unsig
1fc40 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65  ned int val = ge
1fc50 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b  t4byteInt(aHdr +
1fc60 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38   ofst);.    utf8
1fc70 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1fc80 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65  "%-20s %u", aFie
1fc90 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c  ld[i].zName, val
1fca0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
1fcb0 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  fst ){.      cas
1fcc0 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20  e 56: {.        
1fcd0 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77  if( val==1 ) raw
1fce0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1fcf0 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20  " (utf8)");.    
1fd00 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29      if( val==2 )
1fd10 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1fd20 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22  ut, " (utf16le)"
1fd30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
1fd40 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e  al==3 ) raw_prin
1fd50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
1fd60 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20  f16be)");.      
1fd70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  }.    }.    raw_
1fd80 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1fd90 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
1fda0 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  zDb==0 ){.    zS
1fdb0 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
1fdc0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e  e3_mprintf("main
1fdd0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  .sqlite_master")
1fde0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1fdf0 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29  rcmp(zDb,"temp")
1fe00 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
1fe10 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
1fe20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73  mprintf("%s", "s
1fe30 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
1fe40 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r");.  }else{.  
1fe50 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
1fe60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1fe70 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61  \"%w\".sqlite_ma
1fe80 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  ster", zDb);.  }
1fe90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
1fea0 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b  raySize(aQuery);
1feb0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
1fec0 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
1fed0 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69  mprintf(aQuery[i
1fee0 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54  ].zSql, zSchemaT
1fef0 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  ab);.    int val
1ff00 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71   = db_int(p, zSq
1ff10 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
1ff20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1ff30 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
1ff40 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
1ff50 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d  , aQuery[i].zNam
1ff60 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e, val);.  }.  s
1ff70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68  qlite3_free(zSch
1ff80 65 6d 61 54 61 62 29 3b 0a 20 20 72 65 74 75 72  emaTab);.  retur
1ff90 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
1ffa0 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  int the current 
1ffb0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
1ffc0 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72   value to stderr
1ffd0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a   and return 1..*
1ffe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
1fff0 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28  llDatabaseError(
20000 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
20010 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
20020 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
20030 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72  g(db);.  utf8_pr
20040 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
20050 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
20060 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
20070 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
20080 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 6d   out-of-memory m
20090 65 73 73 61 67 65 20 74 6f 20 73 74 64 65 72 72  essage to stderr
200a0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a   and return 1..*
200b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
200c0 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 76 6f 69  llNomemError(voi
200d0 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  d){.  raw_printf
200e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
200f0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
20100 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ");.  return 1;.
20110 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
20120 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20   the pattern in 
20130 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20  zGlob[] against 
20140 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e  the text in z[].
20150 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a    Return TRUE.**
20160 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61   if they match a
20170 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66 20  nd FALSE (0) if 
20180 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
20190 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e  h..**.** Globbin
201a0 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
201b0 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61      '*'       Ma
201c0 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
201d0 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ce of zero or mo
201e0 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  re characters..*
201f0 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20  *.**      '?'   
20200 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63      Matches exac
20210 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65  tly one characte
20220 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e  r..**.**     [..
20230 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  .]      Matches 
20240 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72  one character fr
20250 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  om the enclosed 
20260 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
20270 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
20280 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
20290 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68  [^...]     Match
202a0 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
202b0 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c   not in the encl
202c0 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  osed list..**.**
202d0 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20 20        '#'       
202e0 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
202f0 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ence of one or m
20300 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68 20  ore digits with 
20310 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
20320 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20       optional + 
20330 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f  or - sign in fro
20340 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20  nt.**.**      ' 
20350 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e  '       Any span
20360 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 6d   of whitespace m
20370 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72  atches any other
20380 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20   span of.**     
20390 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74 65             white
203a0 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74  space..**.** Ext
203b0 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61 74  ra whitespace at
203c0 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20   the end of z[] 
203d0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73  is ignored..*/.s
203e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63 61  tatic int testca
203f0 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68  se_glob(const ch
20400 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74  ar *zGlob, const
20410 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
20420 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e   c, c2;.  int in
20430 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
20440 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
20450 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d   (*(zGlob++)))!=
20460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53  0 ){.    if( IsS
20470 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
20480 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a   if( !IsSpace(*z
20490 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
204a0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
204b0 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c  ce(*zGlob) ) zGl
204c0 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  ob++;.      whil
204d0 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29  e( IsSpace(*z) )
204e0 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   z++;.    }else 
204f0 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20  if( c=='*' ){.  
20500 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a      while( (c=(*
20510 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27  (zGlob++))) == '
20520 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a  *' || c=='?' ){.
20530 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
20540 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d  ?' && (*(z++))==
20550 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20570 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
20580 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
20590 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
205a0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
205b0 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73  e( *z && testcas
205c0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a  e_glob(zGlob-1,z
205d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
205e0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    z++;.        }
205f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20600 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d  (*z)!=0;.      }
20610 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
20620 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30  2 = (*(z++)))!=0
20630 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
20640 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20  e( c2!=c ){.    
20650 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b        c2 = *(z++
20660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20670 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
20680 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
20690 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61 73       if( testcas
206a0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  e_glob(zGlob,z) 
206b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
206c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
206d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
206e0 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
206f0 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
20700 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20710 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
20720 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
20730 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
20740 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
20750 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
20760 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
20770 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
20780 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
20790 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
207a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
207b0 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
207c0 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
207d0 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
207e0 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
207f0 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
20800 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
20810 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
20820 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
20830 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
20840 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
20850 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
20860 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
20870 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
20880 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
20890 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
208a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
208b0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
208c0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
208d0 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
208e0 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
208f0 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
20900 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
20910 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
20920 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
20930 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
20940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20950 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
20960 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
20970 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
20980 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
20990 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
209a0 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
209b0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
209c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
209d0 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
209e0 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
209f0 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49   z[0]=='+') && I
20a00 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sDigit(z[1]) ) z
20a10 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
20a20 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sDigit(z[0]) ) r
20a30 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
20a40 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
20a50 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29   IsDigit(z[0]) )
20a60 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
20a70 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
20a80 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
20a90 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
20aa0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
20ab0 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
20ac0 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
20ad0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
20ae0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 61   the string as a
20af0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
20b00 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72  tion with either
20b10 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69   one or two.** i
20b20 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61  nitial "-" chara
20b30 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
20b40 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68   int optionMatch
20b50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
20b60 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
20b70 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72  Opt){.  if( zStr
20b80 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  [0]!='-' ) retur
20b90 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20  n 0;.  zStr++;. 
20ba0 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d   if( zStr[0]=='-
20bb0 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65  ' ) zStr++;.  re
20bc0 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72  turn strcmp(zStr
20bd0 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f  , zOpt)==0;.}../
20be0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69  *.** Delete a fi
20bf0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c  le..*/.int shell
20c00 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74  DeleteFile(const
20c10 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
20c20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66  ){.  int rc;.#if
20c30 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68  def _WIN32.  wch
20c40 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
20c50 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
20c60 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  unicode(zFilenam
20c70 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c  e);.  rc = _wunl
20c80 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ink(z);.  sqlite
20c90 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
20ca0 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a  .  rc = unlink(z
20cb0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
20cc0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
20cd0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
20ce0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
20cf0 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68 65  ary file (if the
20d00 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66  re is one) and f
20d10 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72  ree the.** memor
20d20 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  y used to hold t
20d30 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
20d40 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  emp file..*/.sta
20d50 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65  tic void clearTe
20d60 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74  mpFile(ShellStat
20d70 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
20d80 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  zTempFile==0 ) r
20d90 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
20da0 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75  doXdgOpen ) retu
20db0 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44  rn;.  if( shellD
20dc0 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65  eleteFile(p->zTe
20dd0 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e  mpFile) ) return
20de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
20df0 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  (p->zTempFile);.
20e00 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
20e10 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
20e20 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66  ate a new temp f
20e30 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68  ile name with th
20e40 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a  e given suffix..
20e50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
20e60 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  ewTempFile(Shell
20e70 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
20e80 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a  char *zSuffix){.
20e90 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28    clearTempFile(
20ea0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
20eb0 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  ee(p->zTempFile)
20ec0 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ;.  p->zTempFile
20ed0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64   = 0;.  if( p->d
20ee0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
20ef0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
20f00 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  >db, 0, SQLITE_F
20f10 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
20f20 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  E, &p->zTempFile
20f30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
20f40 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
20f50 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
20f60 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  64 r;.    sqlite
20f70 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
20f80 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
20f90 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
20fa0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20fb0 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72  "temp%llx.%s", r
20fc0 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  , zSuffix);.  }e
20fd0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d  lse{.    p->zTem
20fe0 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
20ff0 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c  mprintf("%z.%s",
21000 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a   p->zTempFile, z
21010 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69  Suffix);.  }.  i
21020 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d  f( p->zTempFile=
21030 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
21040 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
21050 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
21060 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
21070 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
21080 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
21090 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
210a0 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61  ction fkey_colla
210b0 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65  te_clause(), use
210c0 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69  d.** by the ".li
210d0 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
210e0 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73   command. This s
210f0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69  calar function i
21100 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c  s always.** call
21110 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67  ed with four arg
21120 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72  uments - the par
21130 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  ent table name, 
21140 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
21150 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63  n name,.** the c
21160 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  hild table name 
21170 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f  and the child co
21180 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  lumn name..**.**
21190 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
211a0 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74  clause('parent-t
211b0 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c  ab', 'parent-col
211c0 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20  ', 'child-tab', 
211d0 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a  'child-col').**.
211e0 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
211f0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73  the named tables
21200 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e   or columns do n
21210 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66  ot exist, this f
21220 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
21230 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  ns an empty stri
21240 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72  ng. An empty str
21250 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ing is also retu
21260 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62  rned if both tab
21270 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d  les.** and colum
21280 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76  ns exist but hav
21290 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
212a0 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
212b0 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66  uence. Or,.** if
212c0 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20   both exist but 
212d0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
212e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
212f0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
21300 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
21310 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
21320 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61  ng " COLLATE <pa
21330 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22  rent-collation>"
21340 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65  , where.** <pare
21350 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73  nt-collation> is
21360 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
21370 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
21380 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  of the parent co
21390 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
213a0 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f  void shellFkeyCo
213b0 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73  llateClause(.  s
213c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
213d0 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
213e0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
213f0 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
21400 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
21410 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
21420 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20  handle(pCtx);.  
21430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
21440 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ent;.  const cha
21450 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20  r *zParentCol;. 
21460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
21470 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74  rentSeq;.  const
21480 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20   char *zChild;. 
21490 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
214a0 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  ildCol;.  const 
214b0 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20  char *zChildSeq 
214c0 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  = 0;  /* Initial
214d0 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c  ize to avoid fal
214e0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e  se-positive warn
214f0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
21500 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
21510 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74  ==4 );.  zParent
21520 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
21530 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
21540 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
21550 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f  zParentCol = (co
21560 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
21570 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
21580 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[1]);.  zChild
21590 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
215a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
215b0 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
215c0 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e  zChildCol = (con
215d0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
215e0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
215f0 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  l[3]);..  sqlite
21600 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
21610 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49  tx, "", -1, SQLI
21620 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63  TE_STATIC);.  rc
21630 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
21640 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
21650 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69  (.      db, "mai
21660 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61  n", zParent, zPa
21670 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61  rentCol, 0, &zPa
21680 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30  rentSeq, 0, 0, 0
21690 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
216a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
216b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
216c0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
216d0 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ata(.        db,
216e0 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c   "main", zChild,
216f0 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26   zChildCol, 0, &
21700 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c  zChildSeq, 0, 0,
21710 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
21720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21730 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
21740 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71  ricmp(zParentSeq
21750 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a  , zChildSeq) ){.
21760 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
21770 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
21780 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61  COLLATE %s", zPa
21790 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71  rentSeq);.    sq
217a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
217b0 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53  t(pCtx, z, -1, S
217c0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
217d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
217e0 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(z);.  }.}.../
217f0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
21800 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63  ntation of dot-c
21810 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b  ommand ".lint fk
21820 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a  ey-indexes"..*/.
21830 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46  static int lintF
21840 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68  keyIndexes(.  Sh
21850 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
21860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
21870 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
21880 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
21890 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
218b0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
218c0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
218d0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
218e0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
21910 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
21920 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
21930 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  *db = pState->db
21940 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
21950 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75  ase handle to qu
21960 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66  ery "main" db of
21970 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20   */.  FILE *out 
21980 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20  = pState->out;  
21990 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20        /* Stream 
219a0 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72  to write non-err
219b0 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a  or output to */.
219c0 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
219d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
219e0 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65    /* If -verbose
219f0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
21a00 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72   int bGroupByPar
21a10 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
21a20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70   /* If -groupbyp
21a30 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  arent is present
21a40 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
21a70 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72  ate through azAr
21a80 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  g[] */.  const c
21a90 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22  har *zIndent = "
21aa0 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ";       /* How 
21ab0 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43  much to indent C
21ac0 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a  REATE INDEX by *
21ad0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21af0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21b00 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
21b10 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20  stmt *pSql = 0; 
21b20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
21b30 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  led version of S
21b40 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  QL statement bel
21b50 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ow */..  /*.  **
21b60 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   This SELECT sta
21b70 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f  tement returns o
21b80 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  ne row for each 
21b90 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
21ba0 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74  traint.  ** in t
21bb0 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
21bc0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
21bd0 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  The column value
21be0 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s are:.  **.  **
21bf0 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20   0. The text of 
21c00 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
21c10 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a   similar to:.  *
21c20 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50  *.  **      "EXP
21c30 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
21c40 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68  SELECT 1 FROM ch
21c50 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20  ild_table WHERE 
21c60 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a  child_key=?".  *
21c70 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53  *.  **    This S
21c80 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72  ELECT is similar
21c90 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74   to the one that
21ca0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
21cb0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
21cc0 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74  .  **    needs t
21cd0 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  o run internally
21ce0 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73   on child tables
21cf0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
21d00 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a   index that can.
21d10 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20    **    be used 
21d20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73  to optimize this
21d30 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
21d40 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64  can also be used
21d50 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20   by the FK.  ** 
21d60 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
21d70 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45  n to optimize DE
21d80 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
21d90 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
21da0 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20   parent.  **    
21db0 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
21dc0 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65   1. A GLOB patte
21dd0 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  rn suitable for 
21de0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
21df0 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f  ). If the plan o
21e00 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20  utput by.  **   
21e10 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
21e20 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
21e30 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74  matches this pat
21e40 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tern, then the s
21e50 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f  chema.  **    co
21e60 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20  ntains an index 
21e70 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
21e80 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
21e90 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
21ea0 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 2. Human reada
21eb0 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
21ec0 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c  scribes the chil
21ed0 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  d table and colu
21ee0 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
21ef0 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64   **       "child
21f00 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
21f10 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a  1, child_key2)".
21f20 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d    **.  ** 3. Hum
21f30 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
21f40 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
21f50 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
21f60 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
21f70 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
21f80 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65     "parent_table
21f90 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61  (parent_key1, pa
21fa0 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  rent_key2)".  **
21fb0 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20  .  ** 4. A full 
21fc0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
21fd0 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  tement for an in
21fe0 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62  dex that could b
21ff0 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20  e used to.  **  
22000 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54    optimize DELET
22010 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
22020 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
22030 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e  rent table. e.g.
22040 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
22050 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63   "CREATE INDEX c
22060 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64  hild_table_child
22070 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61  _key ON child_ta
22080 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a  ble(child_key)".
22090 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65    **.  ** 5. The
220a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
220b0 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ent table..  **.
220c0 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76    ** These six v
220d0 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62  alues are used b
220e0 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65  y the C logic be
220f0 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  low to generate 
22100 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f  the report..  */
22110 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22120 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20  Sql =.  "SELECT 
22130 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50  ".    "     'EXP
22140 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
22150 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20  SELECT 1 FROM ' 
22160 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
22170 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20   || ' WHERE '". 
22180 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
22190 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61  oncat(quote(s.na
221a0 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
221b0 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
221c0 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c   '=?' ".    "  |
221d0 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  | fkey_collate_c
221e0 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
221f0 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
22200 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
22210 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
22220 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41  e, f.[from]),' A
22230 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a  ND ')".    ", ".
22240 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43      "     'SEARC
22250 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e  H TABLE ' || s.n
22260 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43  ame || ' USING C
22270 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27  OVERING INDEX*('
22280 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
22290 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20  p_concat('*=?', 
222a0 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22  ' AND ') || ')'"
222b0 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
222c0 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27      s.name  || '
222d0 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
222e0 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c  at(f.[from],  ',
222f0 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
22300 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
22310 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20  .[table] || '(' 
22320 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
22330 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
22340 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27   p.[name])) || '
22350 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
22360 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49   "     'CREATE I
22370 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28  NDEX ' || quote(
22380 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67  s.name ||'_'|| g
22390 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
223a0 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20  rom], '_'))".   
223b0 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c   "  || ' ON ' ||
223c0 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
223d0 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  | '('".    "  ||
223e0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
223f0 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
22400 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66  ".    "        f
22410 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
22420 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
22430 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
22440 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
22450 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
22460 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c  e, f.[from]), ',
22470 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27   ')".    "  || '
22480 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  );'".    ", ".  
22490 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
224a0 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71  ] ".    "FROM sq
224b0 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73  lite_master AS s
224c0 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e  , pragma_foreign
224d0 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65  _key_list(s.name
224e0 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45  ) AS f ".    "LE
224f0 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74  FT JOIN pragma_t
22500 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f  able_info AS p O
22510 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20  N (pk-1=seq AND 
22520 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29  p.arg=f.[table])
22530 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59   ".    "GROUP BY
22540 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a   s.name, f.id ".
22550 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43      "ORDER BY (C
22560 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20  ASE WHEN ? THEN 
22570 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73  f.[table] ELSE s
22580 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a  .name END)".  ;.
22590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
225a0 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48  lobIPK = "SEARCH
225b0 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49   TABLE * USING I
225c0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
225d0 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a  EY (rowid=?)";..
225e0 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
225f0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
22600 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
22610 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Arg[i]);.    if(
22620 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
22630 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f  strnicmp("-verbo
22640 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  se", azArg[i], n
22650 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56  )==0 ){.      bV
22660 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
22670 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
22680 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
22690 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79  rnicmp("-groupby
226a0 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69  parent", azArg[i
226b0 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
226c0 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74    bGroupByParent
226d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64   = 1;.      zInd
226e0 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20  ent = "    ";.  
226f0 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
22700 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
22710 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
22720 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20  s %s ?-verbose? 
22730 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f  ?-groupbyparent?
22740 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  \n",.          a
22750 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31  zArg[0], azArg[1
22760 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
22770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22780 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
22790 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
227a0 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  he fkey_collate_
227b0 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e  clause() SQL fun
227c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20  ction */.  rc = 
227d0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
227e0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65  unction(db, "fke
227f0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
22800 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
22810 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c  8,.      0, shel
22820 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
22830 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a  se, 0, 0.  );...
22840 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22850 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
22860 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
22870 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
22880 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a   &pSql, 0);.  }.
22890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
228a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
228b0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
228c0 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72  , 1, bGroupByPar
228d0 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
228e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
228f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
22900 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d     char *zPrev =
22910 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   0;.    while( S
22920 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
22930 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
22940 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
22950 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
22960 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
22970 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  n = 0;.      con
22980 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
22990 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
229a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
229b0 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20  (pSql, 0);.     
229c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
229d0 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ob = (const char
229e0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
229f0 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
22a00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
22a10 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74   *zFrom = (const
22a20 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
22a30 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
22a40 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   2);.      const
22a50 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d   char *zTarget =
22a60 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
22a70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
22a80 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
22a90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
22aa0 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  I = (const char*
22ab0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
22ac0 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20  text(pSql, 4);. 
22ad0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
22ae0 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73  *zParent = (cons
22af0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
22b00 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
22b10 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  , 5);..      rc 
22b20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
22b30 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
22b40 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
22b50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22b60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
22b70 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  k;.      if( SQL
22b80 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
22b90 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
22ba0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
22bb0 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28   char *zPlan = (
22bc0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
22bd0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
22be0 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20  pExplain, 3);.  
22bf0 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20        res = (.  
22c00 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73              0==s
22c10 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
22c20 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  Glob, zPlan).   
22c30 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
22c40 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
22c50 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20  lobIPK, zPlan). 
22c60 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22c70 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
22c80 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
22c90 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69  xplain);.      i
22ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22cb0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
22cc0 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
22cd0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
22ce0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
22cf0 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22   internal error"
22d00 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
22d10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22d20 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75         if( bGrou
22d30 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20  pByParent.      
22d40 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c    && (bVerbose |
22d50 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20  | res==0).      
22d60 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c    && (zPrev==0 |
22d70 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
22d80 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76  p(zParent, zPrev
22d90 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
22da0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
22db0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65  tf(out, "-- Pare
22dc0 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20  nt table %s\n", 
22dd0 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
22de0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22df0 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  (zPrev);.       
22e00 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74     zPrev = sqlit
22e10 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
22e20 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
22e30 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
22e40 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
22e50 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
22e60 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20  (out, "%s%s --> 
22e70 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20  %s\n", zIndent, 
22e80 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  zCI, zTarget);. 
22e90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
22ea0 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
22eb0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
22ec0 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20  f(out, "%s/* no 
22ed0 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65  extra indexes re
22ee0 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e  quired for %s ->
22ef0 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
22f00 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74           zIndent
22f10 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74  , zFrom, zTarget
22f20 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
22f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22f40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22f50 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a  3_free(zPrev);..
22f60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
22f80 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
22f90 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
22fa0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
22fb0 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20     }..    rc2 = 
22fc0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22fd0 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pSql);.    if( 
22fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22ff0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
23000 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
23010 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  2;.      raw_pri
23020 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
23030 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
23040 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
23050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
23060 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23070 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
23080 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
23090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
230a0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
230b0 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22  ation of ".lint"
230c0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
230d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
230e0 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
230f0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
23100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23110 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
23120 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
23130 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23150 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
23160 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
23170 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
23180 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
231b0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
231c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
231d0 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20   n = (nArg>=2 ? 
231e0 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
231f0 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e  ]) : 0);.  if( n
23200 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  <1 || sqlite3_st
23210 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  rnicmp(azArg[1],
23220 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c   "fkey-indexes",
23230 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65   n) ) goto usage
23240 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46  ;.  return lintF
23250 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74  keyIndexes(pStat
23260 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  e, azArg, nArg);
23270 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f  .. usage:.  raw_
23280 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23290 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d  Usage %s sub-com
232a0 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e  mand ?switches..
232b0 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  .?\n", azArg[0])
232c0 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
232d0 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75  tderr, "Where su
232e0 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c  b-commands are:\
232f0 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  n");.  raw_print
23300 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66  f(stderr, "    f
23310 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b  key-indexes\n");
23320 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23330 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21  _ERROR;.}..#if !
23340 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
23350 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
23360 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
23370 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f  ITE_HAVE_ZLIB)./
23380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
233d0 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69  *.** The ".archi
233e0 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d  ve" or ".ar" com
233f0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
23400 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
23410 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
23420 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  , .  int *pRc, .
23430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
23440 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql, .  sqlite3_s
23450 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a  tmt **ppStmt.){.
23460 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
23470 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
23480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
23490 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
234a0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
234b0 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29  , -1, ppStmt, 0)
234c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
234d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
234e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
234f0 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20  rr, "sql error: 
23500 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20  %s (%d)\n", .   
23510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
23520 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74  rrmsg(db), sqlit
23530 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20  e3_errcode(db). 
23540 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70       );.      *p
23550 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  Rc = rc;.    }. 
23560 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
23570 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72  d shellPreparePr
23580 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20  intf(.  sqlite3 
23590 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
235a0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
235b0 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f  t **ppStmt,.  co
235c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
235d0 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53  .  ....){.  *ppS
235e0 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  tmt = 0;.  if( *
235f0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
23600 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
23610 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ;.    char *z;. 
23620 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
23630 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
23640 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
23650 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69  zFmt, ap);.    i
23660 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
23670 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
23680 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
23690 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70  .      shellPrep
236a0 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20  are(db, pRc, z, 
236b0 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73  ppStmt);.      s
236c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
236d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
236e0 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69  tic void shellFi
236f0 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70  nalize(.  int *p
23700 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
23710 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
23720 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
23730 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
23740 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
23750 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74  (pStmt);.    int
23760 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23770 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
23780 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c     if( *pRc==SQL
23790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
237a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
237b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  K ){.        raw
237c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
237d0 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
237e0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
237f0 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a  g(db));.      }.
23800 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b        *pRc = rc;
23810 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
23820 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52  atic void shellR
23830 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63  eset(.  int *pRc
23840 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
23850 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e  t *pStmt.){.  in
23860 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  t rc = sqlite3_r
23870 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
23880 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
23890 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
238a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
238b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
238c0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
238d0 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
238e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
238f0 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72  derr, "SQL error
23900 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
23910 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
23920 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72    }.    *pRc = r
23930 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53  c;.  }.}./*.** S
23940 74 72 75 63 74 75 72 65 20 72 65 70 72 65 73 65  tructure represe
23950 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22  nting a single "
23960 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  .ar" command..*/
23970 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
23980 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d  ArCommand ArComm
23990 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f  and;.struct ArCo
239a0 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d  mmand {.  u8 eCm
239b0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
239c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
239d0 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a  AR_CMD_* value *
239e0 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b  /.  u8 bVerbose;
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
23a10 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38  -verbose */.  u8
23a20 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20   bZip;          
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a40 20 54 72 75 65 20 69 66 20 74 68 65 20 61 72 63   True if the arc
23a50 68 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f  hive is a ZIP */
23a60 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20  .  u8 bDryRun;  
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d     /* True if --
23a90 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20  dry-run */.  u8 
23aa0 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20  bAppend;        
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ac0 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64  True if --append
23ad0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23b00 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
23b10 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
23b20 7a 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20  zSrcTable;      
23b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71            /* "sq
23b40 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24  lar", "zipfile($
23b50 66 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20  file)" or "zip" 
23b60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23b70 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
23b80 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61       /* --file a
23b90 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
23ba0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23bb0 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20   *zDir;         
23bc0 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63        /* --direc
23bd0 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f  tory argument, o
23be0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
23bf0 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
23c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23c10 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
23c20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53  arguments */.  S
23c30 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20  hellState *p;   
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c50 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f  * Shell state */
23c60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
23c90 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72  ontaining the ar
23ca0 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  chive */.};../*.
23cb0 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65  ** Print a usage
23cc0 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
23cd0 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
23ce0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
23cf0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
23d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
23d10 55 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a  Usage(FILE *f){.
23d20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a    raw_printf(f,.
23d30 22 5c 6e 22 0a 22 55 73 61 67 65 3a 20 2e 61 72  "\n"."Usage: .ar
23d40 20 5b 4f 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49   [OPTION...] [FI
23d50 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e  LE...]\n"."The .
23d60 61 72 20 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67  ar command manag
23d70 65 73 20 73 71 6c 61 72 20 61 72 63 68 69 76 65  es sqlar archive
23d80 73 2e 5c 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d  s.\n"."\n"."Exam
23d90 70 6c 65 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20  ples:\n"."  .ar 
23da0 2d 63 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -cf archive.sar 
23db0 66 6f 6f 20 62 61 72 20 20 20 20 23 20 43 72 65  foo bar    # Cre
23dc0 61 74 65 20 61 72 63 68 69 76 65 2e 73 61 72 20  ate archive.sar 
23dd0 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61  from files foo a
23de0 6e 64 20 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72  nd bar\n"."  .ar
23df0 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72   -tf archive.sar
23e00 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4c 69              # Li
23e10 73 74 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72  st members of ar
23e20 63 68 69 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20  chive.sar\n"."  
23e30 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76 65  .ar -xvf archive
23e40 2e 73 61 72 20 20 20 20 20 20 20 20 20 20 20 23  .sar           #
23e50 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61   Verbosely extra
23e60 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
23e70 63 68 69 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e  chive.sar\n"."\n
23e80 22 0a 22 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20  "."Each command 
23e90 6c 69 6e 65 20 6d 75 73 74 20 66 65 61 74 75 72  line must featur
23ea0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f  e exactly one co
23eb0 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22  mmand option:\n"
23ec0 0a 22 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65  ."  -c, --create
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
23ee0 72 65 61 74 65 20 61 20 6e 65 77 20 61 72 63 68  reate a new arch
23ef0 69 76 65 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d  ive\n"."  -u, --
23f00 75 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  update          
23f10 20 20 20 20 20 55 70 64 61 74 65 20 6f 72 20 61       Update or a
23f20 64 64 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65  dd files to an e
23f30 78 69 73 74 69 6e 67 20 61 72 63 68 69 76 65 5c  xisting archive\
23f40 6e 22 0a 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74  n"."  -t, --list
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f   List contents o
23f70 66 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20  f archive\n"."  
23f80 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20 20 20  -x, --extract   
23f90 20 20 20 20 20 20 20 20 20 20 20 45 78 74 72 61             Extra
23fa0 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
23fb0 63 68 69 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41  chive\n"."\n"."A
23fc0 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  nd zero or more 
23fd0 6f 70 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73  optional options
23fe0 3a 5c 6e 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65  :\n"."  -v, --ve
23ff0 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  rbose           
24000 20 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69     Print each fi
24010 6c 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20  lename as it is 
24020 70 72 6f 63 65 73 73 65 64 5c 6e 22 0a 22 20 20  processed\n"."  
24030 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20  -f FILE, --file 
24040 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61  FILE       Opera
24050 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49  te on archive FI
24060 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73 20 63  LE (default is c
24070 75 72 72 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20  urrent db)\n"." 
24080 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65   -a FILE, --appe
24090 6e 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72  nd FILE     Oper
240a0 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e  ate on FILE open
240b0 65 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e  ed using the apn
240c0 64 76 66 73 20 56 46 53 5c 6e 22 0a 22 20 20 2d  dvfs VFS\n"."  -
240d0 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f  C DIR, --directo
240e0 72 79 20 44 49 52 20 20 20 20 43 68 61 6e 67 65  ry DIR    Change
240f0 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 44 49   to directory DI
24100 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72 61 63  R to read/extrac
24110 74 20 66 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e  t files\n"."  -n
24120 2c 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20  , --dryrun      
24130 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
24140 65 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64  e SQL that would
24150 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 5c 6e   have occurred\n
24160 22 0a 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f  "."\n"."See also
24170 3a 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e  : http://sqlite.
24180 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c  org/cli.html#sql
24190 61 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f  ar_archive_suppo
241a0 72 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20  rt\n"."\n".);.  
241b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
241c0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ROR;.}../*.** Pr
241d0 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
241e0 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
241f0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
24200 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a  rr and return .*
24210 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  * SQLITE_ERROR..
24220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
24230 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
24240 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
24250 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
24260 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73   char *z;.  va_s
24270 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
24280 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
24290 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
242a0 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
242b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
242c0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20  err, "Error: %s 
242d0 28 74 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c  (try \".ar --hel
242e0 70 5c 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73  p\")\n", z);.  s
242f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
24300 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24310 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
24320 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d  Values for ArCom
24330 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64  mand.eCmd..*/.#d
24340 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45  efine AR_CMD_CRE
24350 41 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66  ATE       1.#def
24360 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ine AR_CMD_EXTRA
24370 43 54 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e  CT      2.#defin
24380 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20  e AR_CMD_LIST   
24390 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
243a0 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20  AR_CMD_UPDATE   
243b0 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52      4.#define AR
243c0 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20  _CMD_HELP       
243d0 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72    5../*.** Other
243e0 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73   (non-command) s
243f0 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66  witches..*/.#def
24400 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ine AR_SWITCH_VE
24410 52 42 4f 53 45 20 20 20 20 20 36 0a 23 64 65 66  RBOSE     6.#def
24420 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49  ine AR_SWITCH_FI
24430 4c 45 20 20 20 20 20 20 20 20 37 0a 23 64 65 66  LE        7.#def
24440 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ine AR_SWITCH_DI
24450 52 45 43 54 4f 52 59 20 20 20 38 0a 23 64 65 66  RECTORY   8.#def
24460 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50  ine AR_SWITCH_AP
24470 50 45 4e 44 20 20 20 20 20 20 39 0a 23 64 65 66  PEND      9.#def
24480 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52  ine AR_SWITCH_DR
24490 59 52 55 4e 20 20 20 20 20 31 30 0a 0a 73 74 61  YRUN     10..sta
244a0 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73  tic int arProces
244b0 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e  sSwitch(ArComman
244c0 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69  d *pAr, int eSwi
244d0 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tch, const char 
244e0 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *zArg){.  switch
244f0 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20  ( eSwitch ){.   
24500 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
24510 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ATE:.    case AR
24520 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
24530 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
24540 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ST:.    case AR_
24550 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20  CMD_UPDATE:.    
24560 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  case AR_CMD_HELP
24570 3a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  :.      if( pAr-
24580 3e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20  >eCmd ){.       
24590 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
245a0 73 67 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d  sg("multiple com
245b0 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a  mand options");.
245c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
245d0 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63  r->eCmd = eSwitc
245e0 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  h;.      break;.
245f0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
24600 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20  TCH_DRYRUN:.    
24610 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d    pAr->bDryRun =
24620 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
24630 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
24640 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20  TCH_VERBOSE:.   
24650 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
24660 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
24670 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  k;.    case AR_S
24680 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20  WITCH_APPEND:.  
24690 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64      pAr->bAppend
246a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46   = 1;.      /* F
246b0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d  all thru into --
246c0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  file */.    case
246d0 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a   AR_SWITCH_FILE:
246e0 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c  .      pAr->zFil
246f0 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  e = zArg;.      
24700 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
24710 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
24720 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ORY:.      pAr->
24730 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20  zDir = zArg;.   
24740 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
24750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24760 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  K;.}../*.** Pars
24770 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
24780 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20  ne for an ".ar" 
24790 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73  command. The res
247a0 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ults are written
247b0 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75   into.** structu
247c0 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54  re (*pAr). SQLIT
247d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
247e0 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   if the command 
247f0 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a  line is parsed.*
24800 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
24810 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
24820 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
24830 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20  itten to stderr 
24840 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  and .** SQLITE_E
24850 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a  RROR returned..*
24860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  /.static int arP
24870 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63  arseCommand(.  c
24880 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
248a0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
248b0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
248c0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
248d0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
24900 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
24910 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  */.  ArCommand *
24920 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20  pAr             
24930 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
24940 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
24950 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  ){.  struct ArSw
24960 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74  itch {.    const
24970 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20   char *zLong;.  
24980 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20    char cShort;. 
24990 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20     u8 eSwitch;. 
249a0 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20     u8 bArg;.  } 
249b0 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20  aSwitch[] = {.  
249c0 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20    { "create",   
249d0 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45   'c', AR_CMD_CRE
249e0 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ATE,       0 },.
249f0 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c      { "extract",
24a00 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45     'x', AR_CMD_E
24a10 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d  XTRACT,      0 }
24a20 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20  ,.    { "list", 
24a30 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44       't', AR_CMD
24a40 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30  _LIST,         0
24a50 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74   },.    { "updat
24a60 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43  e",    'u', AR_C
24a70 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20  MD_UPDATE,      
24a80 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c   0 },.    { "hel
24a90 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52  p",      'h', AR
24aa0 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20  _CMD_HELP,      
24ab0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76     0 },.    { "v
24ac0 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20  erbose",   'v', 
24ad0 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
24ae0 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20  E,   0 },.    { 
24af0 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27  "file",      'f'
24b00 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  , AR_SWITCH_FILE
24b10 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ,      1 },.    
24b20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27  { "append",    '
24b30 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50  a', AR_SWITCH_AP
24b40 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20  PEND,    1 },.  
24b50 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c    { "directory",
24b60 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'C', AR_SWITCH_
24b70 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a  DIRECTORY, 1 },.
24b80 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20      { "dryrun", 
24b90 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43     'n', AR_SWITC
24ba0 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d  H_DRYRUN,    0 }
24bb0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77  ,.  };.  int nSw
24bc0 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53  itch = sizeof(aS
24bd0 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28  witch) / sizeof(
24be0 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29  struct ArSwitch)
24bf0 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  ;.  struct ArSwi
24c00 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77  tch *pEnd = &aSw
24c10 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a  itch[nSwitch];..
24c20 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b    if( nArg<=1 ){
24c30 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 55 73  .    return arUs
24c40 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d  age(stderr);.  }
24c50 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
24c60 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  z = azArg[1];.  
24c70 20 20 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c    memset(pAr, 0,
24c80 20 73 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e   sizeof(ArComman
24c90 64 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b  d));..    if( z[
24ca0 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
24cb0 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20   /* Traditional 
24cc0 73 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f  style [tar] invo
24cd0 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
24ce0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
24cf0 20 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20   iArg = 2;.     
24d00 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
24d10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
24d20 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
24d30 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75   0;.        stru
24d40 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
24d50 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  t;.        for(p
24d60 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
24d70 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
24d80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
24d90 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
24da0 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
24db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24dc0 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
24dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
24de0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
24df0 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
24e00 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
24e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24e20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
24e30 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  g ){.          i
24e40 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b  f( iArg>=nArg ){
24e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
24e60 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
24e70 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
24e80 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22  an argument: %c"
24e90 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ,z[i]);.        
24ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41    }.          zA
24eb0 72 67 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b  rg = azArg[iArg+
24ec0 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +];.        }.  
24ed0 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
24ee0 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
24ef0 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
24f00 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
24f10 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
24f20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41   }.      pAr->nA
24f30 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
24f40 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e        if( pAr->n
24f50 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg>0 ){.       
24f60 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
24f70 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
24f80 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
24f90 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64       /* Non-trad
24fa0 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69  itional invocati
24fb0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
24fc0 69 41 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  iArg;.      for(
24fd0 69 41 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72  iArg=1; iArg<nAr
24fe0 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20  g; iArg++){.    
24ff0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
25000 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72     z = azArg[iAr
25010 67 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g];.        if( 
25020 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]!='-' ){.   
25030 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65         /* All re
25040 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  maining command 
25050 6c 69 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63  line words are c
25060 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
25070 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
25080 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
25090 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
250a0 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20      pAr->nArg = 
250b0 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20  nArg-iArg;.     
250c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
250d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20      }.        n 
250e0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a  = strlen30(z);..
250f0 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d          if( z[1]
25100 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  !='-' ){.       
25110 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
25120 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
25130 72 65 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73  re short options
25140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
25150 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=1; i<n; i++)
25160 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
25170 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
25180 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
25190 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
251a0 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20  *pOpt;.         
251b0 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
251c0 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
251d0 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
251e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
251f0 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72  [i]==pOpt->cShor
25200 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
25210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25220 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
25230 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
25240 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
25250 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e  rorMsg("unrecogn
25260 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 5c  ized option: %c\
25270 6e 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  n", z[i]);.     
25280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25290 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62       if( pOpt->b
252a0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
252b0 20 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29       if( i<(n-1)
252c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
252d0 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b      zArg = &z[i+
252e0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
252f0 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20      i = n;.     
25300 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d  if( iArg>=(nArg-
25330 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
25340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
25350 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f  rErrorMsg("optio
25360 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
25370 67 75 6d 65 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b  gument: %c\n",z[
25380 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
25390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
253a0 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
253b0 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20  Arg[++iArg];.   
253c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
253d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
253e0 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f         if( arPro
253f0 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20  cessSwitch(pAr, 
25400 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a  pOpt->eSwitch, z
25410 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
25420 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25440 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d  }else if( z[2]==
25450 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\0' ){.        
25460 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e    /* A -- option
25470 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
25480 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20  t all remaining 
25490 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72  command line wor
254a0 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ds.          ** 
254b0 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
254c0 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ments.  */.     
254d0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
254e0 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d  = &azArg[iArg+1]
254f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  ;.          pAr-
25500 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
25510 67 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  g-1;.          b
25520 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
25530 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25540 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20  * A long option 
25550 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  */.          con
25560 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
25570 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
25580 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f  * Argument for o
25590 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f  ption, if any */
255a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
255b0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74  t ArSwitch *pMat
255c0 63 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ch = 0;      /* 
255d0 4d 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20  Matching option 
255e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  */.          str
255f0 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f  uct ArSwitch *pO
25600 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pt;            /
25610 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  * Iterator */.  
25620 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
25630 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
25640 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
25650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
25660 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20  nst char *zLong 
25670 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20  = pOpt->zLong;. 
25680 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
25690 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a  n-2)<=strlen30(z
256a0 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63  Long) && 0==memc
256b0 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c  mp(&z[2], zLong,
256c0 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20   n-2) ){.       
256d0 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63         if( pMatc
256e0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
256f0 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
25700 72 6f 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75  rorMsg("ambiguou
25710 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29  s option: %s",z)
25720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25740 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
25750 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pOpt;.          
25760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
25780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
25790 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Match==0 ){.    
257a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
257b0 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63  rErrorMsg("unrec
257c0 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
257d0 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
257e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
257f0 66 28 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20  f( pMatch->bArg 
25800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
25810 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31  f( iArg>=(nArg-1
25820 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
25830 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
25840 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71  rMsg("option req
25850 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
25860 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  t: %s", z);.    
25870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25880 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
25890 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
258a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
258b0 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
258c0 77 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63  witch(pAr, pMatc
258d0 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  h->eSwitch, zArg
258e0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
258f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
25900 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25910 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25920 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25930 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25940 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c   assumes that al
25950 6c 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  l arguments with
25960 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64  in the ArCommand
25970 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61  .azArg[].** arra
25980 79 20 72 65 66 65 72 20 74 6f 20 61 72 63 68 69  y refer to archi
25990 76 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66  ve members, as f
259a0 6f 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74  or the --extract
259b0 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61   or --list comma
259c0 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63  nds. .** It chec
259d0 6b 73 20 74 68 61 74 20 65 61 63 68 20 6f 66 20  ks that each of 
259e0 74 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74  them are present
259f0 2e 20 49 66 20 61 6e 79 20 73 70 65 63 69 66 69  . If any specifi
25a00 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a  ed file is not.*
25a10 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  * present in the
25a20 20 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72   archive, an err
25a30 6f 72 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f  or is printed to
25a40 20 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65   stderr and an e
25a50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74  rror.** code ret
25a60 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
25a70 2c 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69  , if all specifi
25a80 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ed arguments are
25a90 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
25aa0 68 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49  he archive, SQLI
25ab0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
25ac0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
25ad0 6e 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e  nction strips an
25ae0 79 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63  y trailing '/' c
25af0 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65  haracters from e
25b00 61 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ach argument..**
25b10 20 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74   This is consist
25b20 65 6e 74 20 77 69 74 68 20 74 68 65 20 77 61 79  ent with the way
25b30 20 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61   the [tar] comma
25b40 6e 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b  nd seems to work
25b50 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f   on.** Linux..*/
25b60 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 68  .static int arCh
25b70 65 63 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d  eckEntries(ArCom
25b80 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e  mand *pAr){.  in
25b90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25ba0 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72  ;.  if( pAr->nAr
25bb0 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  g ){.    int i, 
25bc0 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  j;.    sqlite3_s
25bd0 74 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a  tmt *pTest = 0;.
25be0 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
25bf0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
25c00 20 26 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20   &rc, &pTest,.  
25c10 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
25c20 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  me FROM %s WHERE
25c30 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20   name=$name", . 
25c40 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63         pAr->zSrc
25c50 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20  Table.    );.   
25c60 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
25c70 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
25c80 78 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22  x(pTest, "$name"
25c90 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
25ca0 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
25cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
25cc0 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
25cd0 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
25ce0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ];.      int n =
25cf0 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
25d00 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b      int bOk = 0;
25d10 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e  .      while( n>
25d20 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27  0 && z[n-1]=='/'
25d30 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b   ) n--;.      z[
25d40 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
25d50 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
25d60 78 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20  xt(pTest, j, z, 
25d70 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
25d80 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  C);.      if( SQ
25d90 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
25da0 33 5f 73 74 65 70 28 70 54 65 73 74 29 20 29 7b  3_step(pTest) ){
25db0 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
25dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25dd0 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20  shellReset(&rc, 
25de0 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pTest);.      if
25df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25e00 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  && bOk==0 ){.   
25e10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25e20 28 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f  (stderr, "not fo
25e30 75 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20  und in archive: 
25e40 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
25e50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
25e60 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
25e70 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
25e80 61 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74  alize(&rc, pTest
25e90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
25ea0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
25eb0 6d 61 74 20 61 20 57 48 45 52 45 20 63 6c 61 75  mat a WHERE clau
25ec0 73 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  se that can be u
25ed0 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  sed against the 
25ee0 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f  "sqlar" table to
25ef0 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c  .** identify all
25f00 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
25f10 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
25f20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
25f30 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70  s held.** in (*p
25f40 41 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20  Ar). Leave this 
25f50 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
25f60 28 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72  (*pzWhere) befor
25f70 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
25f80 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
25f90 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76  sponsible for ev
25fa0 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67  entually calling
25fb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
25fc0 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55  on.** any non-NU
25fd0 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61  LL (*pzWhere) va
25fe0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
25ff0 6f 69 64 20 61 72 57 68 65 72 65 43 6c 61 75 73  oid arWhereClaus
26000 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
26010 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
26020 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68  , .  char **pzWh
26030 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
26040 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
26050 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
26060 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  .){.  char *zWhe
26070 72 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  re = 0;.  if( *p
26080 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
26090 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41  .    if( pAr->nA
260a0 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  rg==0 ){.      z
260b0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  Where = sqlite3_
260c0 6d 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20  mprintf("1");.  
260d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
260e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt i;.      cons
260f0 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22  t char *zSep = "
26100 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ";.      for(i=0
26110 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69  ; i<pAr->nArg; i
26120 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
26130 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72  st char *z = pAr
26140 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
26150 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c      zWhere = sql
26160 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
26170 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61          "%z%s na
26180 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62  me = '%q' OR sub
26190 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d  str(name,1,%d) =
261a0 20 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20   '%q/'", .      
261b0 20 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70      zWhere, zSep
261c0 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29  , z, strlen30(z)
261d0 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b  +1, z.        );
261e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 68  .        if( zWh
261f0 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ere==0 ){.      
26200 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
26210 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
26220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26230 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70    }.        zSep
26240 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20   = " OR ";.     
26250 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
26260 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
26270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
26280 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
26290 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e   "lisT" command.
262a0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
262b0 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72  arListCommand(Ar
262c0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
262d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
262e0 6c 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46  l = "SELECT %s F
262f0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73 22  ROM %s WHERE %s"
26300 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ; .  const char 
26310 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20  *azCols[] = {.  
26320 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c    "name",.    "l
26330 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c  smode(mode), sz,
26340 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c   datetime(mtime,
26350 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e   'unixepoch'), n
26360 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61  ame".  };..  cha
26370 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
26380 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26390 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
263a0 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65  c;..  rc = arChe
263b0 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a  ckEntries(pAr);.
263c0 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28    arWhereClause(
263d0 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72  &rc, pAr, &zWher
263e0 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70  e);..  shellPrep
263f0 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
26400 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
26410 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d  Sql, azCols[pAr-
26420 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20  >bVerbose],.    
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c   pAr->zSrcTable,
26450 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20   zWhere);.  if( 
26460 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a  pAr->bDryRun ){.
26470 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
26480 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
26490 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
264a0 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65  (pSql));.  }else
264b0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  {.    while( rc=
264c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
264d0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
264e0 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a  3_step(pSql) ){.
264f0 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62        if( pAr->b
26500 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
26510 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
26520 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20  Ar->p->out, "%s 
26530 25 20 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22  % 10d  %s  %s\n"
26540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
26550 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
26560 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20  t(pSql, 0),.    
26570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26580 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
26590 20 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20   1), .          
265a0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
265b0 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a  _text(pSql, 2),.
265c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
265d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
265e0 70 53 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20  pSql, 3).       
265f0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
26600 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
26610 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
26620 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
26630 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
26640 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d  ql, 0));.      }
26650 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65  .    }.  }.  she
26660 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
26670 70 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSql);.  return 
26680 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
26690 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
266a0 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
266b0 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
266c0 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
266d0 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
266e0 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
266f0 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20  char *zSql1 = . 
26700 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20     "SELECT ".   
26710 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65   " ($dir || name
26720 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65 66  ),".    " writef
26730 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d  ile(($dir || nam
26740 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74  e), %s, mode, mt
26750 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d  ime) ".    "FROM
26760 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41   %s WHERE (%s) A
26770 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c  ND (data IS NULL
26780 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30   OR $dirOnly = 0
26790 29 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61  )";..  const cha
267a0 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20  r *azExtraArg[] 
267b0 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f  = { .    "sqlar_
267c0 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c  uncompress(data,
267d0 20 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61   sz)",.    "data
267e0 22 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65  ".  };..  sqlite
267f0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
26800 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26810 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
26820 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zDir = 0;.  char
26830 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
26840 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20  int i, j;..  /* 
26850 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  If arguments are
26860 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63   specified, chec
26870 6b 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75  k that they actu
26880 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69  ally exist withi
26890 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69  n.  ** the archi
268a0 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ve before procee
268b0 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c  ding. And formul
268c0 61 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ate a WHERE clau
268d0 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  se to.  ** match
268e0 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20   them.  */.  rc 
268f0 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
26900 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
26910 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
26920 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66   &zWhere);..  if
26930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26940 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  ){.    if( pAr->
26950 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44  zDir ){.      zD
26960 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
26970 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d  intf("%s/", pAr-
26980 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73  >zDir);.    }els
26990 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  e{.      zDir = 
269a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
269b0 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  "");.    }.    i
269c0 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20  f( zDir==0 ) rc 
269d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
269e0 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70    }..  shellPrep
269f0 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
26a00 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
26a10 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45  Sql1, .      azE
26a20 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69  xtraArg[pAr->bZi
26a30 70 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62  p], pAr->zSrcTab
26a40 6c 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a  le, zWhere.  );.
26a50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20  E_OK ){.    j = 
26a70 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
26a80 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71  ameter_index(pSq
26a90 6c 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20  l, "$dir");.    
26aa0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
26ab0 74 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c  t(pSql, j, zDir,
26ac0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
26ad0 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  IC);..    /* Run
26ae0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
26af0 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65  ement twice. The
26b00 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69   first time, wri
26b10 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  tefile() is call
26b20 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ed.    ** for al
26b30 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
26b40 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
26b50 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20   extracted. The 
26b60 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20  second time,.   
26b70 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65   ** only for the
26b80 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68   directories. Th
26b90 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
26ba0 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
26bb0 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65  .    ** extracte
26bc0 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75  d directories mu
26bd0 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65  st be reset afte
26be0 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c  r they are popul
26bf0 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20  ated (as.    ** 
26c00 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20  populating them 
26c10 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65  changes the time
26c20 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20  stamp).  */.    
26c30 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
26c40 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71  +){.      j = sq
26c50 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
26c60 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
26c70 20 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20   "$dirOnly");.  
26c80 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26c90 5f 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29  _int(pSql, j, i)
26ca0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  ;.      if( pAr-
26cb0 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  >bDryRun ){.    
26cc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
26cd0 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
26ce0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
26cf0 28 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (pSql));.      }
26d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
26d10 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
26d20 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
26d30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
26d40 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sql) ){.        
26d50 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41    if( i==0 && pA
26d60 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  r->bVerbose ){. 
26d70 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
26d80 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
26d90 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
26da0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
26db0 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  pSql, 0));.     
26dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
26de0 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
26df0 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
26e00 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
26e10 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  c, pSql);.  }.. 
26e20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
26e30 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ir);.  sqlite3_f
26e40 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
26e50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26e60 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  ** Run the SQL s
26e70 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c  tatement in zSql
26e80 2e 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61  .  Or if doing a
26e90 20 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c   --dryrun, merel
26ea0 79 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a  y print it out..
26eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
26ec0 45 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e  ExecSql(ArComman
26ed0 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68  d *pAr, const ch
26ee0 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
26ef0 20 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e   rc;.  if( pAr->
26f00 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
26f10 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
26f20 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
26f30 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
26f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
26f50 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  se{.    char *zE
26f60 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  rr = 0;.    rc =
26f70 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
26f80 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  r->db, zSql, 0, 
26f90 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  0, &zErr);.    i
26fa0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
26fb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
26fc0 6f 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c  out, "ERROR: %s\
26fd0 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
26fe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
26ff0 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rr);.    }.  }. 
27000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
27010 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
27020 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65  tion of .ar "cre
27030 61 74 65 22 20 61 6e 64 20 22 75 70 64 61 74 65  ate" and "update
27040 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a  " commands..**.*
27050 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
27060 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
27070 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
27080 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
27090 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
270a0 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
270b0 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
270c0 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
270d0 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
270e0 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
270f0 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
27100 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
27110 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
27120 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
27130 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
27140 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
27150 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
27160 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
27170 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
27180 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
27190 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
271a0 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
271b0 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
271c0 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73   beginning..*/.s
271d0 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
271e0 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
271f0 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
27200 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
27210 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
27220 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
27230 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
27240 55 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  Update          
27250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
27260 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
27270 65 2e 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d  e.  false for --
27280 75 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  update */.){.  c
27290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
272a0 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
272b0 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
272c0 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e   EXISTS sqlar(\n
272d0 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20  ".      "  name 
272e0 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
272f0 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68  ,  -- name of th
27300 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20  e file\n".      
27310 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20  "  mode INT,    
27320 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63             -- ac
27330 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
27340 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69  \n".      "  mti
27350 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
27360 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
27370 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
27380 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e  ".      "  sz IN
27390 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
273a0 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66     -- original f
273b0 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20  ile size\n".    
273c0 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20    "  data BLOB  
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
273e0 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65  compressed conte
273f0 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b  nt\n".      ")";
27400 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27410 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
27420 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
27430 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
27440 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 20 3d 20  r *zInsertFmt = 
27450 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  .     "REPLACE I
27460 4e 54 4f 20 73 71 6c 61 72 28 6e 61 6d 65 2c 6d  NTO sqlar(name,m
27470 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74  ode,mtime,sz,dat
27480 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45  a)\n".     "  SE
27490 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20  LECT\n".     "  
274a0 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20    %s,\n".     " 
274b0 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20     mode,\n".    
274c0 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a   "    mtime,\n".
274d0 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73       "    CASE s
274e0 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64  ubstr(lsmode(mod
274f0 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20  e),1,1)\n".     
27500 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20  "      WHEN '-' 
27510 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61  THEN length(data
27520 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  )\n".     "     
27530 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30   WHEN 'd' THEN 0
27540 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
27550 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a  ELSE -1 END,\n".
27560 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 57       "    CASE W
27570 48 45 4e 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  HEN lsmode(mode)
27580 20 4c 49 4b 45 20 27 64 25 25 27 20 54 48 45 4e   LIKE 'd%%' THEN
27590 20 4e 55 4c 4c 20 65 6c 73 65 20 64 61 74 61 20   NULL else data 
275a0 45 4e 44 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  END\n".     "  F
275b0 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
275c0 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52  \n".     "  WHER
275d0 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e  E lsmode(mode) N
275e0 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 3b  OT LIKE '?%%';";
275f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
27620 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69  ing through azFi
27630 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  le[] */.  int rc
27640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27660 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn code */..  r
27670 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
27680 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 61 72  r, "SAVEPOINT ar
27690 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ;");.  if( rc!=S
276a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
276b0 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 55 70 64  n rc;.  if( bUpd
276c0 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ate==0 ){.    rc
276d0 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
276e0 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20 69 66  , zDrop);.    if
276f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27700 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
27710 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71  .  rc = arExecSq
27720 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b  l(pAr, zCreate);
27730 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
27740 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53  r->nArg && rc==S
27750 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
27760 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
27770 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27780 28 7a 49 6e 73 65 72 74 46 6d 74 2c 0a 20 20 20  (zInsertFmt,.   
27790 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
277a0 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73  se ? "shell_puts
277b0 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d  nl(name)" : "nam
277c0 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  e",.        pAr-
277d0 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e  >azArg[i], pAr->
277e0 7a 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  zDir);.    rc = 
277f0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
27800 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sql);.    sqlite
27810 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
27820 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
27830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72 45  TE_OK ){.    arE
27840 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 4f 4c  xecSql(pAr, "ROL
27850 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c  LBACK TO ar; REL
27860 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 65  EASE ar;");.  }e
27870 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72  lse{.    rc = ar
27880 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45  ExecSql(pAr, "RE
27890 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d  LEASE ar;");.  }
278a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
278b0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
278c0 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
278d0 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
278e0 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
278f0 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
27900 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
27910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
27920 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
27930 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
27940 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
27950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
27960 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
27970 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
27980 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
27990 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
279a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
279b0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
279c0 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
279d0 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d  {.  ArCommand cm
279e0 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d  d;.  int rc;.  m
279f0 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73  emset(&cmd, 0, s
27a00 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 72  izeof(cmd));.  r
27a10 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  c = arParseComma
27a20 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20  nd(azArg, nArg, 
27a30 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  &cmd);.  if( rc=
27a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27a50 20 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20    int eDbType = 
27a60 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
27a70 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70  C;.    cmd.p = p
27a80 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64  State;.    cmd.d
27a90 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a  b = pState->db;.
27aa0 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
27ab0 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79  e ){.      eDbTy
27ac0 70 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62  pe = deduceDatab
27ad0 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c  aseType(cmd.zFil
27ae0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
27af0 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 70       eDbType = p
27b00 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b  State->openMode;
27b10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
27b20 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50  DbType==SHELL_OP
27b30 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20  EN_ZIPFILE ){.  
27b40 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
27b50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27b60 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20  cmd.zSrcTable = 
27b70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27b80 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 7d 65  "zip");.      }e
27b90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6d 64  lse{.        cmd
27ba0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
27bb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
27bc0 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e  pfile(%Q)", cmd.
27bd0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zFile);.      }.
27be0 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
27bf0 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md==AR_CMD_CREAT
27c00 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  E || cmd.eCmd==A
27c10 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a  R_CMD_UPDATE ){.
27c20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
27c30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 69 70  ntf(stderr, "zip
27c40 20 61 72 63 68 69 76 65 73 20 61 72 65 20 72 65   archives are re
27c50 61 64 2d 6f 6e 6c 79 5c 6e 22 29 3b 0a 20 20 20  ad-only\n");.   
27c60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27c70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
27c80 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
27c90 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
27ca0 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b     cmd.bZip = 1;
27cb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
27cc0 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
27cd0 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20    int flags;.   
27ce0 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65     if( cmd.bAppe
27cf0 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d 20 53  nd ) eDbType = S
27d00 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
27d10 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63  VFS;.      if( c
27d20 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
27d30 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43  CREATE || cmd.eC
27d40 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
27d50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  E ){.        fla
27d60 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
27d70 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
27d80 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
27d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27da0 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
27db0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
27dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27dd0 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20  cmd.db = 0;.    
27de0 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75    if( cmd.bDryRu
27df0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  n ){.        utf
27e00 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  8_printf(pState-
27e10 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64  >out, "-- open d
27e20 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e  atabase '%s'%s\n
27e30 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20  ", cmd.zFile,.  
27e40 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79             eDbTy
27e50 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  pe==SHELL_OPEN_A
27e60 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69  PPENDVFS ? " usi
27e70 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20  ng 'apndvfs'" : 
27e80 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "");.      }.   
27e90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
27ea0 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c  open_v2(cmd.zFil
27eb0 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67  e, &cmd.db, flag
27ec0 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
27ed0 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
27ee0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
27ef0 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b   "apndvfs" : 0);
27f00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27f20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27f30 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
27f40 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25  open file: %s (%
27f50 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s)\n", .        
27f60 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73      cmd.zFile, s
27f70 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d  qlite3_errmsg(cm
27f80 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b  d.db).        );
27f90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
27fa0 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
27fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
27fc0 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
27fd0 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  cmd.db, 0, 0);.#
27fe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
27ff0 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 73 71 6c  E_ZLIB.      sql
28000 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28  ite3_sqlar_init(
28010 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  cmd.db, 0, 0);.#
28020 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69  endif.      sqli
28030 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
28040 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65  ion(cmd.db, "she
28050 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53  ll_putsnl", 1, S
28060 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e  QLITE_UTF8, cmd.
28070 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20   shellPutsFunc, 
280a0 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20  0, 0);..    }.  
280b0 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61    if( cmd.zSrcTa
280c0 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
280d0 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52  if( cmd.eCmd!=AR
280e0 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20  _CMD_CREATE.    
280f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61     && sqlite3_ta
28100 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
28110 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71  ata(cmd.db,0,"sq
28120 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c  lar","name",0,0,
28130 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a  0,0,0).      ){.
28140 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
28150 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74  ntf(stderr, "dat
28160 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  abase does not c
28170 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72  ontain an 'sqlar
28180 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20  ' table\n");.   
28190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
281a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
281b0 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
281c0 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
281d0 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65     cmd.zSrcTable
281e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
281f0 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20  tf("sqlar");.   
28200 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
28210 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20  cmd.eCmd ){.    
28220 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
28230 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63  EATE:.        rc
28240 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
28250 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
28260 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
28270 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
28280 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
28290 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45          rc = arE
282a0 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63  xtractCommand(&c
282b0 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
282c0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
282d0 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20  AR_CMD_LIST:.   
282e0 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74       rc = arList
282f0 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20  Command(&cmd);. 
28300 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
28310 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
28320 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61  _HELP:.        a
28330 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f  rUsage(pState->o
28340 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ut);.        bre
28350 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
28360 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
28370 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  rt( cmd.eCmd==AR
28380 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20  _CMD_UPDATE );. 
28390 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
283a0 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
283b0 61 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20  and(&cmd, 1);.  
283c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
283d0 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f   }.  }.end_ar_co
283e0 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64  mmand:.  if( cmd
283f0 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20  .db!=pState->db 
28400 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
28410 6c 6f 73 65 28 63 6d 64 2e 64 62 29 3b 0a 20 20  lose(cmd.db);.  
28420 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
28430 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b  (cmd.zSrcTable);
28440 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
28450 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22  ./* End of the "
28460 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61  .archive" or ".a
28470 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63  r" command logic
28480 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
28490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284d0 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ***/.#endif /* !
284e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
284f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
28500 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
28510 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a  ITE_HAVE_ZLIB) *
28520 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  /.../*.** If an 
28530 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e  input line begin
28540 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20  s with "." then 
28550 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
28560 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73  ine to.** proces
28570 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  s that line..**.
28580 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
28590 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
285a0 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
285b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
285c0 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28  do_meta_command(
285d0 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65  char *zLine, She
285e0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
285f0 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nt h = 1;.  int 
28600 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nArg = 0;.  int 
28610 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d  n, c;.  int rc =
28620 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   0;.  char *azAr
28630 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20  g[50];..#ifndef 
28640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28650 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
28660 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
28670 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69   ){.    expertFi
28680 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20  nish(p, 1, 0);. 
28690 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
286a0 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
286b0 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73  line into tokens
286c0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
286d0 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67  zLine[h] && nArg
286e0 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  <ArraySize(azArg
286f0 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
28700 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
28710 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
28720 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20  if( zLine[h]==0 
28730 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
28740 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20   zLine[h]=='\'' 
28750 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27  || zLine[h]=='"'
28760 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65   ){.      int de
28770 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  lim = zLine[h++]
28780 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  ;.      azArg[nA
28790 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
287a0 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
287b0 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e  zLine[h] && zLin
287c0 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]!=delim ){. 
287d0 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
287e0 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c  [h]=='\\' && del
287f0 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65  im=='"' && zLine
28800 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a  [h+1]!=0 ) h++;.
28810 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20          h++;.   
28820 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
28830 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29  Line[h]==delim )
28840 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
28850 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
28860 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
28870 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
28880 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
28890 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
288a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
288b0 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
288c0 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
288d0 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
288e0 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  & !IsSpace(zLine
288f0 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
28900 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
28910 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d  ] ) zLine[h++] =
28920 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76   0;.      resolv
28930 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
28940 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
28950 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
28960 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
28970 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  line..  */.  if(
28980 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   nArg==0 ) retur
28990 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e  n 0; /* no token
289a0 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
289b0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
289c0 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61  Arg[0]);.  c = a
289d0 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c  zArg[0][0];.  cl
289e0 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a  earTempFile(p);.
289f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28a00 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
28a10 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20  ON.  if( c=='a' 
28a20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28a30 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d  [0], "auth", n)=
28a40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
28a50 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
28a60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28a70 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20  , "Usage: .auth 
28a80 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20  ON|OFF\n");.    
28a90 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
28aa0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
28ab0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
28ac0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
28ad0 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  .    if( boolean
28ae0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
28af0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28b00 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
28b10 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68  p->db, shellAuth
28b20 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
28b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
28b40 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
28b50 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
28b60 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
28b70 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
28b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28b90 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
28ba0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
28bb0 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27  ZLIB).  if( c=='
28bc0 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
28bd0 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65  Arg[0], "archive
28be0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
28bf0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
28c00 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d     rc = arDotCom
28c10 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
28c20 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
28c30 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d  ndif..  if( (c==
28c40 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
28c50 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
28c60 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30   "backup", n)==0
28c70 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20  ).   || (c=='s' 
28c80 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
28c90 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61  mp(azArg[0], "sa
28ca0 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b  ve", n)==0).  ){
28cb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28cc0 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a  *zDestFile = 0;.
28cd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28ce0 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  zDb = 0;.    sql
28cf0 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
28d00 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
28d10 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
28d20 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  t j;.    for(j=1
28d30 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a  ; j<nArg; j++){.
28d40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28d50 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a   *z = azArg[j];.
28d60 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
28d70 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '-' ){.        w
28d80 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  hile( z[0]=='-' 
28d90 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f  ) z++;.        /
28da0 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20  * No options to 
28db0 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20  process at this 
28dc0 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  time */.        
28dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
28de0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28df0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
28e00 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d   %s\n", azArg[j]
28e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
28e20 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
28e30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28e40 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
28e50 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
28e60 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
28e70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
28e80 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db==0 ){.       
28e90 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65   zDb = zDestFile
28ea0 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  ;.        zDestF
28eb0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
28ec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28ed0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28ee0 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e  stderr, "too man
28ef0 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e  y arguments to .
28f00 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20  backup\n");.    
28f10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28f30 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
28f40 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
28f50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69  intf(stderr, "mi
28f60 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61  ssing FILENAME a
28f70 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b  rgument on .back
28f80 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  up\n");.      re
28f90 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
28fa0 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a    if( zDb==0 ) z
28fb0 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
28fc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
28fd0 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  en(zDestFile, &p
28fe0 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
28ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29000 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29010 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
29020 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
29030 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
29040 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
29050 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
29060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
29070 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
29080 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
29090 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
290a0 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
290b0 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
290c0 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
290d0 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
290e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
290f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
29100 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
29110 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
29120 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
29130 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
29140 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
29150 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
29160 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
29170 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
29180 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
29190 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
291a0 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
291b0 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
291c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
291d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
291e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
291f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
29200 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
29210 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
29220 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
29230 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
29240 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
29250 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  se(pDest);.  }el
29260 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
29270 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
29280 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
29290 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ail", n)==0 ){. 
292a0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
292b0 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f  {.      bail_on_
292c0 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  error = booleanV
292d0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
292e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
292f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29300 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69  rr, "Usage: .bai
29310 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  l on|off\n");.  
29320 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29330 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
29340 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
29350 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
29360 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e  [0], "binary", n
29370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
29380 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
29390 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
293a0 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
293b0 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79         setBinary
293c0 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
293d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
293e0 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
293f0 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
29400 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
29410 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29420 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
29430 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66  : .binary on|off
29440 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
29450 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
29460 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
29470 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  && strcmp(azArg[
29480 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20  0],"cd")==0 ){. 
29490 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
294a0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
294b0 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
294c0 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63  (WIN32).      wc
294d0 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
294e0 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
294f0 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31  _unicode(azArg[1
29500 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21  ]);.      rc = !
29510 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  SetCurrentDirect
29520 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73  oryW(z);.      s
29530 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
29540 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
29550 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29   chdir(azArg[1])
29560 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
29570 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
29580 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29590 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61  err, "Cannot cha
295a0 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
295b0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
295c0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
295d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
295e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
295f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29600 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44  r, "Usage: .cd D
29610 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20  IRECTORY\n");.  
29620 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29630 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
29640 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
29650 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
29660 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
29670 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
29680 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
29690 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
296a0 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
296b0 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
296c0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
296d0 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
296e0 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
296f0 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
29700 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
29710 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
29720 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
29730 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73  Arg[0], "changes
29740 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
29750 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
29760 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
29770 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75  lag(p, SHFLG_Cou
29780 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67  ntChanges, azArg
29790 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
297a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
297b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
297c0 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66  : .changes on|of
297d0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
297e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
297f0 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20  se..  /* Cancel 
29800 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69  output redirecti
29810 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72  on, if it is cur
29820 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e  rently set (by .
29830 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54  testcase).  ** T
29840 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e  hen read the con
29850 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74  tent of the test
29860 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c  case-out.txt fil
29870 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67  e and compare ag
29880 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67  ainst.  ** azArg
29890 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61  [1].  If there a
298a0 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  re differences, 
298b0 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  report an error 
298c0 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20  and exit..  */. 
298d0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
298e0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
298f0 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22  zArg[0], "check"
29900 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
29910 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20  har *zRes = 0;. 
29920 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
29930 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
29940 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
29950 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29960 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47  "Usage: .check G
29970 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b  LOB-PATTERN\n");
29980 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
29990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52     }else if( (zR
299a0 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74  es = readFile("t
299b0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
299c0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
299d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
299e0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
299f0 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61  not read 'testca
29a00 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b  se-out.txt'\n");
29a10 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
29a20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73     }else if( tes
29a30 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67  tcase_glob(azArg
29a40 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a  [1],zRes)==0 ){.
29a50 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29a60 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
29a70 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74             "test
29a80 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e  case-%s FAILED\n
29a90 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c   Expected: [%s]\
29aa0 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  n      Got: [%s]
29ab0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29ac0 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61        p->zTestca
29ad0 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52  se, azArg[1], zR
29ae0 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  es);.      rc = 
29af0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
29b00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29b10 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73  stdout, "testcas
29b20 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a  e-%s ok\n", p->z
29b30 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20  Testcase);.     
29b40 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20   p->nCheck++;.  
29b50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
29b60 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65  free(zRes);.  }e
29b70 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
29b80 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
29b90 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20  rg[0], "clone", 
29ba0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
29bb0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
29bc0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20    tryToClone(p, 
29bd0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
29be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
29bf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29c00 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49  Usage: .clone FI
29c10 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
29c20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
29c30 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
29c40 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20  =='d' && n>1 && 
29c50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
29c60 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e  , "databases", n
29c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
29c80 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
29c90 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
29ca0 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
29cb0 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70  p, 0);.    memcp
29cc0 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
29cd0 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
29ce0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
29cf0 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
29d00 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
29d10 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
29d20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29d30 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c  (sizeof(data.col
29d40 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e  Separator),data.
29d50 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20  colSeparator,": 
29d60 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74  ");.    data.cnt
29d70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
29d80 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
29d90 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65  ELECT name, file
29da0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
29db0 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
29dd0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
29de0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
29df0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
29e00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29e10 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
29e20 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
29e30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29e40 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
29e50 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
29e60 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
29e70 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70  =='d' && strncmp
29e80 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e  (azArg[0], "dbin
29e90 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  fo", n)==0 ){.  
29ea0 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69    rc = shell_dbi
29eb0 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e  nfo_command(p, n
29ec0 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d  Arg, azArg);.  }
29ed0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
29ee0 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  d' && strncmp(az
29ef0 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20  Arg[0], "dump", 
29f00 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
29f10 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
29f20 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   0;.    int i;. 
29f30 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77     int savedShow
29f40 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77  Header = p->show
29f50 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c  Header;.    Shel
29f60 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  lClearFlag(p, SH
29f70 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
29f80 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  d|SHFLG_Newlines
29f90 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
29fa0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
29fb0 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
29fc0 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
29fd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
29fe0 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a  z = azArg[i]+1;.
29ff0 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
2a000 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
2a010 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2a020 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69  z,"preserve-rowi
2a030 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ds")==0 ){.#ifde
2a040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2a050 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
2a060 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2a070 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70  stderr, "The --p
2a080 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f  reserve-rowids o
2a090 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d  ption is not com
2a0a0 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20  patible".       
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0c0 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c        " with SQL
2a0d0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2a0e0 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
2a0f0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2a100 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2a110 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23  _command_exit;.#
2a120 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53  else.          S
2a130 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53  hellSetFlag(p, S
2a140 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
2a150 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
2a160 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
2a170 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
2a180 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b  newlines")==0 ){
2a190 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
2a1a0 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
2a1b0 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20  _Newlines);.    
2a1c0 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
2a1d0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61    {.          ra
2a1e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a1f0 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
2a200 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75   \"%s\" on \".du
2a210 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  mp\"\n", azArg[i
2a220 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
2a230 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2a240 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2a250 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
2a260 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2a270 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
2a280 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a290 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64  derr, "Usage: .d
2a2a0 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d  ump ?--preserve-
2a2b0 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20  rowids? ".      
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2d0 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65       "?--newline
2a2e0 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e  s? ?LIKE-PATTERN
2a2f0 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ?\n");.        r
2a300 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
2a310 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2a320 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  _exit;.      }el
2a330 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b  se{.        zLik
2a340 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  e = azArg[i];.  
2a350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2a360 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2a370 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69     /* When playi
2a380 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22  ng back a "dump"
2a390 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69  , the content mi
2a3a0 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e  ght appear in an
2a3b0 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68   order.    ** wh
2a3c0 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64  ich causes immed
2a3d0 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
2a3e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
2a3f0 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20  be violated..   
2a400 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66   ** So disable f
2a410 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74  oreign-key const
2a420 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e  raint enforcemen
2a430 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f  t to prevent pro
2a440 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61  blems. */.    ra
2a450 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2a460 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   "PRAGMA foreign
2a470 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  _keys=OFF;\n");.
2a480 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2a490 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52  ->out, "BEGIN TR
2a4a0 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a  ANSACTION;\n");.
2a4b0 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
2a4c0 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70  chema = 0;.    p
2a4d0 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  ->showHeader = 0
2a4e0 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69  ;.    /* Set wri
2a4f0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20  table_schema=ON 
2a500 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66  since doing so f
2a510 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20  orces SQLite to 
2a520 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a  initialize.    *
2a530 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65  * as much of the
2a540 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61   schema as it ca
2a550 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71  n even if the sq
2a560 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2a570 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72  e is.    ** corr
2a580 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  upt. */.    sqli
2a590 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2a5a0 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b  "SAVEPOINT dump;
2a5b0 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
2a5c0 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20  _schema=ON", 0, 
2a5d0 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45  0, 0);.    p->nE
2a5e0 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rr = 0;.    if( 
2a5f0 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLike==0 ){.    
2a600 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d    run_schema_dum
2a610 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
2a620 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
2a630 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
2a640 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
2a650 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
2a660 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  ql NOT NULL AND 
2a670 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e  type=='table' AN
2a680 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f  D name!='sqlite_
2a690 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
2a6a0 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63   );.      run_sc
2a6b0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
2a6c0 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
2a6d0 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73  CT name, type, s
2a6e0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
2a6f0 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
2a700 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
2a710 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
2a720 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
2a730 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
2a740 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
2a750 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
2a760 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
2a770 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
2a780 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  ql NOT NULL AND 
2a790 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27  type IN ('index'
2a7a0 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77  ,'trigger','view
2a7b0 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ')", 0.      );.
2a7c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a7d0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
2a7e0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2a7f0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2a800 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
2a810 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
2a820 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
2a830 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
2a840 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20  bl_name LIKE %Q 
2a850 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
2a860 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  '".        "  AN
2a870 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c  D sql NOT NULL",
2a880 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72   zLike);.      r
2a890 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
2a8a0 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20  uery(p,zSql);.  
2a8b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a8c0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zSql);.      zS
2a8d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2a8e0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
2a8f0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
2a900 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
2a910 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
2a920 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20  l NOT NULL".    
2a930 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20      "  AND type 
2a940 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69  IN ('index','tri
2a950 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20  gger','view')". 
2a960 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62         "  AND tb
2a970 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c  l_name LIKE %Q",
2a980 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72   zLike);.      r
2a990 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
2a9a0 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b  ery(p, zSql, 0);
2a9b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2a9c0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
2a9d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74  .    if( p->writ
2a9e0 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  ableSchema ){.  
2a9f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2aa00 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77  ->out, "PRAGMA w
2aa10 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
2aa20 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  FF;\n");.      p
2aa30 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
2aa40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2aa50 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2aa60 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
2aa70 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
2aa80 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
2aa90 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2aaa0 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75  >db, "RELEASE du
2aab0 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mp;", 0, 0, 0);.
2aac0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2aad0 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f  ->out, p->nErr ?
2aae0 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64   "ROLLBACK; -- d
2aaf0 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20  ue to errors\n" 
2ab00 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a  : "COMMIT;\n");.
2ab10 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
2ab20 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61  r = savedShowHea
2ab30 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  der;.  }else..  
2ab40 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2ab50 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2ab60 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
2ab70 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2ab80 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
2ab90 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
2aba0 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
2abb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2abc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2abd0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2abe0 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
2abf0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ac00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ac10 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2ac20 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2ac30 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
2ac40 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2ac50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2ac60 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75  cmp(azArg[1],"fu
2ac70 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
2ac80 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
2ac90 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20  AUTOEQP_full;.  
2aca0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2acb0 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  rcmp(azArg[1],"t
2acc0 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20  rigger")==0 ){. 
2acd0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2ace0 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67  P = AUTOEQP_trig
2acf0 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ger;.      }else
2ad00 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
2ad10 6f 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65  oEQP = (u8)boole
2ad20 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2ad30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ad40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2ad50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ad60 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c  Usage: .eqp off|
2ad70 6f 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c  on|trigger|full\
2ad80 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ad90 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2ada0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
2adb0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2adc0 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d  0], "exit", n)==
2add0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2ade0 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e  g>1 && (rc = (in
2adf0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
2ae00 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65  zArg[1]))!=0 ) e
2ae10 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20  xit(rc);.    rc 
2ae20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  = 2;.  }else..  
2ae30 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e  /* The ".explain
2ae40 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74  " command is aut
2ae50 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20  omatic now.  It 
2ae60 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74  is largely point
2ae70 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72  less.  It.  ** r
2ae80 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66  etained purely f
2ae90 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
2aea0 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20  patibility */.  
2aeb0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2aec0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2aed0 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30  "explain", n)==0
2aee0 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20   ){.    int val 
2aef0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 1;.    if( nAr
2af00 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g>=2 ){.      if
2af10 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2af20 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a  ],"auto")==0 ){.
2af30 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39          val = 99
2af40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2af50 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f         val =  bo
2af60 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2af70 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [1]);.      }.  
2af80 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d    }.    if( val=
2af90 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d  =1 && p->mode!=M
2afa0 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
2afb0 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f       p->normalMo
2afc0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
2afd0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2afe0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
2aff0 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
2b000 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
2b010 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20  if( val==0 ){.  
2b020 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
2b030 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20  =MODE_Explain ) 
2b040 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72  p->mode = p->nor
2b050 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70  malMode;.      p
2b060 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
2b070 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2b080 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20   val==99 ){.    
2b090 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
2b0a0 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d  ODE_Explain ) p-
2b0b0 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61  >mode = p->norma
2b0c0 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  lMode;.      p->
2b0d0 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b  autoExplain = 1;
2b0e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2b0f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b100 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b110 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
2b120 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2b130 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d  ], "expert", n)=
2b140 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
2b150 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70  b(p, 0);.    exp
2b160 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c  ertDotCommand(p,
2b170 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
2b180 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2b190 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73   if( c=='f' && s
2b1a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b1b0 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e   "fullschema", n
2b1c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
2b1d0 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
2b1e0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
2b1f0 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74   0;.    int doSt
2b200 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  ats = 0;.    mem
2b210 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
2b220 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
2b230 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
2b240 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63   = 0;.    data.c
2b250 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2b260 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20   = MODE_Semi;.  
2b270 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26    if( nArg==2 &&
2b280 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41   optionMatch(azA
2b290 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29  rg[1], "indent")
2b2a0 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63   ){.      data.c
2b2b0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2b2c0 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
2b2d0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a        nArg = 1;.
2b2e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
2b2f0 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg!=1 ){.      r
2b300 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b310 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73  , "Usage: .fulls
2b320 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
2b330 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2b340 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2b350 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2b360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
2b370 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
2b380 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2b390 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22  (p->db,.       "
2b3a0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22  SELECT sql FROM"
2b3b0 0a 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45  .       "  (SELE
2b3c0 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65  CT sql sql, type
2b3d0 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20   type, tbl_name 
2b3e0 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e  tbl_name, name n
2b3f0 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20  ame, rowid x".  
2b400 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20       "     FROM 
2b410 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
2b420 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
2b430 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
2b440 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
2b450 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
2b460 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
2b470 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57  ter) ".       "W
2b480 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61  HERE type!='meta
2b490 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c  ' AND sql NOTNUL
2b4a0 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c  L AND name NOT L
2b4b0 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22  IKE 'sqlite_%' "
2b4c0 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  .       "ORDER B
2b4d0 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20  Y rowid",.      
2b4e0 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
2b4f0 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29  , &zErrMsg.    )
2b500 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2b510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b520 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b530 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  Stmt;.      rc =
2b540 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2b550 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
2b560 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
2b570 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  T rowid FROM sql
2b580 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
2b590 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
2b5a0 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71  RE name GLOB 'sq
2b5b0 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22  lite_stat[134]'"
2b5c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b5d0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2b5e0 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d  .      doStats =
2b5f0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2b600 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
2b610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2b620 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2b630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
2b640 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20  oStats==0 ){.   
2b650 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2b660 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41  >out, "/* No STA
2b670 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  T tables availab
2b680 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d  le */\n");.    }
2b690 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2b6a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2b6b0 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
2b6c0 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
2b6d0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2b6e0 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41  ->db, "SELECT 'A
2b6f0 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2b700 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  ster'",.        
2b710 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
2b720 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2b730 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
2b740 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
2b750 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
2b760 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  t;.      data.zD
2b770 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2b780 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20  te_stat1";.     
2b790 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
2b7a0 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
2b7b0 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  M sqlite_stat1",
2b7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b7d0 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
2b7e0 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67  , &data,&zErrMsg
2b7f0 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
2b800 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2b810 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20  te_stat3";.     
2b820 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
2b830 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
2b840 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c  M sqlite_stat3",
2b850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b860 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
2b870 2c 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67  , &data,&zErrMsg
2b880 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
2b890 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2b8a0 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20  te_stat4";.     
2b8b0 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64   shell_exec(p->d
2b8c0 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  b, "SELECT * FRO
2b8d0 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c  M sqlite_stat4",
2b8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b8f0 20 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b    shell_callback
2b900 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2b910 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  g);.      raw_pr
2b920 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e  intf(p->out, "AN
2b930 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
2b940 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  ter;\n");.    }.
2b950 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2b960 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
2b970 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64  (azArg[0], "head
2b980 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ers", n)==0 ){. 
2b990 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2b9a0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48  {.      p->showH
2b9b0 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  eader = booleanV
2b9c0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2b9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b9e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2b9f0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61  rr, "Usage: .hea
2ba00 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  ders on|off\n");
2ba10 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ba20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ba30 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
2ba40 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2ba50 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  "help", n)==0 ){
2ba60 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2ba70 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
2ba80 48 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Help);.  }else..
2ba90 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
2baa0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2bab0 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
2bac0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
2bad0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
2bae0 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
2baf0 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61  ata into this ta
2bb00 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
2bb10 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
2bb20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2bb30 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20  f file to extra 
2bb40 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  content from */.
2bb50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2bb60 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
2bb70 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
2bb80 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bba0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2bbb0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
2bbc0 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
2bbd0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
2bbe0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2bbf0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
2bc00 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
2bc10 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc30 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2bc40 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f  /.    int needCo
2bc50 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
2bc60 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d    /* True to COM
2bc70 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
2bc80 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  at end */.    in
2bc90 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
2bca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2bcb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2bcc0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
2bcd0 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
2bce0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
2bcf0 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
2bd00 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
2bd10 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20  ImportCtx sCtx; 
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2bd30 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  eader context */
2bd40 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49  .    char *(SQLI
2bd50 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29  TE_CDECL *xRead)
2bd60 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a  (ImportCtx*); /*
2bd70 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e   Func to read on
2bd80 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69  e value */.    i
2bd90 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  nt (SQLITE_CDECL
2bda0 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a   *xCloser)(FILE*
2bdb0 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20  );      /* Func 
2bdc0 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f  to close file */
2bdd0 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ..    if( nArg!=
2bde0 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
2bdf0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2be00 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49  sage: .import FI
2be10 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20  LE TABLE\n");.  
2be20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2be30 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2be40 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
2be50 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62  Arg[1];.    zTab
2be60 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  le = azArg[2];. 
2be70 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
2be80 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
2be90 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
2bea0 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70  f(sCtx));.    op
2beb0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2bec0 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
2bed0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2bee0 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
2bef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
2bf00 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
2bf30 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
2bf40 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
2bf50 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2bf60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2bf70 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
2bf80 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2bf90 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2bfa0 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
2bfb0 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ter column separ
2bfc0 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
2bfd0 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2bfe0 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
2bff0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2c000 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2c010 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
2c020 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
2c030 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
2c040 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
2c050 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c060 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  r, "Error: non-n
2c070 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ull row separato
2c080 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
2c090 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2c0a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2c0b0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32  .    if( nSep==2
2c0c0 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44   && p->mode==MOD
2c0d0 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28  E_Csv && strcmp(
2c0e0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2c0f0 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b   SEP_CrLf)==0 ){
2c100 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69  .      /* When i
2c110 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e  mporting CSV (on
2c120 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20  ly), if the row 
2c130 73 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74  separator is set
2c140 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2c150 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20   default output 
2c160 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63  row separator, c
2c170 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20  hange it to the 
2c180 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20  default input.  
2c190 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72      ** row separ
2c1a0 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69  ator.  This avoi
2c1b0 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69  ds having to mai
2c1c0 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ntain different 
2c1d0 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  input.      ** a
2c1e0 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  nd output row se
2c1f0 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20  parators. */.   
2c200 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2c210 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
2c220 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
2c230 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2c240 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53  P_Row);.      nS
2c250 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2c260 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
2c270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2c280 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
2c290 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c2a0 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
2c2b0 68 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70  haracter row sep
2c2c0 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
2c2d0 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
2c2e0 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
2c2f0 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
2c300 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2c310 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c   }.    sCtx.zFil
2c320 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73  e = zFile;.    s
2c330 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20  Ctx.nLine = 1;. 
2c340 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c     if( sCtx.zFil
2c350 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
2c360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c370 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
2c380 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2c390 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
2c3a0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
2c3b0 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
2c3c0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23       return 1;.#
2c3d0 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e  else.      sCtx.
2c3e0 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e  in = popen(sCtx.
2c3f0 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20  zFile+1, "r");. 
2c400 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20       sCtx.zFile 
2c410 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20  = "<pipe>";.    
2c420 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f    xCloser = pclo
2c430 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  se;.#endif.    }
2c440 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78  else{.      sCtx
2c450 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78  .in = fopen(sCtx
2c460 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  .zFile, "rb");. 
2c470 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66       xCloser = f
2c480 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  close;.    }.   
2c490 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2c4a0 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20  DE_Ascii ){.    
2c4b0 20 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f    xRead = ascii_
2c4c0 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a  read_one_field;.
2c4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c4e0 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61   xRead = csv_rea
2c4f0 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
2c500 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e   }.    if( sCtx.
2c510 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  in==0 ){.      u
2c520 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2c530 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2c540 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2c550 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
2c560 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2c570 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70      sCtx.cColSep
2c580 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   = p->colSeparat
2c590 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e  or[0];.    sCtx.
2c5a0 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77  cRowSep = p->row
2c5b0 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
2c5c0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2c5d0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
2c5e0 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61   * FROM %s", zTa
2c5f0 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
2c600 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
2c610 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2c620 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
2c630 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
2c640 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2c650 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
2c660 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
2c670 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Byte = strlen30(
2c680 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
2c690 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2c6a0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
2c6b0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2c6c0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
2c6d0 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29  d_char(&sCtx, 0)
2c6e0 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72  ;    /* To ensur
2c6f0 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f  e sCtx.z is allo
2c700 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
2c710 20 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73   rc && sqlite3_s
2c720 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20  trglob("no such 
2c730 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74  table: *", sqlit
2c740 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2c750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
2c760 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
2c770 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
2c780 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c  REATE TABLE %s",
2c790 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
2c7a0 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
2c7b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52  .      while( xR
2c7c0 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20  ead(&sCtx) ){.  
2c7d0 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20        zCreate = 
2c7e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c7f0 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20  "%z%c\n  \"%w\" 
2c800 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20  TEXT", zCreate, 
2c810 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20  cSep, sCtx.z);. 
2c820 20 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c         cSep = ',
2c830 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ';.        if( s
2c840 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
2c850 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b  cColSep ) break;
2c860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c870 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a  f( cSep=='(' ){.
2c880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c890 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
2c8a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c8b0 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
2c8c0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2c8d0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75  x.in);.        u
2c8e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2c8f0 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c  r,"%s: empty fil
2c900 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  e\n", sCtx.zFile
2c910 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2c920 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2c930 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c     zCreate = sql
2c940 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
2c950 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a  \n)", zCreate);.
2c960 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c970 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
2c980 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
2c990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c9a0 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
2c9b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2c9c0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2c9d0 74 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41  tf(stderr, "CREA
2c9e0 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29  TE TABLE %s(...)
2c9f0 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
2ca00 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20  zTable,.        
2ca10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ca20 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2ca30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ca40 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
2ca50 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2ca60 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  tx.in);.        
2ca70 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2ca80 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2ca90 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2caa0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2cab0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2cac0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2cad0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
2cae0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
2caf0 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
2cb00 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2cb10 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2cb20 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2cb30 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2cb40 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2cb50 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
2cb60 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2cb70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2cb80 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  .    nCol = sqli
2cb90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
2cba0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
2cbb0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2cbc0 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
2cbd0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  = 0;.    if( nCo
2cbe0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
2cbf0 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20   /* no columns, 
2cc00 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  no error */.    
2cc10 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2cc20 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32  alloc64( nByte*2
2cc30 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
2cc40 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
2cc50 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
2cc60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2cc70 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
2cc80 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78  ory\n");.      x
2cc90 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2cca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2ccb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2ccc0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
2ccd0 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+20, zSql, "INS
2cce0 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20  ERT INTO \"%w\" 
2ccf0 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c  VALUES(?", zTabl
2cd00 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
2cd10 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
2cd20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
2cd30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
2cd40 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
2cd50 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2cd60 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
2cd70 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
2cd80 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
2cd90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2cda0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2cdb0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2cdc0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2cdd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2cde0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2cdf0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2ce00 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2ce10 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2ce20 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2ce30 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
2ce40 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
2ce50 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
2ce60 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2ce70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ce80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65  1;.    }.    nee
2ce90 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65  dCommit = sqlite
2cea0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
2ceb0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  (p->db);.    if(
2cec0 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
2ced0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2cee0 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
2cef0 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20   0);.    do{.   
2cf00 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
2cf10 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20   = sCtx.nLine;. 
2cf20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2cf30 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2cf40 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52      char *z = xR
2cf50 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20  ead(&sCtx);.    
2cf60 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
2cf70 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
2cf80 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72  nd-of-file befor
2cf90 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f  e finding any co
2cfa0 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a  lumns?.        *
2cfb0 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e  * If so, stop in
2cfc0 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
2cfd0 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e  lling the remain
2cfe0 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
2cff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d000 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30  if( z==0 && i==0
2d010 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2d020 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
2d030 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
2d040 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d  -of-file OR end-
2d050 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66  of-line before f
2d060 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20  inding any.     
2d070 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
2d080 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66   ASCII mode?  If
2d090 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61   so, stop instea
2d0a0 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e  d of NULL fillin
2d0b0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
2d0c0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
2d0d0 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
2d0e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f         if( p->mo
2d0f0 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26  de==MODE_Ascii &
2d100 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  & (z==0 || z[0]=
2d110 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72  =0) && i==0 ) br
2d120 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
2d130 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
2d140 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31  Stmt, i+1, z, -1
2d150 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
2d160 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NT);.        if(
2d170 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74   i<nCol-1 && sCt
2d180 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
2d190 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
2d1a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2d1b0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
2d1c0 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2d1d0 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
2d1e0 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
2d200 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20  illing the rest 
2d210 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20  with NULL\n",.  
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d230 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
2d240 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
2d250 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
2d260 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
2d270 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c         while( i<
2d280 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33  =nCol ){ sqlite3
2d290 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
2d2a0 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20  , i); i++; }.   
2d2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d2c0 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
2d2d0 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm==sCtx.cColSe
2d2e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  p ){.        do{
2d2f0 0a 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64  .          xRead
2d300 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
2d310 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
2d320 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
2d330 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
2d340 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38   );.        utf8
2d350 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d360 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
2d370 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
2d380 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3a0 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e       "extras ign
2d3b0 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ored\n",.       
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3d0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
2d3e0 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29  rtLine, nCol, i)
2d3f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d400 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20  if( i>=nCol ){. 
2d410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2d420 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
2d430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d440 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
2d450 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d470 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d480 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
2d490 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a  : INSERT failed:
2d4a0 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69   %s\n", sCtx.zFi
2d4b0 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
2d4c0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c            startL
2d4d0 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ine, sqlite3_err
2d4e0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2d4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d500 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e     }while( sCtx.
2d510 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20  cTerm!=EOF );.. 
2d520 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2d530 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
2d540 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
2d550 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2d560 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2d570 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29  if( needCommit )
2d580 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2d590 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  >db, "COMMIT", 0
2d5a0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
2d5b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2d5c0 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66  _UNTESTABLE.  if
2d5d0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
2d5e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
2d5f0 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20  mposter", n)==0 
2d600 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
2d610 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  l;.    char *zCo
2d620 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73  llist = 0;.    s
2d630 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2d640 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d  mt;.    int tnum
2d650 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
2d660 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
2d670 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2d680 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d690 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20  sage: .imposter 
2d6a0 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e  INDEX IMPOSTER\n
2d6b0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2d6c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2d6d0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2d6e0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2d6f0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71  b(p, 0);.    zSq
2d700 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2d710 6e 74 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74  ntf("SELECT root
2d720 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
2d730 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
2d760 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
2d770 69 6e 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31  index'", azArg[1
2d780 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
2d790 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2d7a0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2d7b0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
2d7c0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2d7d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2d7e0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2d7f0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
2d800 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f   tnum = sqlite3_
2d810 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2d820 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2d830 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2d840 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
2d850 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   tnum==0 ){.    
2d860 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2d870 64 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69  derr, "no such i
2d880 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  ndex: \"%s\"\n",
2d890 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2d8a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2d8b0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2d8c0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2d8d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2d8e0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
2d8f0 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71   index_xinfo='%q
2d900 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  '", azArg[1]);. 
2d910 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2d920 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2d930 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2d940 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
2d950 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2d960 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77      i = 0;.    w
2d970 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
2d980 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2d990 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63  E_ROW ){.      c
2d9a0 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a  har zLabel[20];.
2d9b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2d9c0 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20   *zCol = (const 
2d9d0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2d9e0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2d9f0 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  2);.      i++;. 
2da00 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30       if( zCol==0
2da10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2da20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2da30 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20  nt(pStmt,1)==-1 
2da40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
2da50 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20  l = "_ROWID_";. 
2da60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2da80 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2da90 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22  zLabel),zLabel,"
2daa0 65 78 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20  expr%d",i);.    
2dab0 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61        zCol = zLa
2dac0 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  bel;.        }. 
2dad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2dae0 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a   zCollist==0 ){.
2daf0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
2db00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2db10 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f  tf("\"%w\"", zCo
2db20 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
2db30 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73  .        zCollis
2db40 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
2db50 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c  ntf("%z,\"%w\"",
2db60 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29   zCollist, zCol)
2db70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2db80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2db90 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2dba0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2dbb0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2dbc0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
2dbd0 20 5c 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41   \"%w\"(%s,PRIMA
2dbe0 52 59 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f  RY KEY(%s))WITHO
2dbf0 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20  UT ROWID",.     
2dc00 20 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a       azArg[2], z
2dc10 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73  Collist, zCollis
2dc20 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2dc30 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
2dc40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2dc50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2dc60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2dc70 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
2dc80 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
2dc90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2dca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dcb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2dcc0 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  c(p->db, zSql, 0
2dcd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2dce0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2dcf0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2dd00 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
2dd10 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  >db, "main", 0, 
2dd20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2dd30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2dd40 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2dd50 22 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20  "Error in [%s]: 
2dd60 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c  %s\n", zSql, sql
2dd70 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2dd80 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  b));.      }else
2dd90 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2dda0 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
2ddb0 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  s;\n", zSql);.  
2ddc0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ddd0 28 73 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20  (stdout,.       
2dde0 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72      "WARNING: wr
2ddf0 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f  iting to an impo
2de00 73 74 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20  ster table will 
2de10 63 6f 72 72 75 70 74 20 74 68 65 20 69 6e 64 65  corrupt the inde
2de20 78 21 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b  x!\n".        );
2de30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2de40 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2de50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
2de60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2de70 50 4f 53 54 45 52 20 72 65 74 75 72 6e 73 20 25  POSTER returns %
2de80 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
2de90 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2dea0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2deb0 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  zSql);.  }else.#
2dec0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
2ded0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  d(SQLITE_OMIT_TE
2dee0 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a  ST_CONTROL) */..
2def0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2df00 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69  ABLE_IOTRACE.  i
2df10 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
2df20 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2df30 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20  iotrace", n)==0 
2df40 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50  ){.    SQLITE_AP
2df50 49 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53  I extern void (S
2df60 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c  QLITE_CDECL *sql
2df70 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
2df80 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a  st char*, ...);.
2df90 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20      if( iotrace 
2dfa0 26 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f  && iotrace!=stdo
2dfb0 75 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72  ut ) fclose(iotr
2dfc0 61 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63  ace);.    iotrac
2dfd0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  e = 0;.    if( n
2dfe0 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73  Arg<2 ){.      s
2dff0 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
2e000 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2e010 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2e020 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20  , "-")==0 ){.   
2e030 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
2e040 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74  e = iotracePrint
2e050 66 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  f;.      iotrace
2e060 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d   = stdout;.    }
2e070 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72  else{.      iotr
2e080 61 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  ace = fopen(azAr
2e090 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20  g[1], "w");.    
2e0a0 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30    if( iotrace==0
2e0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2e0c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e0d0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
2e0e0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
2e0f0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2e100 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
2e110 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2e120 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
2e130 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2e140 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
2e150 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
2e160 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2e170 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2e180 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26  =='l' && n>=5 &&
2e190 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2e1a0 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d  ], "limits", n)=
2e1b0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
2e1c0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
2e1d0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2e1e0 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20  r *zLimitName;  
2e1f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69   /* Name of a li
2e200 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e  mit */.       in
2e210 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20  t limitCode;    
2e220 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
2e230 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74  er code for that
2e240 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20   limit */.    } 
2e250 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20  aLimit[] = {.   
2e260 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20     { "length",  
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2e280 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
2e290 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
2e2a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2e2b0 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20  "sql_length",   
2e2c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2e2d0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2f0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75  },.      { "colu
2e300 6d 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  mn",            
2e310 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2e320 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
2e330 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2e340 20 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74      { "expr_dept
2e350 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  h",            S
2e360 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2e370 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
2e380 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2e390 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63   "compound_selec
2e3a0 74 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  t",       SQLITE
2e3b0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
2e3c0 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
2e3d0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62   },.      { "vdb
2e3e0 65 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20  e_op",          
2e3f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2e400 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20  T_VDBE_OP       
2e410 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2e420 20 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e       { "function
2e430 5f 61 72 67 22 2c 20 20 20 20 20 20 20 20 20 20  _arg",          
2e440 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
2e450 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
2e460 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2e470 7b 20 22 61 74 74 61 63 68 65 64 22 2c 20 20 20  { "attached",   
2e480 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2e490 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4b0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69    },.      { "li
2e4c0 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74  ke_pattern_lengt
2e4d0 68 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  h",   SQLITE_LIM
2e4e0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
2e4f0 4c 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a  LENGTH       },.
2e500 20 20 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c        { "variabl
2e510 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20  e_number",      
2e520 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41   SQLITE_LIMIT_VA
2e530 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20  RIABLE_NUMBER   
2e540 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2e550 20 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70 74   { "trigger_dept
2e560 68 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  h",         SQLI
2e570 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
2e580 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
2e590 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77     },.      { "w
2e5a0 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20  orker_threads", 
2e5b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2e5c0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
2e5d0 44 53 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  DS            },
2e5e0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
2e5f0 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f  i, n2;.    open_
2e600 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
2e610 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
2e620 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
2e630 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
2e640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
2e650 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e  rintf("%20s %d\n
2e660 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69  ", aLimit[i].zLi
2e670 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  mitName,.       
2e680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e690 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69  limit(p->db, aLi
2e6a0 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65  mit[i].limitCode
2e6b0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a  , -1));.      }.
2e6c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
2e6d0 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61  rg>3 ){.      ra
2e6e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2e6f0 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20   "Usage: .limit 
2e700 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f  NAME ?NEW-VALUE?
2e710 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2e720 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2e730 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2e740 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e750 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20     int iLimit = 
2e760 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73  -1;.      n2 = s
2e770 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d  trlen30(azArg[1]
2e780 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
2e790 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c  ; i<ArraySize(aL
2e7a0 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  imit); i++){.   
2e7b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e7c0 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74  _strnicmp(aLimit
2e7d0 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20  [i].zLimitName, 
2e7e0 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30  azArg[1], n2)==0
2e7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2e800 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ( iLimit<0 ){.  
2e810 20 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74            iLimit
2e820 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2e830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e840 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e850 74 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75  tderr, "ambiguou
2e860 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c  s limit: \"%s\"\
2e870 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
2e880 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e890 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  1;.            g
2e8a0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2e8b0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2e8c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e8d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2e8e0 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
2e8f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e900 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
2e910 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22  limit: \"%s\"\n"
2e920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e930 20 20 20 20 20 20 20 20 20 22 65 6e 74 65 72 20           "enter 
2e940 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68  \".limits\" with
2e950 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
2e960 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20  r a list.\n",.  
2e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e980 20 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29         azArg[1])
2e990 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2e9a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
2e9b0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2e9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e9d0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
2e9e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
2e9f0 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
2ea00 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74  it[iLimit].limit
2ea10 43 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Code,.          
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
2ea30 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
2ea40 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[2]));.      
2ea50 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
2ea60 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d  %20s %d\n", aLim
2ea70 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69  it[iLimit].zLimi
2ea80 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  tName,.         
2ea90 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
2eaa0 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b  t(p->db, aLimit[
2eab0 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64  iLimit].limitCod
2eac0 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20  e, -1));.    }. 
2ead0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2eae0 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73  ='l' && n>2 && s
2eaf0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2eb00 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29   "lint", n)==0 )
2eb10 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
2eb20 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74   0);.    lintDot
2eb30 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67  Command(p, azArg
2eb40 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
2eb50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2eb60 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2eb70 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c  SION.  if( c=='l
2eb80 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2eb90 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e  rg[0], "load", n
2eba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2ebb0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a  t char *zFile, *
2ebc0 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20  zProc;.    char 
2ebd0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2ebe0 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
2ebf0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ec00 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2ec10 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54   .load FILE ?ENT
2ec20 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20  RYPOINT?\n");.  
2ec30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2ec40 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2ec50 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2ec60 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
2ec70 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20  g[1];.    zProc 
2ec80 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  = nArg>=3 ? azAr
2ec90 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70  g[2] : 0;.    op
2eca0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2ecb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
2ecc0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
2ecd0 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63  db, zFile, zProc
2ece0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2ecf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ed00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
2ed10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ed20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
2ed30 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
2ed40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2ed50 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
2ed60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2ed70 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
2ed80 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d  c=='l' && strncm
2ed90 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67  p(azArg[0], "log
2eda0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2edb0 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20  if( nArg!=2 ){. 
2edc0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2edd0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2ede0 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  .log FILENAME\n"
2edf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2ee00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ee10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2ee20 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
2ee30 20 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c        output_fil
2ee40 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29  e_close(p->pLog)
2ee50 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20  ;.      p->pLog 
2ee60 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
2ee70 65 6e 28 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20  en(zFile, 0);.  
2ee80 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2ee90 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72  f( c=='m' && str
2eea0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2eeb0 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mode", n)==0 ){.
2eec0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2eed0 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20  zMode = nArg>=2 
2eee0 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b  ? azArg[1] : "";
2eef0 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74  .    int n2 = st
2ef00 72 6c 65 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a 20  rlen30(zMode);. 
2ef10 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64     int c2 = zMod
2ef20 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32  e[0];.    if( c2
2ef30 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26  =='l' && n2>2 &&
2ef40 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2ef50 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30  ],"lines",n2)==0
2ef60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2ef70 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20  e = MODE_Line;. 
2ef80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2ef90 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2efa0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2efb0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2efc0 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
2efd0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20  lse if( c2=='c' 
2efe0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2eff0 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32  [1],"columns",n2
2f000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2f010 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c  >mode = MODE_Col
2f020 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  umn;.      sqlit
2f030 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2f040 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2f050 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2f060 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
2f070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
2f080 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26  =='l' && n2>2 &&
2f090 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2f0a0 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20  ],"list",n2)==0 
2f0b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2f0c0 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
2f0d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f0e0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
2f0f0 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
2f100 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
2f110 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  EP_Column);.    
2f120 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2f130 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2f140 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2f150 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2f160 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
2f170 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26 20   if( c2=='h' && 
2f180 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2f190 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29  ,"html",n2)==0 )
2f1a0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2f1b0 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20  = MODE_Html;.   
2f1c0 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2f1d0 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
2f1e0 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29  Arg[1],"tcl",n2)
2f1f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2f200 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b  mode = MODE_Tcl;
2f210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2f220 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2f230 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
2f240 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
2f250 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a 20 20  , SEP_Space);.  
2f260 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f270 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
2f280 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
2f290 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2f2a0 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
2f2b0 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26  se if( c2=='c' &
2f2c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2f2d0 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20  1],"csv",n2)==0 
2f2e0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2f2f0 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
2f300 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2f310 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2f320 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2f330 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
2f340 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20  P_Comma);.      
2f350 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f360 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2f370 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2f380 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
2f390 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rLf);.    }else 
2f3a0 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73  if( c2=='t' && s
2f3b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
2f3c0 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  "tabs",n2)==0 ){
2f3d0 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2f3e0 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
2f3f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2f400 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
2f410 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
2f420 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
2f430 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Tab);.    }else
2f440 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26 26 20   if( c2=='i' && 
2f450 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2f460 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30  ,"insert",n2)==0
2f470 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2f480 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
2f490 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65  .      set_table
2f4a0 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33  _name(p, nArg>=3
2f4b0 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74   ? azArg[2] : "t
2f4c0 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73  able");.    }els
2f4d0 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20 26 26  e if( c2=='q' &&
2f4e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2f4f0 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30  ],"quote",n2)==0
2f500 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2f510 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a  e = MODE_Quote;.
2f520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
2f530 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70  =='a' && strncmp
2f540 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69 69  (azArg[1],"ascii
2f550 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2f560 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2f570 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73 71  _Ascii;.      sq
2f580 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2f590 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
2f5a0 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
2f5b0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69  parator, SEP_Uni
2f5c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2f5d0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f5e0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2f5f0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2f600 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64 29  tor, SEP_Record)
2f610 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f620 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nArg==1 ){.     
2f630 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2f640 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f 75 74  ut, "current out
2f650 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c  put mode: %s\n",
2f660 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f   modeDescr[p->mo
2f670 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  de]);.    }else{
2f680 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f690 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f6a0 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  : mode should be
2f6b0 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
2f6c0 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c 75 6d      "ascii colum
2f6d0 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72  n csv html inser
2f6e0 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75 6f 74  t line list quot
2f6f0 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a  e tabs tcl\n");.
2f700 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2f710 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65    }.    p->cMode
2f720 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65   = p->mode;.  }e
2f730 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e  lse..  if( c=='n
2f740 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2f750 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75  rg[0], "nullvalu
2f760 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2f770 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2f780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2f790 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2f7a0 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e  >nullValue), p->
2f7b0 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20  nullValue,.     
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7d0 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41    "%.*s", (int)A
2f7e0 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c  rraySize(p->null
2f7f0 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b  Value)-1, azArg[
2f800 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2f810 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f820 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f830 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49   .nullvalue STRI
2f840 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  NG\n");.      rc
2f850 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2f860 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f  lse..  if( c=='o
2f870 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2f880 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e  rg[0], "open", n
2f890 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a  )==0 && n>=2 ){.
2f8a0 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69      char *zNewFi
2f8b0 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65  lename;  /* Name
2f8c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f8d0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2f8e0 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d  .    int iName =
2f8f0 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   1;       /* Ind
2f900 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66  ex in azArg[] of
2f910 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f   the filename */
2f920 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c 61 67  .    int newFlag
2f930 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
2f940 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69 6c 65  e to delete file
2f950 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20   before opening 
2f960 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  */.    /* Close 
2f970 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
2f980 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 65 73  abase */.    ses
2f990 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70  sion_close_all(p
2f9a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
2f9b0 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20  lose(p->db);.   
2f9c0 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20   p->db = 0;.    
2f9d0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
2f9e0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
2f9f0 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43  free(p->zFreeOnC
2fa00 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46  lose);.    p->zF
2fa10 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a  reeOnClose = 0;.
2fa20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
2fa30 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
2fa40 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63  PEC;.    /* Chec
2fa50 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69  k for command-li
2fa60 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ne arguments */.
2fa70 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b      for(iName=1;
2fa80 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61   iName<nArg && a
2fa90 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d  zArg[iName][0]==
2faa0 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20  '-'; iName++){. 
2fab0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2fac0 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65  *z = azArg[iName
2fad0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74  ];.      if( opt
2fae0 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22  ionMatch(z,"new"
2faf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  ) ){.        new
2fb00 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65 66  Flag = 1;.#ifdef
2fb10 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 49 50   SQLITE_HAVE_ZIP
2fb20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2fb30 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
2fb40 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20 20 20  "zip") ){.      
2fb50 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
2fb60 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
2fb70 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  LE;.#endif.     
2fb80 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f   }else if( optio
2fb90 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70 65 6e  nMatch(z, "appen
2fba0 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  d") ){.        p
2fbb0 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
2fbc0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2fbd0 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  S;.      }else i
2fbe0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
2fbf0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2fc00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
2fc10 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
2fc20 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
2fc30 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2fc40 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2fc50 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
2fc60 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
2fc70 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73 70  a filename is sp
2fc80 65 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f 20  ecified, try to 
2fc90 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a 2f  open it first */
2fca0 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  .    zNewFilenam
2fcb0 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f  e = nArg>iName ?
2fcc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2fcd0 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61  ("%s", azArg[iNa
2fce0 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  me]) : 0;.    if
2fcf0 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29  ( zNewFilename )
2fd00 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 46  {.      if( newF
2fd10 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65 74  lag ) shellDelet
2fd20 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61  eFile(zNewFilena
2fd30 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44  me);.      p->zD
2fd40 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77  bFilename = zNew
2fd50 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2fd60 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20  open_db(p, 1);. 
2fd70 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d       if( p->db==
2fd80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
2fd90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2fda0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
2fdb0 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e  open '%s'\n", zN
2fdc0 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ewFilename);.   
2fdd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2fde0 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  e(zNewFilename);
2fdf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2fe00 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e        p->zFreeOn
2fe10 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65  Close = zNewFile
2fe20 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  name;.      }.  
2fe30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
2fe40 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b==0 ){.      /*
2fe50 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20   As a fall-back 
2fe60 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74 61  open a TEMP data
2fe70 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d  base */.      p-
2fe80 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30  >zDbFilename = 0
2fe90 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28  ;.      open_db(
2fea0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  p, 0);.    }.  }
2feb0 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d  else..  if( (c==
2fec0 27 6f 27 0a 20 20 20 20 20 20 20 20 26 26 20 28  'o'.        && (
2fed0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2fee0 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
2fef0 30 7c 7c 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  0||strncmp(azArg
2ff00 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
2ff10 3d 30 29 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  =0)).   || (c=='
2ff20 65 27 20 26 26 20 6e 3d 3d 35 20 26 26 20 73 74  e' && n==5 && st
2ff30 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 65  rcmp(azArg[0],"e
2ff40 78 63 65 6c 22 29 3d 3d 30 29 0a 20 20 29 7b 0a  xcel")==0).  ){.
2ff50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ff60 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20  zFile = nArg>=2 
2ff70 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74  ? azArg[1] : "st
2ff80 64 6f 75 74 22 3b 0a 20 20 20 20 69 6e 74 20 62  dout";.    int b
2ff90 54 78 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  TxtMode = 0;.   
2ffa0 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 5b 30 5d   if( azArg[0][0]
2ffb0 3d 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 2f  =='e' ){.      /
2ffc0 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * Transform the 
2ffd0 22 2e 65 78 63 65 6c 22 20 63 6f 6d 6d 61 6e 64  ".excel" command
2ffe0 20 69 6e 74 6f 20 22 2e 6f 6e 63 65 20 2d 78 22   into ".once -x"
2fff0 20 2a 2f 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   */.      nArg =
30000 20 32 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b   2;.      azArg[
30010 30 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a 20 20 20  0] = "once";.   
30020 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
30030 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a 20 20 20 20  [1] = "-x";.    
30040 20 20 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20    n = 4;.    }. 
30050 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b     if( nArg>2 ){
30060 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
30070 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30080 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46 49  e: .%s [-e|-x|FI
30090 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  LE]\n", azArg[0]
300a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
300b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
300c0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
300d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31     }.    if( n>1
300e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
300f0 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29  g[0], "once", n)
30100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
30110 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
30120 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
30130 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f  derr, "Usage: .o
30140 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29  nce (-e|-x|FILE)
30150 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
30160 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
30170 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
30180 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
30190 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20      p->outCount 
301a0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 2;.    }else{.
301b0 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e        p->outCoun
301c0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
301d0 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
301e0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b  ;.    if( zFile[
301f0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65  0]=='-' && zFile
30200 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 46 69 6c 65  [1]=='-' ) zFile
30210 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
30220 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
30230 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
30240 7a 46 69 6c 65 2c 20 22 2d 65 22 29 3d 3d 30 20  zFile, "-e")==0 
30250 7c 7c 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  || strcmp(zFile,
30260 20 22 2d 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "-x")==0 ){.   
30270 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20     p->doXdgOpen 
30280 3d 20 31 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  = 1;.      outpu
30290 74 4d 6f 64 65 50 75 73 68 28 70 29 3b 0a 20 20  tModePush(p);.  
302a0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 31 5d      if( zFile[1]
302b0 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20  =='x' ){.       
302c0 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20   newTempFile(p, 
302d0 22 63 73 76 22 29 3b 0a 20 20 20 20 20 20 20 20  "csv");.        
302e0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
302f0 73 76 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sv;.        sqli
30300 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30310 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
30320 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
30330 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61  rator, SEP_Comma
30340 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30350 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30360 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
30370 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
30380 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
30390 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
303a0 20 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c        newTempFil
303b0 65 28 70 2c 20 22 74 78 74 22 29 3b 0a 20 20 20  e(p, "txt");.   
303c0 20 20 20 20 20 62 54 78 74 4d 6f 64 65 20 3d 20       bTxtMode = 
303d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
303e0 20 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d   zFile = p->zTem
303f0 70 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  pFile;.    }.#en
30400 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f  dif /* SQLITE_NO
30410 48 41 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 20  HAVE_SYSTEM */. 
30420 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
30430 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53  ='|' ){.#ifdef S
30440 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
30450 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
30460 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
30470 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20  : pipes are not 
30480 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69  supported in thi
30490 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20  s OS\n");.      
304a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  rc = 1;.      p-
304b0 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23  >out = stdout;.#
304c0 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75  else.      p->ou
304d0 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20  t = popen(zFile 
304e0 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  + 1, "w");.     
304f0 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29   if( p->out==0 )
30500 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
30510 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
30520 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
30530 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c   pipe \"%s\"\n",
30540 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20   zFile + 1);.   
30550 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
30560 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
30570 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
30580 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
30590 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
305a0 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20  of(p->outfile), 
305b0 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22  p->outfile, "%s"
305c0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
305d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
305e0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
305f0 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
30600 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 78 74 4d  pen(zFile, bTxtM
30610 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
30620 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
30630 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
30640 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20  zFile,"off")!=0 
30650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
30660 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30670 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77  "Error: cannot w
30680 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e  rite to \"%s\"\n
30690 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
306a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
306b0 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
306c0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
306d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
306e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
306f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30700 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74  outfile), p->out
30710 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  file, "%s", zFil
30720 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
30730 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
30740 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20   c=='p' && n>=3 
30750 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30760 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29  [0], "print", n)
30770 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
30780 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
30790 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
307a0 20 20 20 69 66 28 20 69 3e 31 20 29 20 72 61 77     if( i>1 ) raw
307b0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
307c0 22 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  " ");.      utf8
307d0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
307e0 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
307f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
30800 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
30810 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  n");.  }else..  
30820 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74  if( c=='p' && st
30830 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
30840 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20  "prompt", n)==0 
30850 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20  ){.    if( nArg 
30860 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 2) {.      st
30870 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74  rncpy(mainPrompt
30880 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41  ,azArg[1],(int)A
30890 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f  rraySize(mainPro
308a0 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
308b0 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33     if( nArg >= 3
308c0 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
308d0 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  y(continuePrompt
308e0 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41  ,azArg[2],(int)A
308f0 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75  rraySize(continu
30900 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  ePrompt)-1);.   
30910 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
30920 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e  ( c=='q' && strn
30930 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71  cmp(azArg[0], "q
30940 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uit", n)==0 ){. 
30950 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
30960 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
30970 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
30980 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
30990 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ead", n)==0 ){. 
309a0 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20     FILE *alt;.  
309b0 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
309c0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
309d0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
309e0 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22 29  : .read FILE\n")
309f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30a00 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
30a10 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
30a20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f    }.    alt = fo
30a30 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72  pen(azArg[1], "r
30a40 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74  b");.    if( alt
30a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
30a60 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30a70 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
30a80 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
30a90 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
30aa0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
30ab0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
30ac0 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
30ad0 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
30ae0 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
30af0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
30b00 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
30b10 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
30b20 20 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d   "restore", n)==
30b30 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
30b40 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
30b50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30b60 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
30b70 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
30b80 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
30b90 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
30ba0 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
30bb0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
30bc0 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
30bd0 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a  zArg[1];.      z
30be0 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
30bf0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
30c00 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =3 ){.      zSrc
30c10 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  File = azArg[2];
30c20 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41  .      zDb = azA
30c30 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  rg[1];.    }else
30c40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
30c50 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30c60 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f  e: .restore ?DB?
30c70 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
30c80 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
30c90 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
30ca0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
30cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
30cc0 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53  en(zSrcFile, &pS
30cd0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  rc);.    if( rc!
30ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30cf0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
30d00 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
30d10 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
30d20 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29  \"\n", zSrcFile)
30d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30d40 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
30d50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
30d60 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
30d70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75  , 0);.    pBacku
30d80 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
30d90 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 7a  up_init(p->db, z
30da0 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22  Db, pSrc, "main"
30db0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
30dc0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  up==0 ){.      u
30dd0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
30de0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
30df0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
30e00 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
30e10 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
30e20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
30e30 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n 1;.    }.    w
30e40 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
30e50 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
30e60 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
30e70 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
30e80 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
30e90 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20 20  _BUSY  ){.      
30ea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
30eb0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69  USY ){.        i
30ec0 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d  f( nTimeout++ >=
30ed0 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   3 ) break;.    
30ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
30ef0 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a  p(100);.      }.
30f00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30f10 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
30f20 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
30f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
30f40 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
30f50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
30f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
30f70 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c   || rc==SQLITE_L
30f80 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72  OCKED ){.      r
30f90 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
30fa0 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65  , "Error: source
30fb0 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73   database is bus
30fc0 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  y\n");.      rc 
30fd0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
30fe0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30ff0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
31000 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
31010 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
31020 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
31030 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
31040 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
31050 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
31060 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
31070 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
31080 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
31090 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
310a0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
310b0 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f  tatsOn = (u8)boo
310c0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
310d0 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
310e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
310f0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
31100 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31110 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
31120 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
31130 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
31140 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
31150 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
31160 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31170 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
31180 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
31190 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
311a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
311b0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
311c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
311d0 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
311e0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
311f0 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
31200 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
31210 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
31220 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
31230 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
31240 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
31250 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
31260 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
31270 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
31280 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
31290 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
312a0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
312b0 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
312c0 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
312d0 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
312e0 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
312f0 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
31300 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
31310 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
31320 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
31330 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
31340 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
31350 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
31360 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
31370 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
31380 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
31390 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
313a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
313b0 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
313c0 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
313d0 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
313e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
313f0 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
31400 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
31410 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
31420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31430 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31440 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
31450 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
31460 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
31470 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
31480 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
31490 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
314a0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
314b0 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
314c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
314d0 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
314e0 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
314f0 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
31500 22 2c 20 30 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ", 0)==0;.      
31510 69 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20  if( isMaster || 
31520 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
31530 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65  zName,"sqlite_te
31540 6d 70 5f 6d 61 73 74 65 72 22 2c 30 29 3d 3d 30  mp_master",0)==0
31550 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
31560 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
31570 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
31580 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
31590 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
315a0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
315b0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
315c0 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315e0 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
315f0 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
31610 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31630 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
31640 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
31660 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
31670 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
31680 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
31690 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
316a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316b0 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
316c0 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
316d0 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
316e0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
316f0 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
31700 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
31710 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
31720 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
31730 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
31740 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
31750 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
31760 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
31770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
31780 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
31790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
317a0 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
317b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
317c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
317d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
317e0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
317f0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
31800 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
31810 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31830 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
31840 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
31850 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
31860 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
31870 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
31880 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
31890 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
318a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
318b0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
318c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
318d0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
318e0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
318f0 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
31900 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
31910 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
31920 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
31930 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
31940 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
31950 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
31960 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
31970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
31980 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
31990 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
319a0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
319b0 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
319c0 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
319d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
319e0 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
319f0 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
31a00 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
31a10 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
31a20 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
31a30 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
31a40 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
31a50 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
31a60 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
31a70 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
31a80 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
31a90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31aa0 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
31ab0 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
31ac0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
31ad0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
31ae0 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
31af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31b00 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
31b10 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
31b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31b30 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
31b40 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
31b50 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
31b60 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
31b70 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
31b80 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
31b90 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
31ba0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
31bb0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
31bc0 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
31bd0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
31be0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
31bf0 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
31c00 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
31c10 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
31c20 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
31c30 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
31c40 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
31c50 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
31c60 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
31c70 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
31c80 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
31c90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
31ca0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
31cb0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
31cc0 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
31cd0 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
31ce0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
31cf0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
31d00 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
31d10 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
31d20 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
31d30 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
31d40 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
31d50 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
31d60 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
31d70 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
31d80 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
31d90 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
31da0 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
31db0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
31dc0 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
31dd0 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
31de0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
31df0 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
31e00 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
31e10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
31e20 28 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20  ( strchr(zName, 
31e30 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
31e40 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
31e50 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72  elect, "lower(pr
31e60 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61  intf('%s.%s',sna
31e70 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20  me,tbl_name))", 
31e80 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
31e90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
31ea0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
31eb0 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d  , "lower(tbl_nam
31ec0 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  e)", 0);.       
31ed0 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
31ee0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
31ef0 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a  strchr(zName, '*
31f00 27 29 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20  ') ? " GLOB " : 
31f10 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20  " LIKE ", 0);.  
31f20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
31f30 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67  (&sSelect, zQarg
31f40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
31f50 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
31f60 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a  t, " AND ", 0);.
31f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31f80 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20  free(zQarg);.   
31f90 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
31fa0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
31fb0 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e  "type!='meta' AN
31fc0 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
31fd0 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L".             
31fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
31ff0 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72  ORDER BY snum, r
32000 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  owid", 0);.     
32010 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20   if( bDebug ){. 
32020 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32030 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a  tf(p->out, "SQL:
32040 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74   %s;\n", sSelect
32050 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .z);.      }else
32060 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
32070 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
32080 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61  b, sSelect.z, ca
32090 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
320a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
320b0 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74  }.      freeText
320c0 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
320d0 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
320e0 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
320f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
32100 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
32110 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
32120 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
32130 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
32140 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
32150 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc != SQLITE_OK 
32160 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
32170 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
32180 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65  r: querying sche
32190 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  ma information\n
321a0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
321b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
321c0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
321d0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65  .  }else..#if de
321e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
321f0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
32200 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
32210 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20  ECTTRACE).  if( 
32220 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20  c=='s' && n==11 
32230 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32240 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63  [0], "selecttrac
32250 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
32260 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
32270 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ace = (int)integ
32280 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
32290 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
322a0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
322b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
322c0 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27  SION).  if( c=='
322d0 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
322e0 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22  Arg[0],"session"
322f0 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29  ,n)==0 && n>=3 )
32300 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f  {.    OpenSessio
32310 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70  n *pSession = &p
32320 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20  ->aSession[0];. 
32330 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20     char **azCmd 
32340 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20  = &azArg[1];.   
32350 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20   int iSes = 0;. 
32360 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41     int nCmd = nA
32370 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20  rg - 1;.    int 
32380 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  i;.    if( nArg<
32390 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
323a0 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
323b0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
323c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  );.    if( nArg>
323d0 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =3 ){.      for(
323e0 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e  iSes=0; iSes<p->
323f0 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b  nSession; iSes++
32400 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
32410 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f  trcmp(p->aSessio
32420 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61  n[iSes].zName, a
32430 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72  zArg[1])==0 ) br
32440 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
32450 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e     if( iSes<p->n
32460 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
32470 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70     pSession = &p
32480 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
32490 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b  ;.        azCmd+
324a0 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d  +;.        nCmd-
324b0 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
324c0 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
324d0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
324e0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73  0];.        iSes
324f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
32500 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73    }..    /* .ses
32510 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c  sion attach TABL
32520 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  E.    ** Invoke 
32530 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
32540 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65  on_attach() inte
32550 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20  rface to attach 
32560 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20  a particular.   
32570 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61   ** table so tha
32580 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69  t it is never fi
32590 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ltered..    */. 
325a0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
325b0 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29  Cmd[0],"attach")
325c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
325d0 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20   nCmd!=2 ) goto 
325e0 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
325f0 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
32600 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29  pSession->p==0 )
32610 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
32620 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20  n_not_open:.    
32630 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32640 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
32650 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f  o sessions are o
32660 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  pen\n");.      }
32670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
32680 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
32690 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
326a0 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b  n->p, azCmd[1]);
326b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
326c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
326d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
326e0 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73  "ERROR: sqlite3s
326f0 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
32700 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
32710 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  c);.          rc
32720 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
32730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
32740 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
32750 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c  on changeset FIL
32760 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f  E.    ** .sessio
32770 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a  n patchset FILE.
32780 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63      ** Write a c
32790 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63  hangeset or patc
327a0 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65  hset into a file
327b0 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f  .  The file is o
327c0 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  verwritten..    
327d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
327e0 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e  p(azCmd[0],"chan
327f0 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74  geset")==0 || st
32800 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70  rcmp(azCmd[0],"p
32810 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a  atchset")==0 ){.
32820 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
32830 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
32840 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
32850 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
32860 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
32870 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67  ession->p==0 ) g
32880 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f  oto session_not_
32890 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20  open;.      out 
328a0 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d  = fopen(azCmd[1]
328b0 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
328c0 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
328d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
328e0 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
328f0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
32900 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c  s\" for writing\
32910 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  n", azCmd[1]);. 
32920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32930 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a      int szChng;.
32940 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
32950 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  hng;.        if(
32960 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63   azCmd[0][0]=='c
32970 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ' ){.          r
32980 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
32990 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65  on_changeset(pSe
329a0 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e  ssion->p, &szChn
329b0 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20  g, &pChng);.    
329c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
329d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
329e0 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
329f0 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
32a00 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
32a10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32a20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
32a30 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45         printf("E
32a40 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65  rror: error code
32a50 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
32a60 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
32a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32a80 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20   if( pChng.     
32a90 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70       && fwrite(p
32aa0 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c  Chng, szChng, 1,
32ab0 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20   out)!=1 ){.    
32ac0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32ad0 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
32ae0 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65   Failed to write
32af0 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20   entire %d-byte 
32b00 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20  output\n",.     
32b10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43               szC
32b20 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
32b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32b40 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20  free(pChng);.   
32b50 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
32b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
32b70 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
32b80 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a  sion close.    *
32b90 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e  * Close the iden
32ba0 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20  tified session. 
32bb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
32bc0 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
32bd0 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  close")==0 ){.  
32be0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
32bf0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
32c00 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
32c10 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
32c20 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  on ){.        se
32c30 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73  ssion_close(pSes
32c40 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  sion);.        p
32c50 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
32c60 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d   = p->aSession[-
32c70 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  -p->nSession];. 
32c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
32c90 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
32ca0 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41  n enable ?BOOLEA
32cb0 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
32cc0 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c  or set the enabl
32cd0 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  e flag.    */.  
32ce0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
32cf0 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29  md[0], "enable")
32d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
32d10 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
32d20 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
32d30 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
32d40 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
32d50 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
32d60 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
32d70 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
32d80 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
32d90 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
32da0 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65  e3session_enable
32db0 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69  (pSession->p, ii
32dc0 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
32dd0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
32de0 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c  session %s enabl
32df0 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  e flag = %d\n",.
32e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e10 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
32e20 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
32e30 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
32e40 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c   /* .session fil
32e50 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20  ter GLOB .....  
32e60 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20    ** Set a list 
32e70 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73  of GLOB patterns
32e80 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20   of table names 
32e90 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  to be excluded..
32ea0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
32eb0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
32ec0 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a  "filter")==0 ){.
32ed0 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42        int ii, nB
32ee0 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  yte;.      if( n
32ef0 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd<2 ) goto ses
32f00 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
32f10 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
32f20 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
32f30 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
32f40 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
32f50 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  er; ii++){.     
32f60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
32f70 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
32f80 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20  lter[ii]);.     
32f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
32fa0 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
32fb0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
32fc0 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
32fd0 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e  izeof(pSession->
32fe0 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43  azFilter[0])*(nC
32ff0 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70  md-1);.        p
33000 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
33010 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
33020 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
33030 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
33040 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29  n->azFilter==0 )
33050 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
33060 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33070 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65  Error: out or me
33080 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
33090 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
330a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
330b0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64  or(ii=1; ii<nCmd
330c0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
330d0 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
330e0 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71  ilter[ii-1] = sq
330f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
33100 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a  s", azCmd[ii]);.
33110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33120 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
33130 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20  ter = ii-1;.    
33140 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
33150 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69     /* .session i
33160 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
33170 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
33180 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65  r set the indire
33190 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  ct flag.    */. 
331a0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
331b0 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63  Cmd[0], "indirec
331c0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
331d0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
331e0 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20  ( nCmd>2 ) goto 
331f0 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
33200 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d  rror;.      ii =
33210 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20   nCmd==1 ? -1 : 
33220 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43  booleanValue(azC
33230 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  md[1]);.      if
33240 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
33250 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
33260 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64  lite3session_ind
33270 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e  irect(pSession->
33280 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
33290 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
332a0 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
332b0 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20  indirect flag = 
332c0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
332d0 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73             pSess
332e0 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b  ion->zName, ii);
332f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
33300 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
33310 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20  ion isempty.    
33320 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
33330 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
33340 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mpty.    */.    
33350 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
33360 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d  [0], "isempty")=
33370 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
33380 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
33390 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73  md!=1 ) goto ses
333a0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
333b0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
333c0 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
333d0 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
333e0 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28  session_isempty(
333f0 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
33400 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33410 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69  f(p->out, "sessi
33420 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c  on %s isempty fl
33430 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
33460 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
33470 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
33480 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20  .session list.  
33490 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75    ** List all cu
334a0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73  rrently open ses
334b0 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20  sions.    */.   
334c0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
334d0 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20  d[0],"list")==0 
334e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
334f0 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
33500 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
33510 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
33520 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c  t, "%d %s\n", i,
33530 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e   p->aSession[i].
33540 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
33550 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
33560 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20  * .session open 
33570 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f  DB NAME.    ** O
33580 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
33590 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e  n called NAME on
335a0 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61   the attached da
335b0 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a  tabase DB..    *
335c0 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  * DB is normally
335d0 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a   "main"..    */.
335e0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
335f0 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d  zCmd[0],"open")=
33600 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
33610 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69   *zName;.      i
33620 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74  f( nCmd!=3 ) got
33630 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
33640 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e  _error;.      zN
33650 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a  ame = azCmd[2];.
33660 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
33670 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  0]==0 ) goto ses
33680 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
33690 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
336a0 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
336b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
336c0 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
336d0 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a  ssion[i].zName,z
336e0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
336f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33700 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69  f(stderr, "Sessi
33710 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  on \"%s\" alread
33720 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61  y exists\n", zNa
33730 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
33740 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33750 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
33760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33770 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d  f( p->nSession>=
33780 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
33790 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  ssion) ){.      
337a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
337b0 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66  err, "Maximum of
337c0 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c   %d sessions\n",
337d0 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53   ArraySize(p->aS
337e0 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  ession));.      
337f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
33800 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
33810 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e  }.      pSession
33820 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
33830 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
33840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33850 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70  session_create(p
33860 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20  ->db, azCmd[1], 
33870 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  &pSession->p);. 
33880 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33890 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
338a0 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f  f(stderr, "Canno
338b0 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20  t open session: 
338c0 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22  error code=%d\n"
338d0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72  , rc);.        r
338e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  c = 0;.        g
338f0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33900 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
33910 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e       pSession->n
33920 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Filter = 0;.    
33930 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
33940 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53  _table_filter(pS
33950 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69  ession->p, sessi
33960 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73  on_filter, pSess
33970 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ion);.      p->n
33980 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20  Session++;.     
33990 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
339a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
339b0 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
339c0 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f  .    }else.    /
339d0 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20  * If no command 
339e0 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68  name matches, sh
339f0 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  ow a syntax erro
33a00 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  r */.    session
33a10 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20  _syntax_error:. 
33a20 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28     session_help(
33a30 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
33a40 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
33a50 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64  E_DEBUG.  /* Und
33a60 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e  ocumented comman
33a70 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ds for internal 
33a80 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63  testing.  Subjec
33a90 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a  t to change.  **
33aa0 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e   without notice.
33ab0 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27   */.  if( c=='s'
33ac0 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72   && n>=10 && str
33ad0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33ae0 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d  selftest-", 9)==
33af0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  0 ){.    if( str
33b00 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
33b10 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29   "boolean", n-9)
33b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
33b30 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72   i, v;.      for
33b40 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
33b50 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  +){.        v = 
33b60 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
33b70 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
33b80 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33b90 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78  ut, "%s: %d 0x%x
33ba0 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76  \n", azArg[i], v
33bb0 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
33bc0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
33bd0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
33be0 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d  "integer", n-9)=
33bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
33c00 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  i; sqlite3_int64
33c10 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
33c20 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
33c30 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42  .        char zB
33c40 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20  uf[200];.       
33c50 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75   v = integerValu
33c60 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
33c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
33c80 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
33c90 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c  f),zBuf,"%s: %ll
33ca0 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41  d 0x%llx\n", azA
33cb0 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20  rg[i],v,v);.    
33cc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33cd0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  p->out, "%s", zB
33ce0 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uf);.      }.   
33cf0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
33d00 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  f..  if( c=='s' 
33d10 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63  && n>=4 && strnc
33d20 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c  mp(azArg[0],"sel
33d30 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  ftest",n)==0 ){.
33d40 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20      int bIsInit 
33d50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
33d60 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  True to initiali
33d70 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  ze the SELFTEST 
33d80 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
33d90 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
33da0 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65        /* Verbose
33db0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
33dc0 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69 73  nt bSelftestExis
33dd0 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ts;     /* True 
33de0 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65  if SELFTEST alre
33df0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
33e00 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20    int i, k;     
33e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33e20 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
33e30 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30     int nTest = 0
33e40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
33e50 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
33e60 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uns */.    int n
33e70 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Err = 0;        
33e80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33e90 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
33ea0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74      ShellText st
33eb0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
33ec0 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75 65  Answer for a que
33ed0 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ry */.    sqlite
33ee0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
33ef0 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69  0; /* Query agai
33f00 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53 54  nst the SELFTEST
33f10 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f   table */..    o
33f20 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20  pen_db(p,0);.   
33f30 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
33f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
33f50 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
33f60 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
33f70 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
33f80 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
33f90 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
33fa0 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
33fb0 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e 69  {.        bIsIni
33fc0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
33fd0 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
33fe0 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29  cmp(z,"-v")==0 )
33ff0 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62 6f  {.        bVerbo
34000 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  se++;.      }els
34010 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  e.      {.      
34020 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
34030 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
34040 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
34050 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
34060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
34070 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30  zArg[i], azArg[0
34080 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ]);.        raw_
34090 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
340a0 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  Should be one of
340b0 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b  : --init -v\n");
340c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
340d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
340e0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
340f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34100 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
34110 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
34120 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e  data(p->db,"main
34130 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30  ","selftest",0,0
34140 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20  ,0,0,0,0).      
34150 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f       != SQLITE_O
34160 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66  K ){.      bSelf
34170 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a  testExists = 0;.
34180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34190 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
341a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
341b0 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20  if( bIsInit ){. 
341c0 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66 74       createSelft
341d0 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20  estTable(p);.   
341e0 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
341f0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
34200 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72 29    initText(&str)
34210 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
34220 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a  (&str, "x", 0);.
34230 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74      for(k=bSelft
34240 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b  estExists; k>=0;
34250 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   k--){.      if(
34260 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k==1 ){.       
34270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
34280 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
34290 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
342a0 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  ECT tno,op,cmd,a
342b0 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  ns FROM selftest
342c0 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a   ORDER BY tno",.
342d0 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
342e0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
342f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
34310 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
34320 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45            "VALUE
34330 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73  S(0,'memo','Miss
34340 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61 62  ing SELFTEST tab
34350 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65  le - default che
34360 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a  cks only',''),".
34370 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
34380 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d   (1,'run','PRAGM
34390 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
343a0 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20  k','ok')",.     
343b0 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
343c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
343d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
343e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
343f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71  stderr, "Error q
34400 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66  uerying the self
34410 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a  test table\n");.
34420 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
34430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
34440 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
34450 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
34460 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
34470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
34480 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f  or(i=1; sqlite3_
34490 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
344a0 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20  ITE_ROW; i++){. 
344b0 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d         int tno =
344c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
344d0 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
344e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
344f0 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
34500 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
34510 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
34520 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   1);.        con
34530 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
34540 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
34550 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
34560 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
34570 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
34580 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  zAns = (const ch
34590 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
345a0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33  mn_text(pStmt, 3
345b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  );..        k = 
345c0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  0;.        if( b
345d0 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20  Verbose>0 ){.   
345e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75         char *zQu
345f0 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ote = sqlite3_mp
34600 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c  rintf("%q", zSql
34610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  );.          pri
34620 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e  ntf("%d: %s %s\n
34630 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71  ", tno, zOp, zSq
34640 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
34650 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
34660 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
34670 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
34680 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20  (zOp,"memo")==0 
34690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
346a0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
346b0 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
346c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
346d0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
346e0 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29  (zOp,"run")==0 )
346f0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
34700 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
34710 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d           str.n =
34720 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
34730 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  r.z[0] = 0;.    
34740 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34750 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
34760 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70  Sql, captureOutp
34770 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72  utCallback, &str
34780 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
34790 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a         nTest++;.
347a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 56            if( bV
347b0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
347c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
347d0 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c  f(p->out, "Resul
347e0 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29  t: %s\n", str.z)
347f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
34800 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 7c          if( rc |
34810 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
34820 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
34830 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
34840 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
34850 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
34860 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d  out, "%d: error-
34870 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20  code-%d: %s\n", 
34880 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  tno, rc, zErrMsg
34890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
348a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
348b0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
348c0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
348d0 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20  (zAns,str.z)!=0 
348e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
348f0 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
34900 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34910 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
34920 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20  tf(p->out, "%d: 
34930 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
34940 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20  ", tno, zAns);. 
34950 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
34960 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
34970 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  %d:      Got: [%
34980 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e  s]\n", tno, str.
34990 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  z);.          }.
349a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
349b0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
349c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
349d0 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
349e0 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61    "Unknown opera
349f0 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73  tion \"%s\" on s
34a00 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c  elftest line %d\
34a10 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20  n", zOp, tno);. 
34a20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
34a30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
34a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34a50 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
34a60 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e  over rows of con
34a70 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45  tent from SELFTE
34a80 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ST */.      sqli
34a90 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
34aa0 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  mt);.    } /* En
34ab0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f  d loop over k */
34ac0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
34ad0 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  tr);.    utf8_pr
34ae0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
34af0 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
34b00 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72  d tests\n", nErr
34b10 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , nTest);.  }els
34b20 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
34b30 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
34b40 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
34b50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
34b60 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72  f( nArg<2 || nAr
34b70 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
34b80 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34b90 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74  "Usage: .separat
34ba0 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29  or COL ?ROW?\n")
34bb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
34bc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
34bd0 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
34be0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34bf0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
34c00 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
34c10 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
34c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c30 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
34c40 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65  raySize(p->colSe
34c50 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
34c60 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[1]);.    }.   
34c70 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
34c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
34c90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
34ca0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
34cb0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
34cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34cd0 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
34ce0 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
34cf0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d  ->rowSeparator)-
34d00 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  1, azArg[2]);.  
34d10 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
34d20 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
34d30 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
34d40 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c  rg[0],"sha3sum",
34d50 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
34d60 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
34d70 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74   0;   /* Which t
34d80 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d  able to checksum
34d90 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74  . 0 means everyt
34da0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hing */.    int 
34db0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
34dc0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34dd0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
34de0 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  bSchema = 0;    
34df0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73       /* Also has
34e00 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  h the schema */.
34e10 20 20 20 20 69 6e 74 20 62 53 65 70 61 72 61 74      int bSeparat
34e20 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
34e30 48 61 73 68 20 65 61 63 68 20 74 61 62 6c 65 20  Hash each table 
34e40 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20  separately */.  
34e50 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32    int iSize = 22
34e60 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  4;         /* Ha
34e70 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  sh algorithm to 
34e80 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  use */.    int b
34e90 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20  Debug = 0;      
34ea0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77      /* Only show
34eb0 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74 20   the query that 
34ec0 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a  would have run *
34ed0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
34ee0 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
34ef0 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74  * For querying t
34f00 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20  ables names */. 
34f10 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
34f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
34f30 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  QL to be run */.
34f40 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20      char *zSep; 
34f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34f60 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20  Separator */.   
34f70 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b   ShellText sSql;
34f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
34f90 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68  plete SQL for th
34fa0 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74  e query to run t
34fb0 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53  he hash */.    S
34fc0 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b  hellText sQuery;
34fd0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
34fe0 66 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  f queries used t
34ff0 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65  o read all conte
35000 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64  nt */.    open_d
35010 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
35020 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
35030 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
35040 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
35050 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  i];.      if( z[
35060 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
35070 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
35080 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  if( z[0]=='-' ) 
35090 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
350a0 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d   strcmp(z,"schem
350b0 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  a")==0 ){.      
350c0 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b      bSchema = 1;
350d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
350e0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
350f0 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d  p(z,"sha3-224")=
35100 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
35110 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20  sha3-256")==0.  
35120 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
35130 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d  (z,"sha3-384")==
35140 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73  0 || strcmp(z,"s
35150 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20  ha3-512")==0.   
35160 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
35170 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26    iSize = atoi(&
35180 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[5]);.        }
35190 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
351a0 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67   strcmp(z,"debug
351b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
351c0 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
351d0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
351e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
351f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
35200 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
35210 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
35220 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35240 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
35250 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0]);.          r
35260 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
35270 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65  , "Should be one
35280 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20   of: --schema". 
35290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352a0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d              " --
352b0 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d  sha3-224 --sha3-
352c0 32 35 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d  255 --sha3-384 -
352d0 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20  -sha3-512\n");. 
352e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
352f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
35300 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
35310 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
35320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
35330 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
35340 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35350 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75   "Usage: .sha3su
35360 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b  m ?OPTIONS? ?LIK
35370 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
35380 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
35390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
353a0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
353b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
353c0 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a       zLike = z;.
353d0 20 20 20 20 20 20 20 20 62 53 65 70 61 72 61 74          bSeparat
353e0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
353f0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
35400 6b 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 7a  ke("sqlite_%", z
35410 4c 69 6b 65 2c 20 30 29 3d 3d 30 20 29 20 62 53  Like, 0)==0 ) bS
35420 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
35430 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35440 20 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   bSchema ){.    
35450 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
35460 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
35470 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
35480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
35490 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
354a0 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
354b0 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
354c0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e              " UN
354d0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
354e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 0a  sqlite_master'".
354f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
35500 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
35510 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
35520 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
35530 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
35540 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
35550 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
35560 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
35570 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
35580 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
35590 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
355a0 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65        " AND name
355b0 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
355c0 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20  e_%'".          
355d0 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
355e0 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
355f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
35600 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
35610 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
35620 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
35630 6e 69 74 54 65 78 74 28 26 73 51 75 65 72 79 29  nitText(&sQuery)
35640 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  ;.    initText(&
35650 73 53 71 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e  sSql);.    appen
35660 64 54 65 78 74 28 26 73 53 71 6c 2c 20 22 57 49  dText(&sSql, "WI
35670 54 48 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72  TH [sha3sum$quer
35680 79 5d 28 61 2c 62 29 20 41 53 28 22 2c 30 29 3b  y](a,b) AS(",0);
35690 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 56 41 4c  .    zSep = "VAL
356a0 55 45 53 28 22 3b 0a 20 20 20 20 77 68 69 6c 65  UES(";.    while
356b0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
356c0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
356d0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
356e0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63   char *zTab = (c
356f0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
35700 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
35710 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 69  Stmt,0);.      i
35720 66 28 20 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69  f( zLike && sqli
35730 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b  te3_strlike(zLik
35740 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d 30 20 29  e, zTab, 0)!=0 )
35750 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35760 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
35770 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c 37 29 21  b, "sqlite_",7)!
35780 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
35790 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
357a0 2c 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ,"SELECT * FROM 
357b0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
357c0 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
357d0 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a 20 20 20  y,zTab,'"');.   
357e0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
357f0 26 73 51 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e  &sQuery," NOT IN
35800 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20  DEXED;", 0);.   
35810 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
35820 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
35830 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  e_master")==0 ){
35840 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
35850 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
35860 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
35870 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20  l_name,sql FROM 
35880 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
35890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358a0 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
358b0 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
358c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
358d0 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
358e0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
358f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
35900 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
35910 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73  y,"SELECT name,s
35920 65 71 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  eq FROM sqlite_s
35930 65 71 75 65 6e 63 65 22 0a 20 20 20 20 20 20 20  equence".       
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35950 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
35960 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
35970 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
35980 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
35990 73 74 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20  stat1")==0 ){.  
359a0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
359b0 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
359c0 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52   tbl,idx,stat FR
359d0 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22  OM sqlite_stat1"
359e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
359f0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
35a00 44 45 52 20 42 59 20 74 62 6c 2c 69 64 78 3b 22  DER BY tbl,idx;"
35a10 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
35a20 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
35a30 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33  b, "sqlite_stat3
35a40 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ")==0.          
35a50 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61     || strcmp(zTa
35a60 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
35a70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
35a80 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
35a90 65 72 79 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ery, "SELECT * F
35aa0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
35ab0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35ac0 51 75 65 72 79 2c 20 7a 54 61 62 2c 20 30 29 3b  Query, zTab, 0);
35ad0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
35ae0 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 20 4f  ext(&sQuery, " O
35af0 52 44 45 52 20 42 59 20 74 62 6c 2c 20 69 64 78  RDER BY tbl, idx
35b00 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20 30 29 3b  , rowid;\n", 0);
35b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35b20 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
35b30 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20 20 20 20   zSep, 0);.     
35b40 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
35b50 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20 27 5c 27  l, sQuery.z, '\'
35b60 27 29 3b 0a 20 20 20 20 20 20 73 51 75 65 72 79  ');.      sQuery
35b70 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 70  .n = 0;.      ap
35b80 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
35b90 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ",", 0);.      a
35ba0 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
35bb0 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b 0a 20 20   zTab, '\'');.  
35bc0 20 20 20 20 7a 53 65 70 20 3d 20 22 29 2c 28 22      zSep = "),("
35bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
35be0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
35bf0 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 62 53 65  mt);.    if( bSe
35c00 70 61 72 61 74 65 20 29 7b 0a 20 20 20 20 20 20  parate ){.      
35c10 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
35c20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
35c30 20 20 22 25 73 29 29 22 0a 20 20 20 20 20 20 20    "%s))".       
35c40 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65     " SELECT lowe
35c50 72 28 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  r(hex(sha3_query
35c60 28 61 2c 25 64 29 29 29 20 41 53 20 68 61 73 68  (a,%d))) AS hash
35c70 2c 20 62 20 41 53 20 6c 61 62 65 6c 22 0a 20 20  , b AS label".  
35c80 20 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d          "   FROM
35c90 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
35ca0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71  ",.          sSq
35cb0 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  l.z, iSize);.   
35cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
35cd0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
35ce0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
35cf0 22 25 73 29 29 22 0a 20 20 20 20 20 20 20 20 20  "%s))".         
35d00 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28   " SELECT lower(
35d10 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 67  hex(sha3_query(g
35d20 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61 2c 27 27  roup_concat(a,''
35d30 29 2c 25 64 29 29 29 20 41 53 20 68 61 73 68 22  ),%d))) AS hash"
35d40 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 46  .          "   F
35d50 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75 65  ROM [sha3sum$que
35d60 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ry]",.          
35d70 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a  sSql.z, iSize);.
35d80 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 54 65      }.    freeTe
35d90 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20  xt(&sQuery);.   
35da0 20 66 72 65 65 54 65 78 74 28 26 73 53 71 6c 29   freeText(&sSql)
35db0 3b 0a 20 20 20 20 69 66 28 20 62 44 65 62 75 67  ;.    if( bDebug
35dc0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35dd0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
35de0 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
35df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
35e00 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
35e10 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
35e20 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
35e30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
35e40 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
35e50 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
35e60 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
35e70 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 0a 20 20  .  if( c=='s'.  
35e80 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41   && (strncmp(azA
35e90 72 67 5b 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20  rg[0], "shell", 
35ea0 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70  n)==0 || strncmp
35eb0 28 61 7a 41 72 67 5b 30 5d 2c 22 73 79 73 74 65  (azArg[0],"syste
35ec0 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  m",n)==0).  ){. 
35ed0 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20     char *zCmd;. 
35ee0 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
35ef0 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
35f00 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35f10 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
35f20 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c  .system COMMAND\
35f30 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
35f40 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
35f50 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
35f60 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6d 64 20  .    }.    zCmd 
35f70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
35f80 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31  f(strchr(azArg[1
35f90 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73 22 3a 22  ],' ')==0?"%s":"
35fa0 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72 67 5b 31  \"%s\"", azArg[1
35fb0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b  ]);.    for(i=2;
35fc0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
35fd0 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69       zCmd = sqli
35fe0 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63  te3_mprintf(strc
35ff0 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27 20 27 29  hr(azArg[i],' ')
36000 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22 25 7a 20  ==0?"%z %s":"%z 
36010 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
36020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36030 20 20 20 20 20 20 7a 43 6d 64 2c 20 61 7a 41 72        zCmd, azAr
36040 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[i]);.    }.   
36050 20 78 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64   x = system(zCmd
36060 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
36070 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69  ree(zCmd);.    i
36080 66 28 20 78 20 29 20 72 61 77 5f 70 72 69 6e 74  f( x ) raw_print
36090 66 28 73 74 64 65 72 72 2c 20 22 53 79 73 74 65  f(stderr, "Syste
360a0 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  m command return
360b0 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d  s %d\n", x);.  }
360c0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
360d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
360e0 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f  OHAVE_SYSTEM) */
360f0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
36100 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
36110 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d  0], "show", n)==
36120 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
36130 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 42 6f  const char *azBo
36140 6f 6c 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20  ol[] = { "off", 
36150 22 6f 6e 22 2c 20 22 74 72 69 67 67 65 72 22 2c  "on", "trigger",
36160 20 22 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e   "full"};.    in
36170 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
36180 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
36190 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
361a0 20 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e   "Usage: .show\n
361b0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
361c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
361d0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
361e0 20 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70      }.    utf8_p
361f0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
36200 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65  12.12s: %s\n","e
36210 63 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  cho",.          
36220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36230 20 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53          azBool[S
36240 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
36250 48 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20  HFLG_Echo)]);.  
36260 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
36270 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
36280 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42  %s\n","eqp", azB
36290 6f 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33  ool[p->autoEQP&3
362a0 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ]);.    utf8_pri
362b0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
362c0 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70  .12s: %s\n","exp
362d0 6c 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lain",.         
362e0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
362f0 70 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70  plain ? "on" : p
36300 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20  ->autoExplain ? 
36310 22 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b  "auto" : "off");
36320 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
36330 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73  (p->out,"%12.12s
36340 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73  : %s\n","headers
36350 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f  ", azBool[p->sho
36360 77 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20  wHeader!=0]);.  
36370 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
36380 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
36390 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f  %s\n","mode", mo
363a0 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
363b0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
363c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
363d0 31 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c  12s: ", "nullval
363e0 75 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  ue");.      outp
363f0 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
36400 75 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ut, p->nullValue
36410 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
36420 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
36430 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
36440 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31  tf(p->out,"%12.1
36450 32 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75  2s: %s\n","outpu
36460 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
36470 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66  strlen30(p->outf
36480 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
36490 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
364a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
364b0 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
364c0 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72  ", "colseparator
364d0 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
364e0 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
364f0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
36500 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  r);.      raw_pr
36510 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
36520 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
36530 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e  ntf(p->out,"%12.
36540 31 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61  12s: ", "rowsepa
36550 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f  rator");.      o
36560 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
36570 2d 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70  ->out, p->rowSep
36580 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  arator);.      r
36590 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
365a0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66  , "\n");.    utf
365b0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
365c0 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
365d0 2c 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c  ,"stats", azBool
365e0 5b 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29  [p->statsOn!=0])
365f0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
36600 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
36610 32 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b  2s: ", "width");
36620 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c  .    for (i=0;i<
36630 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
36640 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70  ->colWidth) && p
36650 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d  ->colWidth[i] !=
36660 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20   0;i++) {.      
36670 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
36680 74 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c  t, "%d ", p->col
36690 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  Width[i]);.    }
366a0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
366b0 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
366c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
366d0 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
366e0 20 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d   %s\n", "filenam
366f0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
36700 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
36710 6d 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  me ? p->zDbFilen
36720 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c  ame : "");.  }el
36730 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
36740 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
36750 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e  g[0], "stats", n
36760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
36770 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
36780 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 28 75   p->statsOn = (u
36790 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
367a0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
367b0 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20  lse if( nArg==1 
367c0 29 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  ){.      display
367d0 5f 73 74 61 74 73 28 70 2d 3e 64 62 2c 20 70 2c  _stats(p->db, p,
367e0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
367f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36800 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
36810 20 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f   .stats ?on|off?
36820 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
36830 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
36840 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 74 27  e..  if( (c=='t'
36850 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63   && n>1 && strnc
36860 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61  mp(azArg[0], "ta
36870 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  bles", n)==0).  
36880 20 7c 7c 20 28 63 3d 3d 27 69 27 20 26 26 20 28   || (c=='i' && (
36890 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
368a0 2c 20 22 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d  , "indices", n)=
368b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
368c0 20 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61      || strncmp(a
368d0 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 65 78 65  zArg[0], "indexe
368e0 73 22 2c 20 6e 29 3d 3d 30 29 20 29 0a 20 20 29  s", n)==0) ).  )
368f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
36900 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63  mt *pStmt;.    c
36910 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a  har **azResult;.
36920 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41      int nRow, nA
36930 6c 6c 6f 63 3b 0a 20 20 20 20 69 6e 74 20 69 69  lloc;.    int ii
36940 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
36950 73 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  s;.    initText(
36960 26 73 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  &s);.    open_db
36970 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
36980 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
36990 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  _v2(p->db, "PRAG
369a0 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74  MA database_list
369b0 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  ", -1, &pStmt, 0
369c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
369d0 72 65 74 75 72 6e 20 73 68 65 6c 6c 44 61 74 61  return shellData
369e0 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29  baseError(p->db)
369f0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  ;..    if( nArg>
36a00 32 20 26 26 20 63 3d 3d 27 69 27 20 29 7b 0a 20  2 && c=='i' ){. 
36a10 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 61 6e       /* It is an
36a20 20 68 69 73 74 6f 72 69 63 61 6c 20 61 63 63 69   historical acci
36a30 64 65 6e 74 20 74 68 61 74 20 74 68 65 20 2e 69  dent that the .i
36a40 6e 64 65 78 65 73 20 63 6f 6d 6d 61 6e 64 20 73  ndexes command s
36a50 68 6f 77 73 20 61 6e 20 65 72 72 6f 72 0a 20 20  hows an error.  
36a60 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 61 6c 6c      ** when call
36a70 65 64 20 77 69 74 68 20 74 68 65 20 77 72 6f 6e  ed with the wron
36a80 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
36a90 6d 65 6e 74 73 20 77 68 65 72 65 61 73 20 74 68  ments whereas th
36aa0 65 20 2e 74 61 62 6c 65 73 0a 20 20 20 20 20 20  e .tables.      
36ab0 2a 2a 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 20  ** command does 
36ac0 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 61  not. */.      ra
36ad0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36ae0 20 22 55 73 61 67 65 3a 20 2e 69 6e 64 65 78 65   "Usage: .indexe
36af0 73 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f  s ?LIKE-PATTERN?
36b00 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
36b10 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
36b20 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
36b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
36b40 69 69 3d 30 3b 20 73 71 6c 69 74 65 33 5f 73 74  ii=0; sqlite3_st
36b50 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
36b60 45 5f 52 4f 57 3b 20 69 69 2b 2b 29 7b 0a 20 20  E_ROW; ii++){.  
36b70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36b80 7a 44 62 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  zDbName = (const
36b90 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
36ba0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
36bb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
36bc0 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e  zDbName==0 ) con
36bd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
36be0 20 73 2e 7a 20 26 26 20 73 2e 7a 5b 30 5d 20 29   s.z && s.z[0] )
36bf0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
36c00 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 2c 20 30  " UNION ALL ", 0
36c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
36c20 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62  ite3_stricmp(zDb
36c30 4e 61 6d 65 2c 20 22 6d 61 69 6e 22 29 3d 3d 30  Name, "main")==0
36c40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
36c50 6e 64 54 65 78 74 28 26 73 2c 20 22 53 45 4c 45  ndText(&s, "SELE
36c60 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20  CT name FROM ", 
36c70 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
36c80 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
36c90 65 78 74 28 26 73 2c 20 22 53 45 4c 45 43 54 20  ext(&s, "SELECT 
36ca0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
36cb0 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44  ppendText(&s, zD
36cc0 62 4e 61 6d 65 2c 20 27 5c 27 27 29 3b 0a 20 20  bName, '\'');.  
36cd0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
36ce0 28 26 73 2c 20 22 7c 7c 27 2e 27 7c 7c 6e 61 6d  (&s, "||'.'||nam
36cf0 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  e FROM ", 0);.  
36d00 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
36d10 6e 64 54 65 78 74 28 26 73 2c 20 7a 44 62 4e 61  ndText(&s, zDbNa
36d20 6d 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20  me, '"');.      
36d30 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
36d40 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22  .sqlite_master "
36d50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
36d60 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
36d70 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
36d80 22 20 57 48 45 52 45 20 74 79 70 65 20 49 4e 20  " WHERE type IN 
36d90 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29  ('table','view')
36da0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
36db0 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
36dc0 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
36dd0 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20  qlite_%'".      
36de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36df0 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b  "   AND name LIK
36e00 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20 20  E ?1", 0);.     
36e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36e20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 22 20  appendText(&s," 
36e30 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
36e40 78 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  x'".            
36e50 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
36e60 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
36e70 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ?1", 0);.      }
36e80 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
36e90 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
36ea0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 61 70 70  (pStmt);.    app
36eb0 65 6e 64 54 65 78 74 28 26 73 2c 20 22 20 4f 52  endText(&s, " OR
36ec0 44 45 52 20 42 59 20 31 22 2c 20 30 29 3b 0a 20  DER BY 1", 0);. 
36ed0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
36ee0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
36ef0 2c 20 73 2e 7a 2c 20 2d 31 2c 20 26 70 53 74 6d  , s.z, -1, &pStm
36f00 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 54  t, 0);.    freeT
36f10 65 78 74 28 26 73 29 3b 0a 20 20 20 20 69 66 28  ext(&s);.    if(
36f20 20 72 63 20 29 20 72 65 74 75 72 6e 20 73 68 65   rc ) return she
36f30 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28  llDatabaseError(
36f40 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  p->db);..    /* 
36f50 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74  Run the SQL stat
36f60 65 6d 65 6e 74 20 70 72 65 70 61 72 65 64 20 62  ement prepared b
36f70 79 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63  y the above bloc
36f80 6b 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  k. Store the res
36f90 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 73 20 61  ults.    ** as a
36fa0 6e 20 61 72 72 61 79 20 6f 66 20 6e 75 6c 2d 74  n array of nul-t
36fb0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
36fc0 73 20 69 6e 20 61 7a 52 65 73 75 6c 74 5b 5d 2e  s in azResult[].
36fd0 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20    */.    nRow = 
36fe0 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  nAlloc = 0;.    
36ff0 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  azResult = 0;.  
37000 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a    if( nArg>1 ){.
37010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
37020 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
37030 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c 20  , azArg[1], -1, 
37040 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
37050 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
37060 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
37070 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
37080 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  "%", -1, SQLITE_
37090 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
370a0 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
370b0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
370c0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
370d0 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c     if( nRow>=nAl
370e0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  loc ){.        c
370f0 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20  har **azNew;.   
37100 20 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 6e 41       int n2 = nA
37110 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
37120 20 20 20 20 20 61 7a 4e 65 77 20 3d 20 73 71 6c       azNew = sql
37130 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61  ite3_realloc64(a
37140 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28  zResult, sizeof(
37150 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a 6e 32 29  azResult[0])*n2)
37160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
37170 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
37180 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f      rc = shellNo
37190 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  memError();.    
371a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
371b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
371c0 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a 20 20 20 20  Alloc = n2;.    
371d0 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 61      azResult = a
371e0 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zNew;.      }.  
371f0 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f      azResult[nRo
37200 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  w] = sqlite3_mpr
37210 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
37220 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
37230 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
37240 20 69 66 28 20 30 3d 3d 61 7a 52 65 73 75 6c 74   if( 0==azResult
37250 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20 20 20 20 20  [nRow] ){.      
37260 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65    rc = shellNome
37270 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  mError();.      
37280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
37290 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  .      nRow++;. 
372a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
372b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
372c0 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  tmt)!=SQLITE_OK 
372d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 68  ){.      rc = sh
372e0 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
372f0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 0a  (p->db);.    }..
37300 20 20 20 20 2f 2a 20 50 72 65 74 74 79 2d 70 72      /* Pretty-pr
37310 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  int the contents
37320 20 6f 66 20 61 72 72 61 79 20 61 7a 52 65 73 75   of array azResu
37330 6c 74 5b 5d 20 74 6f 20 74 68 65 20 6f 75 74 70  lt[] to the outp
37340 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ut */.    if( rc
37350 3d 3d 30 20 26 26 20 6e 52 6f 77 3e 30 20 29 7b  ==0 && nRow>0 ){
37360 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20  .      int len, 
37370 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  maxlen = 0;.    
37380 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
37390 20 20 69 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c    int nPrintCol,
373a0 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20   nPrintRow;.    
373b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f    for(i=0; i<nRo
373c0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
373d0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
373e0 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20  azResult[i]);.  
373f0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61        if( len>ma
37400 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
37410 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
37420 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38     nPrintCol = 8
37430 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20  0/(maxlen+2);.  
37440 20 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f      if( nPrintCo
37450 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20  l<1 ) nPrintCol 
37460 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e  = 1;.      nPrin
37470 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e  tRow = (nRow + n
37480 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50  PrintCol - 1)/nP
37490 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66  rintCol;.      f
374a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74  or(i=0; i<nPrint
374b0 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Row; i++){.     
374c0 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52     for(j=i; j<nR
374d0 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77  ow; j+=nPrintRow
374e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
374f0 72 20 2a 7a 53 70 20 3d 20 6a 3c 6e 50 72 69 6e  r *zSp = j<nPrin
37500 74 52 6f 77 20 3f 20 22 22 20 3a 20 22 20 20 22  tRow ? "" : "  "
37510 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  ;.          utf8
37520 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37530 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70 2c 20 6d  "%s%-*s", zSp, m
37540 61 78 6c 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  axlen,.         
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 52               azR
37560 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73  esult[j] ? azRes
37570 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a 20 20 20 20  ult[j]:"");.    
37580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
37590 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
375a0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
375b0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
375c0 69 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b 20 69 69  i=0; ii<nRow; ii
375d0 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ++) sqlite3_free
375e0 28 61 7a 52 65 73 75 6c 74 5b 69 69 5d 29 3b 0a  (azResult[ii]);.
375f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37600 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65  (azResult);.  }e
37610 6c 73 65 0a