/ Hex Artifact Content
Login

Artifact 2115621cbc5a45ad5031f45c5473585963d061d8af184ffdf0c1ac86a4b9dd80:


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 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7950: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 20  OPEN_READONLY   
7960: 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  4      /* Open a
7970: 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
7980: 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 0a 2f   read-only */../
7990: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
79a0: 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c  he allowed shell
79b0: 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  Flgs values.*/.#
79c0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
79d0: 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30  ecache      0x00
79e0: 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d  000001 /* The --
79f0: 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e  pagecache option
7a00: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
7a10: 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  ine SHFLG_Lookas
7a20: 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30  ide      0x00000
7a30: 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65  002 /* Lookaside
7a40: 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20   memory is used 
7a50: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7a60: 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20  _Backslash      
7a70: 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68  0x00000004 /* Th
7a80: 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70  e --backslash op
7a90: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
7aa0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72  #define SHFLG_Pr
7ab0: 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30  eserveRowid  0x0
7ac0: 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70  0000008 /* .dump
7ad0: 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64   preserves rowid
7ae0: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
7af0: 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  ne SHFLG_Newline
7b00: 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30  s       0x000000
7b10: 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65  10 /* .dump --ne
7b20: 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64  wline flag */.#d
7b30: 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e  efine SHFLG_Coun
7b40: 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30  tChanges   0x000
7b50: 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65  00020 /* .change
7b60: 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65  s setting */.#de
7b70: 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20  fine SHFLG_Echo 
7b80: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30            0x0000
7b90: 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72  0040 /* .echo or
7ba0: 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20   --echo setting 
7bb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  */../*.** Macros
7bc0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
7bd0: 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c   setting shellFl
7be0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68  gs.*/.#define Sh
7bf0: 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20  ellHasFlag(P,X) 
7c00: 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46     (((P)->shellF
7c10: 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23  lgs & (X))!=0).#
7c20: 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46  define ShellSetF
7c30: 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29  lag(P,X)    ((P)
7c40: 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29  ->shellFlgs|=(X)
7c50: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43  ).#define ShellC
7c60: 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28  learFlag(P,X)  (
7c70: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d  (P)->shellFlgs&=
7c80: 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (~(X)))../*.** T
7c90: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
7ca0: 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23  owed modes..*/.#
7cb0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65  define MODE_Line
7cc0: 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63       0  /* One c
7cd0: 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20  olumn per line. 
7ce0: 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77   Blank line betw
7cf0: 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23  een records */.#
7d00: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75  define MODE_Colu
7d10: 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72  mn   1  /* One r
7d20: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69  ecord per line i
7d30: 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a  n neat columns *
7d40: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
7d50: 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e  ist     2  /* On
7d60: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
7d70: 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74  e with a separat
7d80: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  or */.#define MO
7d90: 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f  DE_Semi     3  /
7da0: 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c  * Same as MODE_L
7db0: 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22  ist but append "
7dc0: 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20  ;" to each line 
7dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7de0: 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47  Html     4  /* G
7df0: 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c  enerate an XHTML
7e00: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
7e10: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20  e MODE_Insert   
7e20: 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53  5  /* Generate S
7e30: 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74  QL "insert" stat
7e40: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
7e50: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20  e MODE_Quote    
7e60: 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75  6  /* Quote valu
7e70: 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f  es as for SQL */
7e80: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
7e90: 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e  l      7  /* Gen
7ea0: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
7eb0: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
7ec0: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
7ed0: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20  ODE_Csv      8  
7ee0: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
7ef0: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
7f00: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
7f10: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20  ODE_Explain  9  
7f20: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
7f30: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
7f40: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
7f50: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73  .#define MODE_As
7f60: 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65  cii   10  /* Use
7f70: 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20   ASCII unit and 
7f80: 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72  record separator
7f90: 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f  s (0x1F/0x1E) */
7fa0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72  .#define MODE_Pr
7fb0: 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65  etty  11  /* Pre
7fc0: 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61  tty-print schema
7fd0: 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  s */..static con
7fe0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
7ff0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8000: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8010: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
8020: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8030: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8040: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8050: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8060: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8070: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 7d  "prettyprint",.}
8080: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
8090: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f  re the column/ro
80a0: 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72  w/line separator
80b0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 61  s used by the va
80c0: 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f  rious.** import/
80d0: 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f  export modes..*/
80e0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c  .#define SEP_Col
80f0: 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69  umn    "|".#defi
8100: 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20  ne SEP_Row      
8110: 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45   "\n".#define SE
8120: 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74 22  P_Tab       "\t"
8130: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61  .#define SEP_Spa
8140: 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66 69  ce     " ".#defi
8150: 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20  ne SEP_Comma    
8160: 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   ",".#define SEP
8170: 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e  _CrLf      "\r\n
8180: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e  ".#define SEP_Un
8190: 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23  it      "\x1F".#
81a0: 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72  define SEP_Recor
81b0: 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a  d    "\x1E"../*.
81c0: 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ** A callback fo
81d0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f  r the sqlite3_lo
81e0: 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  g() interface..*
81f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
8200: 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72  ellLog(void *pAr
8210: 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c  g, int iErrCode,
8220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
8230: 67 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  g){.  ShellState
8240: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
8250: 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  e*)pArg;.  if( p
8260: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
8270: 72 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  rn;.  utf8_print
8280: 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29  f(p->pLog, "(%d)
8290: 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65   %s\n", iErrCode
82a0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73  , zMsg);.  fflus
82b0: 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f  h(p->pLog);.}../
82c0: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
82d0: 6e 3a 20 20 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  n:  shell_putsnl
82e0: 28 58 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  (X).**.** Write 
82f0: 74 68 65 20 74 65 78 74 20 58 20 74 6f 20 74 68  the text X to th
8300: 65 20 73 63 72 65 65 6e 20 28 6f 72 20 77 68 61  e screen (or wha
8310: 74 65 76 65 72 20 6f 75 74 70 75 74 20 69 73 20  tever output is 
8320: 62 65 69 6e 67 20 64 69 72 65 63 74 65 64 29 0a  being directed).
8330: 2a 2a 20 61 64 64 69 6e 67 20 61 20 6e 65 77 6c  ** adding a newl
8340: 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 2c 20  ine at the end, 
8350: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
8360: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  X..*/.static voi
8370: 64 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 28  d shellPutsFunc(
8380: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8390: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
83a0: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
83b0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
83c0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
83d0: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
83e0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
83f0: 61 28 70 43 74 78 29 3b 0a 20 20 28 76 6f 69 64  a(pCtx);.  (void
8400: 29 6e 56 61 6c 3b 0a 20 20 75 74 66 38 5f 70 72  )nVal;.  utf8_pr
8410: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
8420: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  \n", sqlite3_val
8430: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
8440: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ));.  sqlite3_re
8450: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
8460: 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f   apVal[0]);.}../
8470: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
8480: 6e 3a 20 20 20 65 64 69 74 28 56 41 4c 55 45 29  n:   edit(VALUE)
8490: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
84a0: 20 20 20 20 65 64 69 74 28 56 41 4c 55 45 2c 45      edit(VALUE,E
84b0: 44 49 54 4f 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65  DITOR).**.** The
84c0: 73 65 20 73 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20  se steps:.**.** 
84d0: 20 20 20 20 28 31 29 20 57 72 69 74 65 20 56 41      (1) Write VA
84e0: 4c 55 45 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f  LUE into a tempo
84f0: 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  rary file..**   
8500: 20 20 28 32 29 20 52 75 6e 20 70 72 6f 67 72 61    (2) Run progra
8510: 6d 20 45 44 49 54 4f 52 20 6f 6e 20 74 68 61 74  m EDITOR on that
8520: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8530: 0a 2a 2a 20 20 20 20 20 28 33 29 20 52 65 61 64  .**     (3) Read
8540: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
8550: 69 6c 65 20 62 61 63 6b 20 61 6e 64 20 72 65 74  ile back and ret
8560: 75 72 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  urn its content 
8570: 61 73 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  as the result..*
8580: 2a 20 20 20 20 20 28 34 29 20 44 65 6c 65 74 65  *     (4) Delete
8590: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
85a0: 69 6c 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ile.**.** If the
85b0: 20 45 44 49 54 4f 52 20 61 72 67 75 6d 65 6e 74   EDITOR argument
85c0: 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 75 73 65   is omitted, use
85d0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
85e0: 65 20 56 49 53 55 41 4c 0a 2a 2a 20 65 6e 76 69  e VISUAL.** envi
85f0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
8600: 2e 20 20 49 66 20 73 74 69 6c 6c 20 74 68 65 72  .  If still ther
8610: 65 20 69 73 20 6e 6f 20 45 44 49 54 4f 52 2c 20  e is no EDITOR, 
8620: 74 68 72 6f 75 67 68 20 61 6e 20 65 72 72 6f 72  through an error
8630: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 68 72  ..**.** Also thr
8640: 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ow an error if t
8650: 68 65 20 45 44 49 54 4f 52 20 70 72 6f 67 72 61  he EDITOR progra
8660: 6d 20 72 65 74 75 72 6e 73 20 61 20 6e 6f 6e 2d  m returns a non-
8670: 7a 65 72 6f 20 65 78 69 74 20 63 6f 64 65 2e 0a  zero exit code..
8680: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8690: 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
86a0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
86b0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
86c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
86d0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
86e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
86f0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
8700: 63 68 61 72 20 2a 7a 45 64 69 74 6f 72 3b 0a 20  char *zEditor;. 
8710: 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65   char *zTempFile
8720: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
8730: 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d  *db;.  char *zCm
8740: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 42 69  d = 0;.  int bBi
8750: 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  n;.  int rc;.  F
8760: 49 4c 45 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71  ILE *f = 0;.  sq
8770: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
8780: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
8790: 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
87a0: 61 72 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66  ar *p = 0;..  if
87b0: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
87c0: 20 7a 45 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73   zEditor = (cons
87d0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
87e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
87f0: 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1]);.  }else{.  
8800: 20 20 7a 45 64 69 74 6f 72 20 3d 20 67 65 74 65    zEditor = gete
8810: 6e 76 28 22 56 49 53 55 41 4c 22 29 3b 0a 20 20  nv("VISUAL");.  
8820: 7d 0a 20 20 69 66 28 20 7a 45 64 69 74 6f 72 3d  }.  if( zEditor=
8830: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8840: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8850: 6f 6e 74 65 78 74 2c 20 22 6e 6f 20 65 64 69 74  ontext, "no edit
8860: 6f 72 20 66 6f 72 20 65 64 69 74 28 29 22 2c 20  or for edit()", 
8870: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
8880: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8890: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
88a0: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
88b0: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
88c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
88d0: 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69  context, "NULL i
88e0: 6e 70 75 74 20 74 6f 20 65 64 69 74 28 29 22 2c  nput to edit()",
88f0: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
8900: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c  ;.  }.  db = sql
8910: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
8920: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
8930: 0a 20 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  .  zTempFile = 0
8940: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
8950: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20  _control(db, 0, 
8960: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
8970: 50 46 49 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d  PFILENAME, &zTem
8980: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54  pFile);.  if( zT
8990: 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
89a0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
89b0: 20 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69   r = 0;.    sqli
89c0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
89d0: 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
89e0: 20 20 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73     zTempFile = s
89f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8a00: 74 65 6d 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20  temp%llx", r);. 
8a10: 20 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65     if( zTempFile
8a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8a30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8a40: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
8a50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8a60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e      }.  }.  bBin
8a70: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8a80: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8a90: 53 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 66  SQLITE_BLOB;.  f
8aa0: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
8ab0: 6c 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20  le, bBin ? "wb" 
8ac0: 3a 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d  : "w");.  if( f=
8ad0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8ae0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8af0: 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20  ontext, "edit() 
8b00: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70  cannot open temp
8b10: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8b20: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8b30: 65 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20  end;.  }.  sz = 
8b40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8b50: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
8b60: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
8b70: 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74  x = fwrite(sqlit
8b80: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
8b90: 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66  gv[0]), 1, sz, f
8ba0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8bb0: 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74  x = fwrite(sqlit
8bc0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8bd0: 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66  gv[0]), 1, sz, f
8be0: 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
8bf0: 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69  f);.  f = 0;.  i
8c00: 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20  f( x!=sz ){.    
8c10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8c20: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65  rror(context, "e
8c30: 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20  dit() could not 
8c40: 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20  write the whole 
8c50: 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  file", -1);.    
8c60: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
8c70: 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  nd;.  }.  zCmd =
8c80: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8c90: 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45  ("%s \"%s\"", zE
8ca0: 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65  ditor, zTempFile
8cb0: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
8cc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8cd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8ce0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8cf0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8d00: 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  end;.  }.  rc = 
8d10: 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20  system(zCmd);.  
8d20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
8d30: 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  d);.  if( rc ){.
8d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d50: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8d60: 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e  , "EDITOR return
8d70: 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31  ed non-zero", -1
8d80: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
8d90: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
8da0: 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70   f = fopen(zTemp
8db0: 46 69 6c 65 2c 20 62 42 69 6e 20 3f 20 22 72 62  File, bBin ? "rb
8dc0: 22 20 3a 20 22 72 22 29 3b 0a 20 20 69 66 28 20  " : "r");.  if( 
8dd0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  f==0 ){.    sqli
8de0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8df0: 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  (context,.      
8e00: 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20 72  "edit() cannot r
8e10: 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 20  eopen temp file 
8e20: 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31 29  after edit", -1)
8e30: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
8e40: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
8e50: 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45 4b  fseek(f, 0, SEEK
8e60: 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74  _END);.  sz = ft
8e70: 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e 64  ell(f);.  rewind
8e80: 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  (f);.  p = sqlit
8e90: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a 2b  e3_malloc64( sz+
8ea0: 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  (bBin==0) );.  i
8eb0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
8ec0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8ed0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
8ee0: 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  t);.    goto edi
8ef0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8f00: 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20    if( bBin ){.  
8f10: 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20 31    x = fread(p, 1
8f20: 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73  , sz, f);.  }els
8f30: 65 7b 0a 20 20 20 20 78 20 3d 20 66 72 65 61 64  e{.    x = fread
8f40: 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  (p, 1, sz, f);. 
8f50: 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20     p[sz] = 0;.  
8f60: 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20  }.  fclose(f);. 
8f70: 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21   f = 0;.  if( x!
8f80: 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =sz ){.    sqlit
8f90: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8fa0: 63 6f 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64 20  context, "could 
8fb0: 6e 6f 74 20 72 65 61 64 20 62 61 63 6b 20 74 68  not read back th
8fc0: 65 20 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d  e whole file", -
8fd0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
8fe0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8ff0: 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20    if( bBin ){.  
9000: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9010: 5f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c  _blob64(context,
9020: 20 70 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f   p, sz, sqlite3_
9030: 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  free);.  }else{.
9040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9050: 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78  lt_text64(contex
9060: 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  t, (const char*)
9070: 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20 20  p, sz,.         
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53   sqlite3_free, S
90a0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d  QLITE_UTF8);.  }
90b0: 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74 5f  .  p = 0;..edit_
90c0: 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28 20  func_end:.  if( 
90d0: 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20  f ) fclose(f);. 
90e0: 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69 6c   unlink(zTempFil
90f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
9100: 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  ee(zTempFile);. 
9110: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9120: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9130: 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
9140: 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  EM */../*.** Sav
9150: 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68 65  e or restore the
9160: 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
9170: 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  mode.*/.static v
9180: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 75  oid outputModePu
9190: 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  sh(ShellState *p
91a0: 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69 6f  ){.  p->modePrio
91b0: 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d  r = p->mode;.  m
91c0: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 50  emcpy(p->colSepP
91d0: 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  rior, p->colSepa
91e0: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
91f0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b  >colSeparator));
9200: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77  .  memcpy(p->row
9210: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f 77  SepPrior, p->row
9220: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9230: 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
9240: 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  r));.}.static vo
9250: 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70  id outputModePop
9260: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
9270: 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e  .  p->mode = p->
9280: 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65 6d  modePrior;.  mem
9290: 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  cpy(p->colSepara
92a0: 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50 72  tor, p->colSepPr
92b0: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63  ior, sizeof(p->c
92c0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20  olSeparator));. 
92d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65   memcpy(p->rowSe
92e0: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77 53  parator, p->rowS
92f0: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9300: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
9310: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9320: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9330: 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63  ing as a hex-enc
9340: 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58  oded blob (eg. X
9350: 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74  '1234' ).*/.stat
9360: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68  ic void output_h
9370: 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75  ex_blob(FILE *ou
9380: 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
9390: 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29  Blob, int nBlob)
93a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
93b0: 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72  r *zBlob = (char
93c0: 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f   *)pBlob;.  raw_
93d0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29  printf(out,"X'")
93e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
93f0: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f  Blob; i++){ raw_
9400: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78  printf(out,"%02x
9410: 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29  ",zBlob[i]&0xff)
9420: 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ; }.  raw_printf
9430: 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a  (out,"'");.}../*
9440: 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69 6e  .** Find a strin
9450: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f  g that is not fo
9460: 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20  und anywhere in 
9470: 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20 70  z[].  Return a p
9480: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61  ointer.** to tha
9490: 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  t string..**.** 
94a0: 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61 6e  Try to use zA an
94b0: 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66 20  d zB first.  If 
94c0: 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61 72  both of those ar
94d0: 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64 20  e already found 
94e0: 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d  in z[].** then m
94f0: 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72 69  ake up some stri
9500: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  ng and store it 
9510: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a 42  in the buffer zB
9520: 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  uf..*/.static co
9530: 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65 64  nst char *unused
9540: 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  _string(.  const
9550: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9570: 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20  Result must not 
9580: 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20  appear anywhere 
9590: 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in z */.  const 
95a0: 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20  char *zA, const 
95b0: 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54  char *zB,   /* T
95c0: 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20 2a  ry these first *
95d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 20  /.  char *zBuf  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
9600: 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72 61  o store a genera
9610: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ted string */.){
9620: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d 20  .  unsigned i = 
9630: 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  0;.  if( strstr(
9640: 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74 75  z, zA)==0 ) retu
9650: 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74 72  rn zA;.  if( str
9660: 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20  str(z, zB)==0 ) 
9670: 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b  return zB;.  do{
9680: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
9690: 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22 28  rintf(20,zBuf,"(
96a0: 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29  %s%u)", zA, i++)
96b0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72 73  ;.  }while( strs
96c0: 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b  tr(z,zBuf)!=0 );
96d0: 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a  .  return zBuf;.
96e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
96f0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
9700: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
9710: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
9720: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
9730: 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
9740: 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  o: output_quoted
9750: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
9760: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
9770: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
9780: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
9790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
97a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
97b0: 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d   c;.  setBinaryM
97c0: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66  ode(out, 1);.  f
97d0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
97e0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27  ])!=0 && c!='\''
97f0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
9800: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
9810: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
9820: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
9830: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9840: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69  t, "'");.    whi
9850: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
9860: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9870: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9880: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
9890: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
98a0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
98b0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
98c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
98d0: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
98e0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
98f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
9900: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
9910: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9920: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
9930: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9940: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
9950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
9970: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  +;.    }.    raw
9980: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
9990: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74  );.  }.  setText
99a0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a  Mode(out, 1);.}.
99b0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
99c0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
99d0: 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  s a quoted strin
99e0: 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74  g using SQL quot
99f0: 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e  ing conventions.
9a00: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c  .** Additionalll
9a10: 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20 22  y , escape the "
9a20: 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68 61  \n" and "\r" cha
9a30: 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74 20  racters so that 
9a40: 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67  they do not.** g
9a50: 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  et corrupted by 
9a60: 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e  end-of-line tran
9a70: 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74 69  slation faciliti
9a80: 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61  es in some opera
9a90: 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
9aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c  .**.** This is l
9ab0: 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  ike output_quote
9ac0: 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20 77  d_string() but w
9ad0: 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
9ae0: 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20   of the \r\n.** 
9af0: 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73 6d  escape mechanism
9b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9b10: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
9b20: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46 49  scaped_string(FI
9b30: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
9b40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
9b50: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65  ;.  char c;.  se
9b60: 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c  tBinaryMode(out,
9b70: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1);.  for(i=0; 
9b80: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
9b90: 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27   c!='\'' && c!='
9ba0: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b 20  \n' && c!='\r'; 
9bb0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d  i++){}.  if( c==
9bc0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
9bd0: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
9be0: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
9bf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c   const char *zNL
9c00: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
9c10: 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20  char *zCR = 0;. 
9c20: 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a     int nNL = 0;.
9c30: 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b      int nCR = 0;
9c40: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b  .    char zBuf1[
9c50: 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a  20], zBuf2[20];.
9c60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
9c70: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
9c80: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
9c90: 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nNL++;.      if(
9ca0: 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43   z[i]=='\r' ) nC
9cb0: 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  R++;.    }.    i
9cc0: 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20  f( nNL ){.      
9cd0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9ce0: 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20  "replace(");.   
9cf0: 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f     zNL = unused_
9d00: 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c  string(z, "\\n",
9d10: 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29   "\\012", zBuf1)
9d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9d30: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
9d40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65  _printf(out, "re
9d50: 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20  place(");.      
9d60: 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
9d70: 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c  ing(z, "\\r", "\
9d80: 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20  \015", zBuf2);. 
9d90: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
9da0: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
9db0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
9dc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
9dd0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
9de0: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
9df0: 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  r' && c!='\''; i
9e00: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
9e10: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
9e20: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
9e30: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
9e40: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
9e50: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
9e60: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
9e70: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9e80: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
9e90: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
9ea0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9eb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
9ec0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
9ed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9ee0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
9ef0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
9f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
9f10: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
9f20: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20  , zNL);.        
9f30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9f40: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
9f50: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43  tf(out, "%s", zC
9f60: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  R);.    }.    ra
9f70: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
9f80: 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52 20  ");.    if( nCR 
9f90: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9fa0: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
9fb0: 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52 29  char(13))", zCR)
9fc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9fd0: 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nNL ){.      raw
9fe0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
9ff0: 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c 20  %s',char(10))", 
a000: 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  zNL);.    }.  }.
a010: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75    setTextMode(ou
a020: 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, 1);.}../*.** 
a030: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
a040: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
a050: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
a060: 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e   C or TCL quotin
a070: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  g rules..*/.stat
a080: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
a090: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
a0a0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
a0b0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
a0c0: 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27  t c;.  fputc('"'
a0d0: 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28  , out);.  while(
a0e0: 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30   (c = *(z++))!=0
a0f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
a100: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \\' ){.      fpu
a110: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
a120: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a130: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a140: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66  =='"' ){.      f
a150: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
a160: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22 27  .      fputc('"'
a170: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a180: 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b  e if( c=='\t' ){
a190: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
a1a0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
a1b0: 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a  putc('t', out);.
a1c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
a1d0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\n' ){.      f
a1e0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
a1f0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e 27  .      fputc('n'
a200: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a210: 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b  e if( c=='\r' ){
a220: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
a230: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
a240: 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a  putc('r', out);.
a250: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
a260: 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20 29  sprint(c&0xff) )
a270: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a280: 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22  tf(out, "\\%03o"
a290: 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d  , c&0xff);.    }
a2a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74  else{.      fput
a2b0: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
a2c0: 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27  .  }.  fputc('"'
a2d0: 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , out);.}../*.**
a2e0: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
a2f0: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63 68  n string with ch
a300: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
a310: 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20  e special to.** 
a320: 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f  HTML escaped..*/
a330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a340: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
a350: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
a360: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a370: 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   i;.  if( z==0 )
a380: 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65   z = "";.  while
a390: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( *z ){.    for(
a3a0: 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20  i=0;   z[i].    
a3b0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a3c0: 3d 27 3c 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 26 27 0a 20 20   && z[i]!='&'.  
a3e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
a3f0: 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20 20  ]!='>'.         
a400: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27     && z[i]!='\"'
a410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a420: 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20  z[i]!='\'';.    
a430: 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69      i++){}.    i
a440: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
a450: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
a460: 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20  "%.*s",i,z);.   
a470: 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d   }.    if( z[i]=
a480: 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='<' ){.      ra
a490: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c  w_printf(out,"&l
a4a0: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
a4b0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b  if( z[i]=='&' ){
a4c0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a4d0: 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a  f(out,"&amp;");.
a4e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
a4f0: 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20  i]=='>' ){.     
a500: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a510: 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&gt;");.    }el
a520: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22  se if( z[i]=='\"
a530: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a540: 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f 74  rintf(out,"&quot
a550: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a560: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  f( z[i]=='\'' ){
a570: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a580: 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a  f(out,"&#39;");.
a590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a5a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a5b0: 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20    z += i + 1;.  
a5c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  }.}../*.** If a 
a5d0: 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61  field contains a
a5e0: 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64 65  ny character ide
a5f0: 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20 69  ntified by a 1 i
a600: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
a610: 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74  ** array, then t
a620: 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62  he string must b
a630: 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56  e quoted for CSV
a640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
a650: 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51 75  t char needCsvQu
a660: 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31  ote[] = {.  1, 1
a670: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a680: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a690: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a6a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a6b0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a6c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a6d0: 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20  ,.  1, 0, 1, 0, 
a6e0: 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c  0, 0, 0, 1,   0,
a6f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a700: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a710: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a720: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a730: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
a740: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a750: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a760: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a770: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a780: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
a790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a7a0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a7b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a7c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a7d0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a7e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a7f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a800: 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31   0, 0, 1,.  1, 1
a810: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a820: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a830: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a840: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a850: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a860: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a870: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a880: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a890: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a8a0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a8b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a8c0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a8d0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a8e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a8f0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a900: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a910: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a920: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a930: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a940: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a950: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a960: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a970: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a980: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a990: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a9a0: 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a   1, 1, 1,.};../*
a9b0: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e  .** Output a sin
a9c0: 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e  gle term of CSV.
a9d0: 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63    Actually, p->c
a9e0: 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20 75  olSeparator is u
a9f0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  sed for.** the s
aa00: 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20  eparator, which 
aa10: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
aa20: 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e  e a comma.  p->n
aa30: 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74  ullValue is.** t
aa40: 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20  he null value.  
aa50: 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74  Strings are quot
aa60: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ed if necessary.
aa70: 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72 0a    The separator.
aa80: 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65  ** is only issue
aa90: 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72 75  d if bSep is tru
aaa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
aab0: 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68 65  d output_csv(She
aac0: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
aad0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62  t char *z, int b
aae0: 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  Sep){.  FILE *ou
aaf0: 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66  t = p->out;.  if
ab00: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( z==0 ){.    ut
ab10: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  f8_printf(out,"%
ab20: 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  s",p->nullValue)
ab30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
ab40: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nt i;.    int nS
ab50: 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
ab60: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
ab70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
ab80: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
ab90: 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  f( needCsvQuote[
aba0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
abb0: 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20  )z)[i]].        
abc0: 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f   || (z[i]==p->co
abd0: 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26  lSeparator[0] &&
abe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
abf0: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
ac00: 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  (z, p->colSepara
ac10: 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20  tor, nSep)==0)) 
ac20: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30  ){.        i = 0
ac30: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ac40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ac50: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
ac60: 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74       char *zQuot
ac70: 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ed = sqlite3_mpr
ac80: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
ac90: 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
aca0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
acb0: 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20 20  zQuoted);.      
acc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
acd0: 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oted);.    }else
ace0: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
acf0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
ad00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
ad10: 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75  f( bSep ){.    u
ad20: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
ad30: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
ad40: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
ad50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ad60: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74  tine runs when t
ad70: 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73 20  he user presses 
ad80: 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63  Ctrl-C.*/.static
ad90: 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f   void interrupt_
ada0: 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55  handler(int NotU
adb0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
adc0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
add0: 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75  );.  seenInterru
ade0: 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e  pt++;.  if( seen
adf0: 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65 78  Interrupt>2 ) ex
ae00: 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f  it(1);.  if( glo
ae10: 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f  balDb ) sqlite3_
ae20: 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c  interrupt(global
ae30: 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66  Db);.}..#if (def
ae40: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
ae50: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20  defined(WIN32)) 
ae60: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  && !defined(_WIN
ae70: 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68  32_WCE)./*.** Th
ae80: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
ae90: 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e  for console even
aea0: 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29  ts (e.g. Ctrl-C)
aeb0: 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61   on Win32.*/.sta
aec0: 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  tic BOOL WINAPI 
aed0: 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c  ConsoleCtrlHandl
aee0: 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43 74  er(.  DWORD dwCt
aef0: 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66  rlType /* One of
af00: 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e   the CTRL_*_EVEN
af10: 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29  T constants */.)
af20: 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54 79  {.  if( dwCtrlTy
af30: 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54  pe==CTRL_C_EVENT
af40: 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75 70   ){.    interrup
af50: 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20  t_handler(0);.  
af60: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
af70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53   }.  return FALS
af80: 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E;.}.#endif..#if
af90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
afa0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
afb0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e  *.** When the ".
afc0: 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c  auth ON" is set,
afd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
afe0: 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61  uthorizer callba
aff0: 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ck is.** invoked
b000: 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
b010: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
b020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
b030: 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20  ellAuth(.  void 
b040: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  *pClientData,.  
b050: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
b060: 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e  char *zA1,.  con
b070: 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20  st char *zA2,.  
b080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c  const char *zA3,
b090: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b0a0: 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  A4.){.  ShellSta
b0b0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
b0c0: 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61  ate*)pClientData
b0d0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
b0e0: 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b   char *azAction[
b0f0: 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43  ] = { 0,.     "C
b100: 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20  REATE_INDEX",   
b110: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 41        "CREATE_TA
b120: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22 43  BLE",         "C
b130: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
b140: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
b150: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
b160: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  "CREATE_TEMP_TRI
b170: 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f  GGER",  "CREATE_
b180: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
b190: 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45 52   "CREATE_TRIGGER
b1a0: 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ",       "CREATE
b1b0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b1c0: 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20   "DELETE",.     
b1d0: 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20  "DROP_INDEX",   
b1e0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41          "DROP_TA
b1f0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  BLE",           
b200: 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  "DROP_TEMP_INDEX
b210: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45  ",.     "DROP_TE
b220: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  MP_TABLE",      
b230: 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  "DROP_TEMP_TRIGG
b240: 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45  ER",    "DROP_TE
b250: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
b260: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20  DROP_TRIGGER",  
b270: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45         "DROP_VIE
b280: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  W",            "
b290: 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50  INSERT",.     "P
b2a0: 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20  RAGMA",         
b2b0: 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20 20        "READ",   
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
b2d0: 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52  ELECT",.     "TR
b2e0: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20  ANSACTION",     
b2f0: 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20 20       "UPDATE",  
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 54               "AT
b310: 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54  TACH",.     "DET
b320: 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  ACH",           
b330: 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45      "ALTER_TABLE
b340: 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45 49  ",          "REI
b350: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41  NDEX",.     "ANA
b360: 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20  LYZE",          
b370: 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41 42      "CREATE_VTAB
b380: 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f  LE",        "DRO
b390: 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20  P_VTABLE",.     
b3a0: 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20  "FUNCTION",     
b3b0: 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f 49          "SAVEPOI
b3c0: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
b3d0: 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b  "RECURSIVE".  };
b3e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
b3f0: 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20  t char *az[4];. 
b400: 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20   az[0] = zA1;.  
b410: 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61  az[1] = zA2;.  a
b420: 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a  z[2] = zA3;.  az
b430: 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66  [3] = zA4;.  utf
b440: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b450: 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73   "authorizer: %s
b460: 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29  ", azAction[op])
b470: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34  ;.  for(i=0; i<4
b480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f  ; i++){.    raw_
b490: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b4a0: 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b   ");.    if( az[
b4b0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i] ){.      outp
b4c0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
b4d0: 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ut, az[i]);.    
b4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
b4f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b500: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
b510: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
b520: 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
b530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b540: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
b550: 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d  ** Print a schem
b560: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61  a statement.  Pa
b570: 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20  rt of MODE_Semi 
b580: 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20  and MODE_Pretty 
b590: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
b5a0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65  is routine conve
b5b0: 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20  rts some CREATE 
b5c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
b5d0: 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c   for shadow tabl
b5e0: 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f  es.** in FTS3/4/
b5f0: 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41  5 into CREATE TA
b600: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
b610: 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  S statements..*/
b620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
b630: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c  ntSchemaLine(FIL
b640: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
b650: 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61  ar *z, const cha
b660: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28  r *zTail){.  if(
b670: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
b680: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5b  ("CREATE TABLE [
b690: 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  '\"]*", z)==0 ){
b6a0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
b6b0: 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54 41  (out, "CREATE TA
b6c0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
b6d0: 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20 7a  S %s%s", z+13, z
b6e0: 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tail);.  }else{.
b6f0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b700: 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c 20  out, "%s%s", z, 
b710: 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74  zTail);.  }.}.st
b720: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
b730: 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45 20  chemaLineN(FILE 
b740: 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20 69  *out, char *z, i
b750: 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt n, const char
b760: 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61 72   *zTail){.  char
b770: 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e   c = z[n];.  z[n
b780: 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53 63  ] = 0;.  printSc
b790: 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c  hemaLine(out, z,
b7a0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20   zTail);.  z[n] 
b7b0: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = c;.}../*.** Re
b7c0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74 72  turn true if str
b7d0: 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74 68  ing z[] has noth
b7e0: 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70 61  ing but whitespa
b7f0: 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  ce and comments 
b800: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
b810: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 2e   the first line.
b820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b830: 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68 61  sToEol(const cha
b840: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
b850: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
b860: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
b870: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74 75  [i]=='\n' ) retu
b880: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49 73  rn 1;.    if( Is
b890: 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63 6f  Space(z[i]) ) co
b8a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
b8b0: 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 69  z[i]=='-' && z[i
b8c0: 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72  +1]=='-' ) retur
b8d0: 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 1;.    return 
b8e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b8f0: 31 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  1;.}.    ../*.**
b900: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
b910: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
b920: 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20  at the shell.** 
b930: 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68  invokes for each
b940: 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20   row of a query 
b950: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
b960: 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c  c int shell_call
b970: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
b980: 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20  rg,.  int nArg, 
b990: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b9a0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
b9b0: 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ns */.  char **a
b9c0: 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78 74  zArg,    /* Text
b9d0: 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74 20   of each result 
b9e0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
b9f0: 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20   **azCol,    /* 
ba00: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  Column names */.
ba10: 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20 20    int *aiType   
ba20: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70     /* Column typ
ba30: 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
ba40: 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
ba50: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
ba60: 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61 7a  )pArg;..  if( az
ba70: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
ba80: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  0;.  switch( p->
ba90: 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73  cMode ){.    cas
baa0: 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20  e MODE_Line: {. 
bab0: 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a       int w = 5;.
bac0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
bad0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
bae0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
baf0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
bb00: 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
bb10: 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  n30(azCol[i] ? a
bb20: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
bb30: 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 77         if( len>w
bb40: 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20   ) w = len;.    
bb50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
bb60: 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38 5f  >cnt++>0 ) utf8_
bb70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
bb80: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
bb90: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f 72  ator);.      for
bba0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
bbb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  +){.        utf8
bbc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
bbd0: 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c 20  %*s = %s%s", w, 
bbe0: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
bbf0: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
bc00: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
bc10: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70 2d  p->nullValue, p-
bc20: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
bc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
bc40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bc50: 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ase MODE_Explain
bc60: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
bc70: 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20  Column: {.      
bc80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
bc90: 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 5b   aExplainWidths[
bca0: 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20 34  ] = {4, 13, 4, 4
bcb0: 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d 3b  , 4, 13, 2, 13};
bcc0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
bcd0: 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20   *colWidth;.    
bce0: 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a 20    int showHdr;. 
bcf0: 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53 65       char *rowSe
bd00: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  p;.      if( p->
bd10: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75  cMode==MODE_Colu
bd20: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mn ){.        co
bd30: 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c 57  lWidth = p->colW
bd40: 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73 68  idth;.        sh
bd50: 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77 48  owHdr = p->showH
bd60: 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 72  eader;.        r
bd70: 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65  owSep = p->rowSe
bd80: 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 7d  parator;.      }
bd90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
bda0: 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61 69  lWidth = aExplai
bdb0: 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20 20  nWidths;.       
bdc0: 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20 20   showHdr = 1;.  
bdd0: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 53        rowSep = S
bde0: 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a  EP_Row;.      }.
bdf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
be00: 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ++==0 ){.       
be10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
be20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
be30: 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20    int w, n;.    
be40: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
be50: 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
be60: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
be70: 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b 69    w = colWidth[i
be80: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ];.          }el
be90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bea0: 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  w = 0;.         
beb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
bec0: 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   w==0 ){.       
bed0: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
bee0: 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  har(azCol[i] ? a
bef0: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
bf00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
bf10: 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20 20  <10 ) w = 10;.  
bf20: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74            n = st
bf30: 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20 26  rlenChar(azArg &
bf40: 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  & azArg[i] ? azA
bf50: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
bf60: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  alue);.         
bf70: 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d     if( w<n ) w =
bf80: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   n;.          }.
bf90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
bfa0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
bfb0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
bfc0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75           p->actu
bfd0: 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a  alWidth[i] = w;.
bfe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bff0: 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64        if( showHd
c000: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
c010: 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e   utf8_width_prin
c020: 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43  t(p->out, w, azC
c030: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
c040: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c050: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
c060: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
c070: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
c080: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c090: 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77          if( show
c0a0: 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Hdr ){.         
c0b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c0c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c0d0: 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20      int w;.     
c0e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
c0f0: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
c100: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
c110: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
c120: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c140: 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b  f( w<0 ) w = -w;
c150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
c160: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
c170: 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20     w = 10;.     
c180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c190: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c1a0: 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25  (p->out,"%-*.*s%
c1b0: 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20  s",w,w,.        
c1c0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
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 22 0a 20 20 20 20 20 20 20 20  ------".        
c210: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c250: 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20  ------",.       
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d               i==
c270: 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20  nArg-1 ? rowSep 
c280: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20  : "  ");.       
c290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
c2a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c2b0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
c2c0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
c2d0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c2e0: 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20          int w;. 
c2f0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
c300: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
c310: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
c320: 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75       w = p->actu
c330: 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  alWidth[i];.    
c340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c350: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
c360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c370: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
c380: 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a  DE_Explain && az
c390: 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e  Arg[i] && strlen
c3a0: 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e 77  Char(azArg[i])>w
c3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 20   ){.          w 
c3c0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  = strlenChar(azA
c3d0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
c3e0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
c3f0: 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e  =1 && p->aiInden
c400: 74 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  t && p->pStmt ){
c410: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
c420: 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e  ->iIndent<p->nIn
c430: 64 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dent ){.        
c440: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c450: 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c 20  p->out, "%*.s", 
c460: 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e 69  p->aiIndent[p->i
c470: 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20 20  Indent], "");.  
c480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c490: 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b      p->iIndent++
c4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c4b0: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
c4c0: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
c4d0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
c4e0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
c4f0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ue);.        utf
c500: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c510: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
c520: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
c530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c550: 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69    case MODE_Semi
c560: 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d 61  : {   /* .schema
c570: 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61   and .fullschema
c580: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20   output */.     
c590: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
c5a0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 30  (p->out, azArg[0
c5b0: 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  ], ";\n");.     
c5c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c5d0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65 74    case MODE_Pret
c5e0: 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65 6d  ty: {  /* .schem
c5f0: 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d  a and .fullschem
c600: 61 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74 20  a with --indent 
c610: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
c620: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
c630: 20 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 20       int nParen 
c640: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
c650: 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  cEnd = 0;.      
c660: 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69 6e  char c;.      in
c670: 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 20  t nLine = 0;.   
c680: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
c690: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
c6a0: 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62 72  azArg[0]==0 ) br
c6b0: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eak;.      if( s
c6c0: 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
c6d0: 43 52 45 41 54 45 20 56 49 45 57 25 22 2c 20 61  CREATE VIEW%", a
c6e0: 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20  zArg[0], 0)==0. 
c6f0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
c700: 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45  _strlike("CREATE
c710: 20 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b 30   TRIG%", azArg[0
c720: 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 29  ], 0)==0.      )
c730: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
c740: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c750: 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  s;\n", azArg[0])
c760: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
c780: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
c790: 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 30  tf("%s", azArg[0
c7a0: 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ]);.      j = 0;
c7b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c7c0: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  IsSpace(z[i]); i
c7d0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72 28  ++){}.      for(
c7e0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
c7f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
c800: 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b  f( IsSpace(c) ){
c810: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
c820: 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b  [j-1]=='\r' ) z[
c830: 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  j-1] = '\n';.   
c840: 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61         if( IsSpa
c850: 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b  ce(z[j-1]) || z[
c860: 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74  j-1]=='(' ) cont
c870: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  inue;.        }e
c880: 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27 20  lse if( (c=='(' 
c890: 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e  || c==')') && j>
c8a0: 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a  0 && IsSpace(z[j
c8b0: 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
c8c0: 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d    j--;.        }
c8d0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
c8e0: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
c8f0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
c900: 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   IsSpace(z[j-1])
c910: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
c920: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
c930: 20 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a 29   if( strlen30(z)
c940: 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20 20  >=79 ){.        
c950: 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20  for(i=j=0; (c = 
c960: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 20  z[i])!=0; i++){ 
c970: 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e 67 65 73   /* Copy changes
c980: 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b 20   from z[i] back 
c990: 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20 20 20  to z[j] */.     
c9a0: 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45 6e 64       if( c==cEnd
c9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c9c0: 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  cEnd = 0;.      
c9d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
c9e0: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27 27 20  ='"' || c=='\'' 
c9f0: 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20 20 20  || c=='`' ){.   
ca00: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
ca10: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  c;.          }el
ca20: 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
ca30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
ca40: 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20 20  d = ']';.       
ca50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
ca60: 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27  '-' && z[i+1]=='
ca70: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
ca80: 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b 0a 20    cEnd = '\n';. 
ca90: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
caa0: 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20  f( c=='(' ){.   
cab0: 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2b           nParen+
cac0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
cad0: 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20 29 7b  se if( c==')' ){
cae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61  .            nPa
caf0: 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  ren--;.         
cb00: 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20 26     if( nLine>0 &
cb10: 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20 6a  & nParen==0 && j
cb20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
cb30: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
cb40: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
cb50: 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  j, "\n");.      
cb60: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
cb70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
cb80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cb90: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
cba0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61           if( nPa
cbb0: 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64 3d 3d  ren==1 && cEnd==
cbc0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
cbd0: 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 5c  (c=='(' || c=='\
cbe0: 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20 26 26  n' || (c==',' &&
cbf0: 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b 31 29   !wsToEol(z+i+1)
cc00: 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
cc20: 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a 20  c=='\n' ) j--;. 
cc30: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
cc40: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f  SchemaLineN(p->o
cc50: 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20 22  ut, z, j, "\n  "
cc60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
cc70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
cc80: 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20    nLine++;.     
cc90: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73         while( Is
cca0: 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20 29 7b  Space(z[i+1]) ){
ccb0: 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   i++; }.        
ccc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ccd0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
cce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
ccf0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
cd00: 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29 3b  >out, z, ";\n");
cd10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
cd20: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 62 72  ree(z);.      br
cd30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cd40: 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b  ase MODE_List: {
cd50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
cd60: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
cd70: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
cd80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
cd90: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
cda0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
cdb0: 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61 7a  p->out,"%s%s",az
cdc0: 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Col[i],.        
cdd0: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
cde0: 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65 70 61  g-1 ? p->rowSepa
cdf0: 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53 65  rator : p->colSe
ce00: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
ce10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ce20: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
ce30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
ce40: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ce50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
ce60: 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
ce70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
ce80: 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 56  0 ) z = p->nullV
ce90: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 75 74  alue;.        ut
cea0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ceb0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
cec0: 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31      if( i<nArg-1
ced0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
cee0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
cef0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
cf00: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
cf10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
cf30: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
cf40: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
cf50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cf60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cf80: 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20  E_Html: {.      
cf90: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
cfa0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
cfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
cfc0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
cfd0: 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66  TR>");.        f
cfe0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
cff0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d000: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
d010: 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20  t,"<TH>");.     
d020: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
d030: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
d040: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
d050: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d060: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22  p->out,"</TH>\n"
d070: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d080: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d090: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
d0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d0b0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
d0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 61 77  break;.      raw
d0d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d0e0: 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f  <TR>");.      fo
d0f0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d100: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ++){.        raw
d110: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d120: 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TD>");.        
d130: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
d140: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
d150: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d160: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d170: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
d180: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e  tf(p->out,"</TD>
d190: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
d1a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
d1b0: 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29  ->out,"</TR>\n")
d1c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d1d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d1e0: 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20  DE_Tcl: {.      
d1f0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
d200: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
d210: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d220: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
d240: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
d250: 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  out,azCol[i] ? a
d260: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
d270: 20 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41           if(i<nA
d280: 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74  rg-1) utf8_print
d290: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d2a0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
d2b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d2c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d2d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
d2e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
d2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d300: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
d310: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
d320: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d330: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
d340: 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
d350: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
d360: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
d370: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lue);.        if
d380: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
d390: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
d3a0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
d3b0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
d3c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d3d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d3e0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
d3f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d400: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
d410: 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 73  E_Csv: {.      s
d420: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e  etBinaryMode(p->
d430: 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  out, 1);.      i
d440: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
d450: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
d460: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
d470: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
d480: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
d490: 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b  ut_csv(p, azCol[
d4a0: 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20  i] ? azCol[i] : 
d4b0: 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20  "", i<nArg-1);. 
d4c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d4d0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d4e0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
d4f0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
d500: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
d510: 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg>0 ){.       
d520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d530: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d540: 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20    output_csv(p, 
d550: 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67  azArg[i], i<nArg
d560: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
d570: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d580: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
d590: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d5a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d5b0: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e   setTextMode(p->
d5c0: 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  out, 1);.      b
d5d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d5e0: 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74  case MODE_Insert
d5f0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  : {.      if( az
d600: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
d610: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d620: 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54  f(p->out,"INSERT
d630: 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a 44 65   INTO %s",p->zDe
d640: 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  stTable);.      
d650: 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  if( p->showHeade
d660: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  r ){.        raw
d670: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d680: 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  (");.        for
d690: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
d6a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
d6b0: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
d6c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 71  .          if( q
d6e0: 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
d6f0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
d700: 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
d710: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
d720: 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  w\"", azCol[i]);
d730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d740: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d750: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
d760: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
d770: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
d780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d790: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d7a0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a  p->out, "%s", az
d7b0: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
d7c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d7d0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
d7e0: 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a 20  f(p->out,")");. 
d7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
d800: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  cnt++;.      for
d810: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
d820: 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  +){.        raw_
d830: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 69  printf(p->out, i
d840: 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56 41 4c  >0 ? "," : " VAL
d850: 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20 20 20  UES(");.        
d860: 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30  if( (azArg[i]==0
d870: 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20  ) || (aiType && 
d880: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
d890: 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
d8a0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d8b0: 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b  (p->out,"NULL");
d8c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
d8d0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
d8e0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54  ype[i]==SQLITE_T
d8f0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
d900: 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61   if( ShellHasFla
d910: 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
d920: 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nes) ){.        
d930: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
d940: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
d950: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
d960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d970: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
d980: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
d990: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
d9a0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
d9b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
d9c0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
d9d0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
d9e0: 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
d9f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
da00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
da10: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
da20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
da30: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
da40: 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  ]==SQLITE_FLOAT 
da50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
da60: 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20  r z[50];.       
da70: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
da80: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
da90: 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  ble(p->pStmt, i)
daa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dab0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c  te3_snprintf(50,
dac0: 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a  z,"%!.20g", r);.
dad0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
dae0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
daf0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", z);.        }
db00: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
db10: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
db20: 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e  LITE_BLOB && p->
db30: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
db40: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70     const void *p
db50: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
db60: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53  olumn_blob(p->pS
db70: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
db80: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
db90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
dba0: 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  tes(p->pStmt, i)
dbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
dbc0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f  ut_hex_blob(p->o
dbd0: 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ut, pBlob, nBlob
dbe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
dbf0: 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a   if( isNumber(az
dc00: 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20  Arg[i], 0) ){.  
dc10: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
dc20: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
dc30: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
dc40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 68      }else if( Sh
dc50: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
dc60: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
dc70: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
dc80: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
dc90: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
dca0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
dcb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
dcc0: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
dcd0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
dce0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
dcf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dd00: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dd10: 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20  ->out,");\n");. 
dd20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd30: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
dd40: 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20 69  Quote: {.      i
dd50: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
dd60: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
dd70: 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73  ->cnt==0 && p->s
dd80: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
dd90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dda0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
ddb0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ddc0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ddd0: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
dde0: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
ddf0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
de00: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
de10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
de20: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
de30: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
de40: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
de50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
de60: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
de70: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
de80: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
de90: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ",");.        if
dea0: 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20  ( (azArg[i]==0) 
deb0: 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69  || (aiType && ai
dec0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ded0: 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
dee0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
def0: 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  ->out,"NULL");. 
df00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
df10: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
df20: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58  e[i]==SQLITE_TEX
df30: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  T ){.          o
df40: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
df50: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
df60: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
df70: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
df80: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
df90: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
dfa0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
dfb0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
dfc0: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
dfd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dfe0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
dff0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  [i]==SQLITE_FLOA
e000: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
e010: 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20  har z[50];.     
e020: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
e030: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
e040: 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20  ouble(p->pStmt, 
e050: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  i);.          sq
e060: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
e070: 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29  0,z,"%!.20g", r)
e080: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
e090: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e0a0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
e0b0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
e0c0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e0d0: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
e0e0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
e0f0: 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
e100: 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *pBlob = sqlite3
e110: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e  _column_blob(p->
e120: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
e130: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
e140: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e150: 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20  bytes(p->pStmt, 
e160: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  i);.          ou
e170: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d  tput_hex_blob(p-
e180: 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  >out, pBlob, nBl
e190: 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ob);.        }el
e1a0: 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28  se if( isNumber(
e1b0: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a  azArg[i], 0) ){.
e1c0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
e1d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
e1e0: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
e1f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e200: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
e210: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
e220: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
e230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e240: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
e250: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
e260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e270: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e280: 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20 20  _Ascii: {.      
e290: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e2a0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e2c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e2e0: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
e2f0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e300: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  );.          utf
e320: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e330: 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  "%s",azCol[i] ? 
e340: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
e350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e360: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e370: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e380: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e390: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e3a0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
e3b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
e3c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e3d0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
e3e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e3f0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
e400: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e410: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e420: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41  (p->out,"%s",azA
e430: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
e440: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
e450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e460: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e470: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e480: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e4a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e4b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e4c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
e4d0: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51  tine that the SQ
e4e0: 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20  Lite library.** 
e4f0: 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68  invokes for each
e500: 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20   row of a query 
e510: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
e520: 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76  c int callback(v
e530: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
e540: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
e550: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29  g, char **azCol)
e560: 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20  {.  /* since we 
e570: 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20  don't have type 
e580: 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73  info, call the s
e590: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69  hell_callback wi
e5a0: 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  th a NULL value 
e5b0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c  */.  return shel
e5c0: 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
e5d0: 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a   nArg, azArg, az
e5e0: 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f  Col, NULL);.}../
e5f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
e600: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
e610: 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  e from sqlite3_e
e620: 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e  xec() that appen
e630: 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74  ds all.** output
e640: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e650: 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a   a ShellText obj
e660: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
e670: 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74  nt captureOutput
e680: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
e690: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
e6a0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
e6b0: 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c  r **az){.  Shell
e6c0: 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c  Text *p = (Shell
e6d0: 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e  Text*)pArg;.  in
e6e0: 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  t i;.  UNUSED_PA
e6f0: 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69  RAMETER(az);.  i
e700: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
e710: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
e720: 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  >n ) appendText(
e730: 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f  p, "|", 0);.  fo
e740: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e750: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29  ++){.    if( i )
e760: 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22   appendText(p, "
e770: 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ,", 0);.    if( 
e780: 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e  azArg[i] ) appen
e790: 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69  dText(p, azArg[i
e7a0: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ], 0);.  }.  ret
e7b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e7c0: 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72  Generate an appr
e7d0: 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54  opriate SELFTEST
e7e0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
e7f0: 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  in database..*/.
e800: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
e810: 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28  teSelftestTable(
e820: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
e830: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
e840: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  = 0;.  sqlite3_e
e850: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22  xec(p->db,.    "
e860: 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65  SAVEPOINT selfte
e870: 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20  st_init;\n".    
e880: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
e890: 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66   NOT EXISTS self
e8a0: 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20  test(\n".    "  
e8b0: 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  tno INTEGER PRIM
e8c0: 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a  ARY KEY,\n"   /*
e8d0: 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a   Test number */.
e8e0: 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c      "  op TEXT,\
e8f0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
e900: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
e910: 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20  :  memo run */. 
e920: 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c     "  cmd TEXT,\
e930: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
e940: 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74      /* Command t
e950: 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e  ext */.    "  an
e960: 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20  s TEXT\n"       
e970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e980: 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f  esired answer */
e990: 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43  .    ");".    "C
e9a0: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
e9b0: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f   [_shell$self](o
e9c0: 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20  p,cmd,ans);\n". 
e9d0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
e9e0: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f  [_shell$self](ro
e9f0: 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20  wid,op,cmd)\n". 
ea00: 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61     "  VALUES(coa
ea10: 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d  lesce((SELECT (m
ea20: 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20  ax(tno)+100)/10 
ea30: 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31  FROM selftest),1
ea40: 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  0),\n".    "    
ea50: 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73       'memo','Tes
ea60: 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ts generated by 
ea70: 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20  --init');\n".   
ea80: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
ea90: 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20  shell$self]\n". 
eaa0: 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75     "  SELECT 'ru
eab0: 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  n',\n".    "    
eac0: 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33  'SELECT hex(sha3
ead0: 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20  _query(''SELECT 
eae0: 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
eaf0: 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20  me,sql ".       
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
eb20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
eb30: 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29  DER BY 2'',224))
eb40: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68  ',\n".    "    h
eb50: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53  ex(sha3_query('S
eb60: 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c  ELECT type,name,
eb70: 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20  tbl_name,sql ". 
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
eba0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
ebb0: 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c  ER BY 2',224));\
ebc0: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
ebd0: 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  NTO [_shell$self
ebe0: 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ]\n".    "  SELE
ebf0: 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22  CT 'run',".    "
ec00: 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28      'SELECT hex(
ec10: 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c  sha3_query(''SEL
ec20: 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c  ECT * FROM \"' |
ec30: 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
ec40: 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65  printf('%w',name
ec50: 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44  ) || '\" NOT IND
ec60: 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e  EXED'',224))',\n
ec70: 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73  ".    "    hex(s
ec80: 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66  ha3_query(printf
ec90: 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ('SELECT * FROM 
eca0: 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58  \"%w\" NOT INDEX
ecb0: 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c  ED',name),224))\
ecc0: 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28  n".    "  FROM (
ecd0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c  \n".    "    SEL
ece0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
ecf0: 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20  lite_master\n". 
ed00: 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74     "     WHERE t
ed10: 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20  ype='table'\n". 
ed20: 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e     "       AND n
ed30: 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c  ame<>'selftest'\
ed40: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41  n".    "       A
ed50: 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74  ND coalesce(root
ed60: 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20  page,0)>0\n".   
ed70: 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f   "  )\n".    " O
ed80: 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22  RDER BY name;\n"
ed90: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
eda0: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
edb0: 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53  n".    "  VALUES
edc0: 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69  ('run','PRAGMA i
edd0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c  ntegrity_check',
ede0: 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  'ok');\n".    "I
edf0: 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74  NSERT INTO selft
ee00: 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  est(tno,op,cmd,a
ee10: 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ns)".    "  SELE
ee20: 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63  CT rowid*10,op,c
ee30: 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68  md,ans FROM [_sh
ee40: 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20  ell$self];\n".  
ee50: 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f    "DROP TABLE [_
ee60: 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20  shell$self];".  
ee70: 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29    ,0,0,&zErrMsg)
ee80: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
ee90: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
eea0: 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46  tf(stderr, "SELF
eeb0: 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74  TEST initializat
eec0: 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c  ion failure: %s\
eed0: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
eee0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
eef0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73  ErrMsg);.  }.  s
ef00: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
ef10: 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66  b, "RELEASE self
ef20: 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30  test_init",0,0,0
ef30: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  );.}.../*.** Set
ef40: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
ef50: 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20   table field of 
ef60: 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73  the ShellState s
ef70: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74  tructure to.** t
ef80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
ef90: 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63  able given.  Esc
efa0: 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68  ape any quote ch
efb0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a  aracters in the.
efc0: 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a  ** table name..*
efd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
efe0: 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65  t_table_name(She
eff0: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
f000: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
f010: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68    int i, n;.  ch
f020: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
f030: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  r *z;..  if( p->
f040: 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20  zDestTable ){.  
f050: 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54    free(p->zDestT
f060: 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44  able);.    p->zD
f070: 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  estTable = 0;.  
f080: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  }.  if( zName==0
f090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75   ) return;.  cQu
f0a0: 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28  ote = quoteChar(
f0b0: 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74  zName);.  n = st
f0c0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
f0d0: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20   if( cQuote ) n 
f0e0: 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d  += n+2;.  z = p-
f0f0: 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61  >zDestTable = ma
f100: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69  lloc( n+1 );.  i
f110: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( z==0 ){.    r
f120: 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
f130: 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20  ,"Error: out of 
f140: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
f150: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e  exit(1);.  }.  n
f160: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f   = 0;.  if( cQuo
f170: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
f180: 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  uote;.  for(i=0;
f190: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
f1a0: 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e  .    z[n++] = zN
f1b0: 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ame[i];.    if( 
f1c0: 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65  zName[i]==cQuote
f1d0: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f   ) z[n++] = cQuo
f1e0: 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51  te;.  }.  if( cQ
f1f0: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
f200: 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d  cQuote;.  z[n] =
f210: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78   0;.}.../*.** Ex
f220: 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74  ecute a query st
f230: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
f240: 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f  l generate SQL o
f250: 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a  utput.  Print.**
f260: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
f270: 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72  mns, comma-separ
f280: 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20  ated, on a line 
f290: 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a  and then add a.*
f2a0: 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d  * semicolon term
f2b0: 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e  inator to the en
f2c0: 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a  d of that line..
f2d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
f2e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
f2f0: 73 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s 1 and that col
f300: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78  umn contains tex
f310: 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77  t "--".** then w
f320: 72 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c  rite the semicol
f330: 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65  on on a separate
f340: 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79   line.  That way
f350: 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63  , if a.** "--" c
f360: 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74  omment occurs at
f370: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f380: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63  statement, the c
f390: 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20  omment.** won't 
f3a0: 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69  consume the semi
f3b0: 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72  colon terminator
f3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f3d0: 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
f3e0: 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61  uery(.  ShellSta
f3f0: 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
f400: 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78   /* Query contex
f410: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
f420: 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20  r *zSelect,     
f430: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
f440: 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63  ent to extract c
f450: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontent */.  cons
f460: 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f  t char *zFirstRo
f470: 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65  w    /* Print be
f480: 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20  fore first row, 
f490: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
f4a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f4b0: 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74   *pSelect;.  int
f4c0: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75   rc;.  int nResu
f4d0: 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  lt;.  int i;.  c
f4e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
f4f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
f500: 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
f510: 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65  Select, -1, &pSe
f520: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
f530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
f540: 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20   !pSelect ){.   
f550: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f560: 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f  out, "/**** ERRO
f570: 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a  R: (%d) %s *****
f580: 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20  /\n", rc,.      
f590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f5a0: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
f5b0: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
f5c0: 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)!=SQLITE_CORR
f5d0: 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b  UPT ) p->nErr++;
f5e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
f5f0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f600: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
f610: 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  ;.  nResult = sq
f620: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
f630: 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77  nt(pSelect);.  w
f640: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f650: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
f660: 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20  zFirstRow ){.   
f670: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f680: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69  ->out, "%s", zFi
f690: 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a  rstRow);.      z
f6a0: 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20  FirstRow = 0;.  
f6b0: 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e    }.    z = (con
f6c0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
f6d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
f6e0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74  lect, 0);.    ut
f6f0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f700: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
f710: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75  for(i=1; i<nResu
f720: 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
f730: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f740: 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74  ut, ",%s", sqlit
f750: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
f760: 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20  Select, i));.   
f770: 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20   }.    if( z==0 
f780: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68  ) z = "";.    wh
f790: 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b  ile( z[0] && (z[
f7a0: 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21  0]!='-' || z[1]!
f7b0: 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  ='-') ) z++;.   
f7c0: 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20   if( z[0] ){.   
f7d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
f7e0: 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a  >out, "\n;\n");.
f7f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f800: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f810: 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut, ";\n");.    
f820: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
f830: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
f840: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f850: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
f860: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63  elect);.  if( rc
f870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f880: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f890: 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
f8a0: 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
f8b0: 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20  **/\n", rc,.    
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f8d0: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
f8e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
f8f0: 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
f900: 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
f910: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
f920: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
f930: 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20  ocate space and 
f940: 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74  save off current
f950: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a   error string..*
f960: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
f970: 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73  ave_err_msg(.  s
f980: 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20  qlite3 *db      
f990: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
f9a0: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b  e to query */.){
f9b0: 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d  .  int nErrMsg =
f9c0: 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69   1+strlen30(sqli
f9d0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
f9e0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
f9f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
fa00: 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20  c64(nErrMsg);.  
fa10: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
fa20: 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73     memcpy(zErrMs
fa30: 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  g, sqlite3_errms
fa40: 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b  g(db), nErrMsg);
fa50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
fa60: 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66  rrMsg;.}..#ifdef
fa70: 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a   __linux__./*.**
fa80: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70   Attempt to disp
fa90: 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e  lay I/O stats on
faa0: 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72   Linux using /pr
fab0: 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61  oc/PID/io.*/.sta
fac0: 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
fad0: 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c  LinuxIoStats(FIL
fae0: 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20  E *out){.  FILE 
faf0: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30  *in;.  char z[20
fb00: 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0];.  sqlite3_sn
fb10: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
fb20: 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69  , z, "/proc/%d/i
fb30: 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  o", getpid());. 
fb40: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22   in = fopen(z, "
fb50: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
fb60: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
fb70: 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69  ile( fgets(z, si
fb80: 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20  zeof(z), in)!=0 
fb90: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
fba0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
fbb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fbc0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63  Pattern;.      c
fbd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63  onst char *zDesc
fbe0: 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d  ;.    } aTrans[]
fbf0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63   = {.      { "rc
fc00: 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
fc10: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
fc20: 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64  received by read
fc30: 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ():" },.      { 
fc40: 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "wchar: ",      
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
fc60: 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65  es sent to write
fc70: 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20  ():"    },.     
fc80: 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20   { "syscr: ",   
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fca0: 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61  Read() system ca
fcb0: 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20  lls:"      },.  
fcc0: 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c      { "syscw: ",
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65    "Write() syste
fcf0: 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c  m calls:"     },
fd00: 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62  .      { "read_b
fd10: 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20  ytes: ",        
fd20: 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64       "Bytes read
fd30: 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20   from storage:" 
fd40: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69   },.      { "wri
fd50: 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20  te_bytes: ",    
fd60: 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77          "Bytes w
fd70: 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67  ritten to storag
fd80: 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  e:" },.      { "
fd90: 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f  cancelled_write_
fda0: 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63  bytes: ",  "Canc
fdb0: 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65  elled write byte
fdc0: 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b  s:"    },.    };
fdd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fde0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
fdf0: 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b  Size(aTrans); i+
fe00: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
fe10: 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e  = strlen30(aTran
fe20: 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a  s[i].zPattern);.
fe30: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
fe40: 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  p(aTrans[i].zPat
fe50: 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29  tern, z, n)==0 )
fe60: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
fe70: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
fe80: 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d  s %s", aTrans[i]
fe90: 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a  .zDesc, &z[n]);.
fea0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
feb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fec0: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d  .  fclose(in);.}
fed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
fee0: 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20  isplay a single 
fef0: 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75  line of status u
ff00: 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75  sing 64-bit valu
ff10: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
ff20: 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  id displayStatLi
ff30: 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ne(.  ShellState
ff40: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ff50: 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e  /* The shell con
ff60: 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  text */.  char *
ff70: 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20  zLabel,         
ff80: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
ff90: 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a   this one line *
ffa0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  /.  char *zForma
ffb0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
ffc0: 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   Format for the 
ffd0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20  result */.  int 
ffe0: 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20  iStatusCtrl,    
fff0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
10000 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79  tatus to display
10010 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74   */.  int bReset
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
10040 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
10050 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10060 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
10070 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77  lite3_int64 iHiw
10080 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  tr = -1;.  int i
10090 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68  , nPercent;.  ch
100a0 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20  ar zLine[200];. 
100b0 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36   sqlite3_status6
100c0 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26  4(iStatusCtrl, &
100d0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
100e0 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d  Reset);.  for(i=
100f0 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a  0, nPercent=0; z
10100 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b  Format[i]; i++){
10110 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74  .    if( zFormat
10120 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63  [i]=='%' ) nPerc
10130 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  ent++;.  }.  if(
10140 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20   nPercent>1 ){. 
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 43 75 72 2c 20 69 48 69 77 74 72 29  t, iCur, iHiwtr)
10190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
101a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
101b0 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
101c0 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
101d0 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61  Hiwtr);.  }.  ra
101e0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
101f0 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
10200 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d  Label, zLine);.}
10210 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
10220 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f  memory stats..*/
10230 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
10240 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c  lay_stats(.  sql
10250 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10260 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10270 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10280 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
10290 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Arg,           /
102a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
102b0 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llState */.  int
102c0 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
102d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
102e0 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
102f0 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ats */.){.  int 
10300 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77  iCur;.  int iHiw
10310 74 72 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 20  tr;..  if( pArg 
10320 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 29 7b 0a  && pArg->out ){.
10330 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
10340 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72  ine(pArg, "Memor
10350 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20  y Used:",.      
10360 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
10370 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
10380 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
10390 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
103a0 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
103b0 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
103c0 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41  of Outstanding A
103d0 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20  llocations:",.  
103e0 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
103f0 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
10400 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
10410 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  NT, bReset);.   
10420 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c   if( pArg->shell
10430 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61 67  Flgs & SHFLG_Pag
10440 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20  ecache ){.      
10450 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
10460 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
10470 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73   Pcache Pages Us
10480 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 22  ed:",.         "
10490 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
104a0 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  pages", SQLITE_S
104b0 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
104c0 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
104d0 20 20 20 7d 0a 20 20 20 20 64 69 73 70 6c 61 79     }.    display
104e0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
104f0 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
10500 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
10510 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
10520 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
10530 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
10540 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46  _PAGECACHE_OVERF
10550 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  LOW, bReset);.  
10560 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
10570 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74  e(pArg, "Largest
10580 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20   Allocation:",. 
10590 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65        "%lld byte
105a0 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
105b0 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62  S_MALLOC_SIZE, b
105c0 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
105d0 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
105e0 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61 63 68  , "Largest Pcach
105f0 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a  e Allocation:",.
10600 20 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74         "%lld byt
10610 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
10620 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a  US_PAGECACHE_SIZ
10630 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64  E, bReset);.#ifd
10640 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ef YYTRACKMAXSTA
10650 43 4b 44 45 50 54 48 0a 20 20 20 20 64 69 73 70  CKDEPTH.    disp
10660 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
10670 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65  , "Deepest Parse
10680 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20  r Stack:",.     
10690 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
106a0 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
106b0 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c  US_PARSER_STACK,
106c0 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66   bReset);.#endif
106d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67  .  }..  if( pArg
106e0 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 26 26   && pArg->out &&
106f0 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 70   db ){.    if( p
10700 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
10710 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65   SHFLG_Lookaside
10720 20 29 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72   ){.      iHiwtr
10730 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
10740 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
10750 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
10760 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
10770 49 44 45 5f 55 53 45 44 2c 0a 20 20 20 20 20 20  IDE_USED,.      
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10790 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
107a0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
107b0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
107c0 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  ->out,.         
107d0 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69 64 65 20       "Lookaside 
107e0 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20  Slots Used:     
107f0 20 20 20 20 20 20 20 20 20 20 20 25 64 20 28 6d             %d (m
10800 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  ax %d)\n",.     
10810 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69           iCur, i
10820 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
10830 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
10840 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
10850 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49  TUS_LOOKASIDE_HI
10860 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
10870 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
10880 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
10890 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
108a0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
108b0 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b  "Successful look
108c0 61 73 69 64 65 20 61 74 74 65 6d 70 74 73 3a 20  aside attempts: 
108d0 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
108e0 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
108f0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
10900 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
10910 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
10920 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53  LOOKASIDE_MISS_S
10930 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
10950 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
10960 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
10970 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
10980 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69  , "Lookaside fai
10990 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a  lures due to siz
109a0 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  e:      %d\n",. 
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
109c0 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
109d0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
109e0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
109f0 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
10a00 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20  _FULL,.         
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
10a20 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
10a30 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
10a40 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10a50 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
10a60 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f  ailures due to O
10a70 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  OM:       %d\n",
10a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
10a90 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Hiwtr);.    }.  
10aa0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
10ab0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
10ac0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
10ad0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
10ae0 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75  CACHE_USED, &iCu
10af0 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
10b00 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
10b10 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
10b20 50 61 67 65 72 20 48 65 61 70 20 55 73 61 67 65  Pager Heap Usage
10b30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
10b40 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
10b50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
10b60 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
10b70 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
10b80 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
10b90 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
10ba0 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
10bb0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
10bc0 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
10bd0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
10be0 22 50 61 67 65 20 63 61 63 68 65 20 68 69 74 73  "Page cache hits
10bf0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
10c00 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
10c10 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
10c20 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
10c30 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
10c40 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
10c50 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53  TATUS_CACHE_MISS
10c60 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
10c70 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
10c80 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
10c90 22 50 61 67 65 20 63 61 63 68 65 20 6d 69 73 73  "Page cache miss
10ca0 65 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  es:             
10cb0 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
10cc0 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
10cd0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
10ce0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
10cf0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
10d00 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54  TATUS_CACHE_WRIT
10d10 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  E, &iCur, &iHiwt
10d20 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70  r, 1);.    raw_p
10d30 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
10d40 20 22 50 61 67 65 20 63 61 63 68 65 20 77 72 69   "Page cache wri
10d50 74 65 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  tes:            
10d60 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
10d70 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
10d80 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
10d90 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
10da0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
10db0 53 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53  STATUS_SCHEMA_US
10dc0 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
10dd0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
10de0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
10df0 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48  ->out, "Schema H
10e00 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
10e20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
10e30 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
10e40 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
10e50 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
10e60 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
10e70 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53  QLITE_DBSTATUS_S
10e80 54 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  TMT_USED, &iCur,
10e90 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
10ea0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
10eb0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74  f(pArg->out, "St
10ec0 61 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f  atement Heap/Loo
10ed0 6b 61 73 69 64 65 20 55 73 61 67 65 3a 20 20 20  kaside Usage:   
10ee0 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
10f00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41  );.  }..  if( pA
10f10 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20  rg && pArg->out 
10f20 26 26 20 64 62 20 26 26 20 70 41 72 67 2d 3e 70  && db && pArg->p
10f30 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
10f40 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
10f50 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
10f60 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
10f70 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
10f80 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
10fb0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
10fc0 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
10fd0 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
10ff0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
11000 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
11010 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
11020 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
11030 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
11040 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
11050 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
11060 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
11070 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
11080 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
11090 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
110a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
110b0 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
110c0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
110d0 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
110e0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
110f0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11100 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
11110 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
11120 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
11130 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
11140 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
11150 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
11160 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
11170 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
11180 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
11190 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
111a0 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
111b0 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
111c0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
111d0 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  );.  }..#ifdef _
111e0 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c  _linux__.  displ
111f0 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 70  ayLinuxIoStats(p
11200 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  Arg->out);.#endi
11210 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72  f..  /* Do not r
11220 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69  emove this machi
11230 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d  ne readable comm
11240 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73  ent: extra-stats
11250 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a  -output-here */.
11260 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11270 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63  /*.** Display sc
11280 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  an stats..*/.sta
11290 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
112a0 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71  _scanstats(.  sq
112b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112d0 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
112e0 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
112f0 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  te *pArg        
11300 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11310 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
11320 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
11330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
11340 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55  T_SCANSTATUS.  U
11350 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
11360 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
11370 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23  RAMETER(pArg);.#
11380 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  else.  int i, k,
11390 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70 72   n, mx;.  raw_pr
113a0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
113b0 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74  "-------- scanst
113c0 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ats --------\n")
113d0 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66 6f  ;.  mx = 0;.  fo
113e0 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b  r(k=0; k<=mx; k+
113f0 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  +){.    double r
11400 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20  EstLoop = 1.0;. 
11410 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b     for(i=n=0; 1;
11420 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
11430 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70  ite3_stmt *p = p
11440 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
11450 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
11460 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a 20  nLoop, nVisit;. 
11470 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74       double rEst
11480 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69 64  ;.      int iSid
11490 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
114a0 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20  ar *zExplain;.  
114b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
114c0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
114d0 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
114e0 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
114f0 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20  id*)&nLoop) ){. 
11500 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11510 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11520 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
11530 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
11540 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43 54  _SCANSTAT_SELECT
11550 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69 64  ID, (void*)&iSid
11560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
11570 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69 64  d>mx ) mx = iSid
11580 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 64  ;.      if( iSid
11590 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=k ) continue;.
115a0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
115b0 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c 6f  {.        rEstLo
115c0 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 6f  op = (double)nLo
115d0 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
115e0 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  k>0 ) raw_printf
115f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
11600 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20 25  ----- subquery %
11610 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29  d -------\n", k)
11620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11630 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n++;.      sqlit
11640 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
11650 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
11660 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
11670 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
11680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11690 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
116a0 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
116b0 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64  NSTAT_EST, (void
116c0 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20 20  *)&rEst);.      
116d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
116e0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
116f0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58  LITE_SCANSTAT_EX
11700 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a  PLAIN, (void*)&z
11710 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
11720 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
11730 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32 64  ->out, "Loop %2d
11740 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70  : %s\n", n, zExp
11750 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45 73  lain);.      rEs
11760 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a 20  tLoop *= rEst;. 
11770 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
11780 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
11790 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
117a0 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77  Loop=%-8lld nRow
117b0 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d 25  =%-8lld estRow=%
117c0 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f 6f  -8lld estRow/Loo
117d0 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20 20  p=%-8g\n",.     
117e0 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73       nLoop, nVis
117f0 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  it, (sqlite3_int
11800 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e 35  64)(rEstLoop+0.5
11810 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29 3b  ), rEst.      );
11820 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
11830 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
11840 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
11850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
11860 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n");.#endif.}../
11870 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
11880 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f  zArray points to
11890 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
118a0 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  ed array of stri
118b0 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69  ngs. zStr.** poi
118c0 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nts to a single 
118d0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
118e0 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f  tring. Return no
118f0 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a  n-zero if zStr.*
11900 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f  * is equal, acco
11910 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28  rding to strcmp(
11920 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ), to any of the
11930 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20   strings in the 
11940 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77  array..** Otherw
11950 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ise, return zero
11960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11970 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e  str_in_array(con
11980 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
11990 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
119a0 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ray){.  int i;. 
119b0 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61   for(i=0; azArra
119c0 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y[i]; i++){.    
119d0 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53  if( 0==strcmp(zS
119e0 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20  tr, azArray[i]) 
119f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11a00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11a10 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
11a20 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20   statement pSql 
11a30 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e  appears to be an
11a40 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
11a50 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20  nt, allocate.** 
11a60 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
11a70 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e   ShellState.aiIn
11a80 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74  dent[] array wit
11a90 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  h the number of.
11aa0 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f  ** spaces each o
11ab0 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20  pcode should be 
11ac0 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20  indented before 
11ad0 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a 2a  it is output..**
11ae0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
11af0 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
11b00 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
11b10 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
11b20 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
11b30 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
11b40 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
11b50 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
11b60 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
11b70 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
11b80 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
11b90 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
11ba0 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
11bb0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
11bc0 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
11bd0 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
11be0 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
11bf0 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
11c00 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
11c10 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
11c20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
11c30 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
11c40 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
11c50 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
11c60 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
11c70 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
11c80 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
11c90 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
11ca0 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
11cb0 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
11cc0 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
11cd0 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
11ce0 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
11cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11d00 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
11d10 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
11d20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
11d30 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
11d40 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
11d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11d60 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
11d70 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
11d80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
11db0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
11dc0 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
11dd0 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11df0 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
11e00 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
11e10 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e30 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
11e40 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
11e50 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
11e60 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
11e90 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
11ea0 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
11eb0 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
11ec0 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
11ed0 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
11ee0 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
11ef0 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ext",.          
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 22 4e 65 78 74 49 66 4f 70 65 6e 22 2c 20 22   "NextIfOpen", "
11f20 50 72 65 76 49 66 4f 70 65 6e 22 2c 20 30 20 7d  PrevIfOpen", 0 }
11f30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11f40 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
11f50 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
11f60 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
11f70 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
11fa0 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
11fb0 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
11fc0 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
11fd0 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
11fe0 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
11ff0 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
12000 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
12010 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
12020 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
12030 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
12040 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
12050 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21  umn_count(pSql)!
12060 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  =8 ){.    p->cMo
12070 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
12080 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
12090 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
120a0 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  ql(pSql);.  if( 
120b0 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
120c0 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20  ;.  for(z=zSql; 
120d0 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27  *z==' ' || *z=='
120e0 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20  \t' || *z=='\n' 
120f0 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a  || *z=='\f' || *
12100 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20  z=='\r'; z++);. 
12110 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
12120 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69  nicmp(z, "explai
12130 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d  n", 7) ){.    p-
12140 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
12150 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
12160 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  }..  for(iOp=0; 
12170 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
12180 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
12190 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
121a0 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
121b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
121c0 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
121d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
121e0 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
121f0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
12200 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
12210 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
12220 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
12230 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
12240 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
12250 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
12260 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
12270 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
12280 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
12290 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
122a0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
122b0 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
122c0 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
122d0 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
122e0 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
122f0 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
12300 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
12310 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
12320 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
12330 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
12340 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
12350 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
12360 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
12370 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12380 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
12390 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
123a0 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
123b0 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
123c0 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
123d0 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
123e0 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
123f0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66  lloc ){.      if
12400 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( iOp==0 ){.    
12410 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65      /* Do furthe
12420 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68  r verfication th
12430 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61  at this is expla
12440 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72  in output.  Abor
12450 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t if.        ** 
12460 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20  it is not */.   
12470 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
12480 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43  t char *explainC
12490 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ols[] = {.      
124a0 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
124b0 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
124c0 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
124d0 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d  p5", "comment" }
124e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a  ;.        int jj
124f0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  ;.        for(jj
12500 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65  =0; jj<ArraySize
12510 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a  (explainCols); j
12520 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
12530 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
12540 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
12550 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43  Sql,jj),explainC
12560 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20  ols[jj])!=0 ){. 
12570 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d             p->cM
12580 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
12590 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
125a0 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
125b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
125c0 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
125d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
125e0 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b  }.      nAlloc +
125f0 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e  = 100;.      p->
12600 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a  aiIndent = (int*
12610 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
12620 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20  64(p->aiIndent, 
12630 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
12640 74 29 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65  t));.      abYie
12650 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ld = (int*)sqlit
12660 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59  e3_realloc64(abY
12670 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  ield, nAlloc*siz
12680 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 7d  eof(int));.    }
12690 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70  .    abYield[iOp
126a0 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  ] = str_in_array
126b0 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a  (zOp, azYield);.
126c0 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b      p->aiIndent[
126d0 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d  iOp] = 0;.    p-
126e0 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31  >nIndent = iOp+1
126f0 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69  ;..    if( str_i
12700 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e  n_array(zOp, azN
12710 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f  ext) ){.      fo
12720 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b  r(i=p2op; i<iOp;
12730 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
12740 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
12750 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f  .    if( str_in_
12760 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74  array(zOp, azGot
12770 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49  o) && p2op<p->nI
12780 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61  ndent.     && (a
12790 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20  bYield[p2op] || 
127a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
127b0 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20  nt(pSql, 2)).   
127c0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
127d0 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
127e0 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
127f0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 2;.    }.  }
12800 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ..  p->iIndent =
12810 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
12820 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73  ee(abYield);.  s
12830 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71  qlite3_reset(pSq
12840 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  l);.}../*.** Fre
12850 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f  e the array allo
12860 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e  cated by explain
12870 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e  _data_prepare().
12880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12890 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
128a0 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ete(ShellState *
128b0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
128c0 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b  ee(p->aiIndent);
128d0 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d  .  p->aiIndent =
128e0 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74   0;.  p->nIndent
128f0 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65   = 0;.  p->iInde
12900 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
12910 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73   Disable and res
12920 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65  tore .wheretrace
12930 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63   and .selecttrac
12940 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23  e settings..*/.#
12950 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
12960 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
12970 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
12980 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65  E_SELECTTRACE).e
12990 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
129a0 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74  3SelectTrace;.st
129b0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65  atic int savedSe
129c0 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69  lectTrace;.#endi
129d0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
129e0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
129f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12a00 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
12a10 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
12a20 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73  te3WhereTrace;.s
12a30 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57  tatic int savedW
12a40 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
12a50 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  f.static void di
12a60 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
12a70 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
12a80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
12a90 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
12aa0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
12ab0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
12ac0 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
12ad0 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  e = sqlite3Selec
12ae0 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  tTrace;.  sqlite
12af0 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30  3SelectTrace = 0
12b00 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
12b10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
12b20 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
12b30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
12b40 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57  ETRACE).  savedW
12b50 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69  hereTrace = sqli
12b60 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
12b70 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
12b80 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  ce = 0;.#endif.}
12b90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
12ba0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
12bb0 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
12bc0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
12bd0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
12be0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
12bf0 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
12c00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
12c10 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74  ce = savedSelect
12c20 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
12c30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
12c40 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
12c50 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
12c60 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
12c70 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
12c80 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61   = savedWhereTra
12c90 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ce;.#endif.}../*
12ca0 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72  .** Run a prepar
12cb0 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a  ed statement.*/.
12cc0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63  static void exec
12cd0 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a  _prepared_stmt(.
12ce0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
12cf0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
12d20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
12d30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12d40 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f    /* Statment to
12d70 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74 20 28 2a   run */.  int (*
12d80 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
12d90 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72  ,int,char**,char
12da0 2a 2a 2c 69 6e 74 2a 29 20 20 20 2f 2a 20 43 61  **,int*)   /* Ca
12db0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
12dc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12dd0 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74 68  .  /* perform th
12de0 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20 74  e first step.  t
12df0 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75 73  his will tell us
12e00 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76 65   if we.  ** have
12e10 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72   a result set or
12e20 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64   not and how wid
12e30 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20 20  e it is..  */.  
12e40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
12e50 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 69  p(pStmt);.  /* i
12e60 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73 75  f we have a resu
12e70 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69  lt set... */.  i
12e80 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
12e90 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 69 66   rc ){.    /* if
12ea0 20 77 65 20 68 61 76 65 20 61 20 63 61 6c 6c 62   we have a callb
12eb0 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66  ack... */.    if
12ec0 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( xCallback ){. 
12ed0 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
12ee0 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
12ef0 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
12f00 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
12f10 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
12f20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12f30 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
12f40 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
12f50 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
12f60 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66  64(3*nCol*sizeof
12f70 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20  (const char*) + 
12f80 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  1);.      if( !p
12f90 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
12fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
12fb0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
12fc0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
12fd0 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a  zCols = (char **
12fe0 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  )pData;      /* 
12ff0 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20  Names of result 
13000 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
13010 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
13020 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
13030 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
13040 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ts */.        in
13050 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
13060 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
13070 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
13080 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  es */.        in
13090 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20 20 20  t i, x;.        
130a0 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e  assert(sizeof(in
130b0 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61  t) <= sizeof(cha
130c0 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 2f  r *));.        /
130d0 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73 20  * save off ptrs 
130e0 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  to column names 
130f0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
13100 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
13110 7b 0a 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f  {.          azCo
13120 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
13130 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
13140 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
13150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13160 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 2f   do{.          /
13170 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
13180 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
13190 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  s */.          f
131a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
131b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
131c0 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78    aiTypes[i] = x
131d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
131e0 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
131f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
13200 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ( x==SQLITE_BLOB
13210 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72 67   && pArg && pArg
13220 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e  ->cMode==MODE_In
13230 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sert ){.        
13240 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
13250 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
13260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13270 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d         azVals[i]
13280 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
13290 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
132a0 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
132b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
132c0 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
132d0 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
132e0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
132f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13310 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  M;.             
13320 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
13330 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
13340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
13350 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
13360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
13370 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
13380 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
13390 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
133a0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
133b0 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
133c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
133d0 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
133e0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
133f0 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
13400 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
13410 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28 70 41  if( xCallback(pA
13420 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73  rg, nCol, azVals
13430 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65  , azCols, aiType
13440 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
13450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13460 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20  ABORT;.         
13470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13480 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13490 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
134a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
134b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
134c0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c      } while( SQL
134d0 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b  ITE_ROW == rc );
134e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
134f0 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20  _free(pData);.  
13500 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
13510 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
13520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13530 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
13540 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63 20 3d     } while( rc =
13550 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  = SQLITE_ROW );.
13560 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
13570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13580 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
13590 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
135a0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  n is called to p
135b0 72 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68  rocess SQL if th
135c0 65 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c  e previous shell
135d0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20   command.** was 
135e0 22 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61  ".expert". It pa
135f0 73 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20  sses the SQL in 
13600 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13610 65 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  ent directly to.
13620 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78  ** the sqlite3ex
13630 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  pert object..**.
13640 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
13650 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
13660 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
13670 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
13680 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20  ror.** code. In 
13690 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45  this case, (*pzE
136a0 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  rr) may be set t
136b0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
136c0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
136d0 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  * an English lan
136e0 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73  guage error mess
136f0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
13700 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
13710 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
13720 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
13730 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
13740 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
13750 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
13760 74 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51  t expertHandleSQ
13770 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  L(.  ShellState 
13780 2a 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73  *pState, .  cons
13790 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20  t char *zSql, . 
137a0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
137b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74  .  assert( pStat
137c0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
137d0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
137e0 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
137f0 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r==0 );.  return
13800 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
13810 73 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65  sql(pState->expe
13820 72 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c  rt.pExpert, zSql
13830 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzErr);.}../*.
13840 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13850 20 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65   is called eithe
13860 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c  r to silently cl
13870 65 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63  ean up the objec
13880 74 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  t.** created by 
13890 74 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f  the ".expert" co
138a0 6d 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65  mmand (if bCance
138b0 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e  l==1), or to gen
138c0 65 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f  erate a .** repo
138d0 72 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74  rt from it and t
138e0 68 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20  hen clean it up 
138f0 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e  (if bCancel==0).
13900 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
13910 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
13920 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
13930 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
13940 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e  e error.** code.
13950 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28   In this case, (
13960 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73  *pzErr) may be s
13970 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
13980 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
13990 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68  ng.** an English
139a0 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
139b0 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74  message. It is t
139c0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
139d0 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
139e0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
139f0 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
13a00 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
13a10 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
13a20 63 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69  c int expertFini
13a30 73 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  sh(.  ShellState
13a40 20 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20   *pState,.  int 
13a50 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20  bCancel,.  char 
13a60 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
13a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a80 0a 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74  .  sqlite3expert
13a90 20 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78   *p = pState->ex
13aa0 70 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20  pert.pExpert;.  
13ab0 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
13ac0 73 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c  ssert( bCancel |
13ad0 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  | pzErr==0 || *p
13ae0 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  zErr==0 );.  if(
13af0 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20   bCancel==0 ){. 
13b00 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70     FILE *out = p
13b10 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20  State->out;.    
13b20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70  int bVerbose = p
13b30 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56  State->expert.bV
13b40 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20  erbose;..    rc 
13b50 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
13b60 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72  _analyze(p, pzEr
13b70 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
13b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13b90 20 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20     int nQuery = 
13ba0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63  sqlite3_expert_c
13bb0 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69  ount(p);.      i
13bc0 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  nt i;..      if(
13bd0 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
13be0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
13bf0 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33  *zCand = sqlite3
13c00 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
13c10 2c 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54  ,0,EXPERT_REPORT
13c20 5f 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20  _CANDIDATES);.  
13c30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
13c40 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64  (out, "-- Candid
13c50 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ates -----------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c70 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  --\n");.        
13c80 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
13c90 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a  "%s\n", zCand);.
13ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
13cb0 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b  r(i=0; i<nQuery;
13cc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
13cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
13ce0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
13cf0 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
13d00 50 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29  PERT_REPORT_SQL)
13d10 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
13d20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c  char *zIdx = sql
13d30 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
13d40 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f  rt(p, i, EXPERT_
13d50 52 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b  REPORT_INDEXES);
13d60 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13d70 68 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69  har *zEQP = sqli
13d80 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
13d90 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
13da0 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20  EPORT_PLAN);.   
13db0 20 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30       if( zIdx==0
13dc0 20 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e   ) zIdx = "(no n
13dd0 65 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a  ew indexes)\n";.
13de0 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72          if( bVer
13df0 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
13e00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
13e10 2c 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d  , "-- Query %d -
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
13e40 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  n",i+1);.       
13e50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
13e60 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71  t, "%s\n\n", zSq
13e70 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
13e80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
13e90 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49  (out, "%s\n", zI
13ea0 64 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  dx);.        raw
13eb0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
13ec0 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20  \n", zEQP);.    
13ed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13ee0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64  sqlite3_expert_d
13ef0 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74  estroy(p);.  pSt
13f00 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
13f10 65 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ert = 0;.  retur
13f20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
13f30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
13f40 20 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63   ".expert" dot c
13f50 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
13f60 63 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43  c int expertDotC
13f70 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
13f80 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
13f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
13fa0 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
13fb0 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
13fc0 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
13fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
13fe0 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
13ff0 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
14000 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
14010 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
14020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14030 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
14040 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
14050 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14060 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
14070 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
14080 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65  i;.  int iSample
14090 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
140a0 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
140b0 70 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20  pExpert==0 );.  
140c0 6d 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e  memset(&pState->
140d0 65 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f  expert, 0, sizeo
140e0 66 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a  f(ExpertInfo));.
140f0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
14100 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
14110 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
14120 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
14130 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
14140 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
14150 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
14160 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  ++;.    n = strl
14170 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
14180 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e   n>=2 && 0==strn
14190 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65  cmp(z, "-verbose
141a0 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70  ", n) ){.      p
141b0 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56  State->expert.bV
141c0 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
141d0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
141e0 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d  >=2 && 0==strncm
141f0 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20  p(z, "-sample", 
14200 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  n) ){.      if( 
14210 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20  i==(nArg-1) ){. 
14220 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
14230 66 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f  f(stderr, "optio
14240 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
14250 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a  gument: %s\n", z
14260 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
14270 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14290 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e     iSample = (in
142a0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
142b0 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  zArg[++i]);.    
142c0 20 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c      if( iSample<
142d0 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30  0 || iSample>100
142e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
142f0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
14300 20 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72   "value out of r
14310 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41  ange: %s\n", azA
14320 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
14330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
14340 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
14350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14360 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77   else{.      raw
14370 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
14380 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
14390 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
143a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
143b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
143c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
143d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74  _OK ){.    pStat
143e0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
143f0 74 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  t = sqlite3_expe
14400 72 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64  rt_new(pState->d
14410 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  b, &zErr);.    i
14420 66 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72  f( pState->exper
14430 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a  t.pExpert==0 ){.
14440 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
14450 28 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65  (stderr, "sqlite
14460 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73  3_expert_new: %s
14470 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
14480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
14490 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
144a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
144b0 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20  pert_config(.   
144c0 20 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65         pState->e
144d0 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45  xpert.pExpert, E
144e0 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d  XPERT_CONFIG_SAM
144f0 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20  PLE, iSample.   
14500 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
14510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14520 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
14530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14540 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
14550 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73 74  .** Execute a st
14560 61 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f  atement or set o
14570 66 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50  f statements.  P
14580 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75  rint.** any resu
14590 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20  lt rows/columns 
145a0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
145b0 20 63 75 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a   current mode.**
145c0 20 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70   set via the sup
145d0 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a  plied callback..
145e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65  **.** This is ve
145f0 72 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51  ry similar to SQ
14600 4c 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20  Lite's built-in 
14610 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
14620 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65 70  * function excep
14630 74 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c 69  t it takes a sli
14640 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20  ghtly different 
14650 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20  callback.** and 
14660 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 61 72  callback data ar
14670 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
14680 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63  c int shell_exec
14690 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146c0 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   An open databas
146d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
146e0 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65 76   /* SQL to be ev
14710 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  aluated */.  int
14720 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
14730 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63  id*,int,char**,c
14740 68 61 72 2a 2a 2c 69 6e 74 2a 29 2c 20 20 20 2f  har**,int*),   /
14750 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
14760 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 20 2f 2a 20 28 6e 6f 74 20 74 68 65 20 73     /* (not the s
147a0 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 65  ame as sqlite3_e
147b0 78 65 63 29 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  xec) */.  ShellS
147c0 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
147f0 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
14800 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
14810 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
14820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
14830 72 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e  rror msg written
14840 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
14850 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
14860 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a  t = NULL;     /*
14870 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   Statement to ex
14880 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20  ecute. */.  int 
14890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
148b0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
148c0 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74  int rc2;.  const
148d0 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72   char *zLeftover
148e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
148f0 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65 73 73 65  il of unprocesse
14900 64 20 53 51 4c 20 2a 2f 0a 0a 20 20 69 66 28 20  d SQL */..  if( 
14910 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
14920 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c  *pzErrMsg = NULL
14930 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14940 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14950 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41  ALTABLE.  if( pA
14960 72 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  rg->expert.pExpe
14970 72 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65  rt ){.    rc = e
14980 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70  xpertHandleSQL(p
14990 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  Arg, zSql, pzErr
149a0 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Msg);.    return
149b0 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 41   expertFinish(pA
149c0 72 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f  rg, (rc!=SQLITE_
149d0 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  OK), pzErrMsg);.
149e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
149f0 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20  ile( zSql[0] && 
14a00 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63  (SQLITE_OK == rc
14a10 29 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ) ){.    static 
14a20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d  const char *zStm
14a30 74 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73  tSql;.    rc = s
14a40 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
14a50 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
14a60 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76  &pStmt, &zLeftov
14a70 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  er);.    if( SQL
14a80 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a  ITE_OK != rc ){.
14a90 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d        if( pzErrM
14aa0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
14ab0 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
14ac0 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
14ad0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14ae0 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20       if( !pStmt 
14af0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ){.        /* th
14b00 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61  is happens for a
14b10 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74   comment or whit
14b20 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  e-space */.     
14b30 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f     zSql = zLefto
14b40 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ver;.        whi
14b50 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c  le( IsSpace(zSql
14b60 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20  [0]) ) zSql++;. 
14b70 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
14b90 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65  StmtSql = sqlite
14ba0 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
14bb0 20 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c      if( zStmtSql
14bc0 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d  ==0 ) zStmtSql =
14bd0 20 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65   "";.      while
14be0 28 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53  ( IsSpace(zStmtS
14bf0 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71  ql[0]) ) zStmtSq
14c00 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73  l++;..      /* s
14c10 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70  ave off the prep
14c20 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61  ared statment ha
14c30 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72  ndle and reset r
14c40 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ow count */.    
14c50 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
14c60 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d        pArg->pStm
14c70 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
14c80 20 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30     pArg->cnt = 0
14c90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14ca0 20 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c   /* echo the sql
14cb0 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63   statement if ec
14cc0 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ho on */.      i
14cd0 66 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c  f( pArg && Shell
14ce0 48 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48  HasFlag(pArg, SH
14cf0 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20  FLG_Echo) ){.   
14d00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
14d10 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c  (pArg->out, "%s\
14d20 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a  n", zStmtSql ? z
14d30 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b  StmtSql : zSql);
14d40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14d50 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c  /* Show the EXPL
14d60 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69  AIN QUERY PLAN i
14d70 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a  f .eqp is on */.
14d80 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
14d90 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20  & pArg->autoEQP 
14da0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
14db0 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a 53  ke("EXPLAIN%",zS
14dc0 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b 0a  tmtSql,0)!=0 ){.
14dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14de0 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a  stmt *pExplain;.
14df0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
14e00 51 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  QP;.        int 
14e10 74 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a  triggerEQP = 0;.
14e20 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f          disable_
14e30 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
14e40 73 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s();.        sql
14e50 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
14e60 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
14e70 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
14e80 2d 31 2c 20 26 74 72 69 67 67 65 72 45 51 50 29  -1, &triggerEQP)
14e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
14ea0 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
14eb0 4f 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a  OEQP_trigger ){.
14ec0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14ed0 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20  3_db_config(db, 
14ee0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
14ef0 54 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20  TRIGGER_EQP, 1, 
14f00 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
14f10 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c        zEQP = sql
14f20 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
14f30 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
14f40 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b   %s", zStmtSql);
14f50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14f60 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
14f70 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
14f80 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
14f90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14fb0 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
14fc0 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
14fd0 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  n)==SQLITE_ROW )
14fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
14ff0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
15000 75 74 2c 22 2d 2d 45 51 50 2d 2d 20 25 64 2c 22  ut,"--EQP-- %d,"
15010 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  ,sqlite3_column_
15020 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29  int(pExplain, 0)
15030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
15040 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
15050 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74  out,"%d,", sqlit
15060 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
15070 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20 20 20  xplain, 1));.   
15080 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
15090 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25  ntf(pArg->out,"%
150a0 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  d,", sqlite3_col
150b0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
150c0 2c 20 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 2));.         
150d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
150e0 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c  Arg->out,"%s\n",
150f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15100 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
15110 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
15120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15130 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
15140 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
15150 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15160 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
15170 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
15180 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c  EQP>=AUTOEQP_ful
15190 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
151a0 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50  * Also do an EXP
151b0 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66  LAIN for ".eqp f
151c0 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  ull" mode */.   
151d0 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
151e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
151f0 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d  XPLAIN %s", zStm
15200 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tSql);.         
15210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
15220 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
15230 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
15240 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
15250 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
15270 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
15280 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
15290 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
152a0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
152b0 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
152c0 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f             exec_
152d0 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
152e0 72 67 2c 20 70 45 78 70 6c 61 69 6e 2c 20 78 43  rg, pExplain, xC
152f0 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
15300 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
15310 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b  ta_delete(pArg);
15320 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
15340 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
15350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15360 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b  ite3_free(zEQP);
15370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15380 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
15390 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
153a0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
153b0 5f 45 51 50 2c 20 74 72 69 67 67 65 72 45 51 50  _EQP, triggerEQP
153c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
153d0 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
153e0 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
153f0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41   }..      if( pA
15400 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  rg ){.        pA
15410 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67  rg->cMode = pArg
15420 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
15430 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78  if( pArg->autoEx
15440 70 6c 61 69 6e 0a 20 20 20 20 20 20 20 20 20 26  plain.         &
15450 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
15460 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 38  _count(pStmt)==8
15470 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
15480 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58  ite3_strlike("EX
15490 50 4c 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71  PLAIN%", zStmtSq
154a0 6c 2c 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  l,0)==0.        
154b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  ){.          pAr
154c0 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f  g->cMode = MODE_
154d0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20  Explain;.       
154e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   }..        /* I
154f0 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63  f the shell is c
15500 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78  urrently in ".ex
15510 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74  plain" mode, gat
15520 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20  her the extra.  
15530 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65        ** data re
15540 71 75 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e  quired to add in
15550 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74  dents to the out
15560 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69  put.*/.        i
15570 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d  f( pArg->cMode==
15580 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a  MODE_Explain ){.
15590 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
155a0 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70  n_data_prepare(p
155b0 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  Arg, pStmt);.   
155c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
155d0 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61        exec_prepa
155e0 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70  red_stmt(pArg, p
155f0 53 74 6d 74 2c 20 78 43 61 6c 6c 62 61 63 6b 29  Stmt, xCallback)
15600 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f  ;.      explain_
15610 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67  data_delete(pArg
15620 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69  );..      /* pri
15630 6e 74 20 75 73 61 67 65 20 73 74 61 74 73 20 69  nt usage stats i
15640 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20  f stats on */.  
15650 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
15660 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b  pArg->statsOn ){
15670 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79  .        display
15680 5f 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 2c  _stats(db, pArg,
15690 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
156a0 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f      /* print loo
156b0 70 2d 63 6f 75 6e 74 65 72 73 20 69 66 20 72 65  p-counters if re
156c0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  quired */.      
156d0 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
156e0 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b  ->scanstatsOn ){
156f0 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79  .        display
15700 5f 73 63 61 6e 73 74 61 74 73 28 64 62 2c 20 70  _scanstats(db, p
15710 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Arg);.      }.. 
15720 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65       /* Finalize
15730 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
15740 75 73 74 20 65 78 65 63 75 74 65 64 2e 20 49 66  ust executed. If
15750 20 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61 76   this fails, sav
15760 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
15770 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  y of the error m
15780 65 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73  essage. Otherwis
15790 65 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f 20 70  e, set zSql to p
157a0 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  oint to the.    
157b0 20 20 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d    ** next statem
157c0 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20  ent to execute. 
157d0 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
157e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
157f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
15800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc!=SQLITE_NOM
15810 45 4d 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  EM ) rc = rc2;. 
15820 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15840 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
15850 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
15860 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
15870 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
15880 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a      }else if( pz
15890 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
158a0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61    *pzErrMsg = sa
158b0 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a  ve_err_msg(db);.
158c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
158d0 2a 20 63 6c 65 61 72 20 73 61 76 65 64 20 73 74  * clear saved st
158e0 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  mt handle */.   
158f0 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
15900 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74         pArg->pSt
15910 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  mt = NULL;.     
15920 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
15930 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20  end while */..  
15940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15950 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f  .** Release memo
15960 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  ry previously al
15970 6c 6f 63 61 74 65 64 20 62 79 20 74 61 62 6c 65  located by table
15980 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f  ColumnList()..*/
15990 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
159a0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72  eColumnList(char
159b0 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74   **azCol){.  int
159c0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61   i;.  for(i=1; a
159d0 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
159e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
159f0 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  azCol[i]);.  }. 
15a00 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20   /* azCol[0] is 
15a10 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
15a20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
15a30 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  e(azCol);.}../*.
15a40 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  ** Return a list
15a50 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
15a60 73 74 72 69 6e 67 73 20 77 68 69 63 68 20 61 72  strings which ar
15a70 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  e the names of a
15a80 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  ll.** columns in
15a90 20 74 61 62 6c 65 20 7a 54 61 62 2e 20 20 20 54   table zTab.   T
15aa0 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  he memory to hol
15ab0 64 20 74 68 65 20 6e 61 6d 65 73 20 69 73 20 64  d the names is d
15ac0 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15ad0 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 75 73 74  located and must
15ae0 20 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20   be released by 
15af0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
15b00 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
15b10 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c  ll.** to freeCol
15b20 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a  umnList()..**.**
15b30 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e   The azCol[0] en
15b40 74 72 79 20 69 73 20 75 73 75 61 6c 6c 79 20 4e  try is usually N
15b50 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72 2c 20 69  ULL.  However, i
15b60 66 20 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73 20  f zTab contains 
15b70 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65  a rowid.** value
15b80 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
15b90 65 20 70 72 65 73 65 72 76 65 64 2c 20 74 68 65  e preserved, the
15ba0 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69  n azCol[0] is fi
15bb0 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
15bc0 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
15bd0 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  rowid column..**
15be0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 72 65  .** The first re
15bf0 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  gular column in 
15c00 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 7a 43  the table is azC
15c10 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c 69 73 74  ol[1].  The list
15c20 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
15c30 2a 20 62 79 20 61 6e 20 65 6e 74 72 79 20 77 69  * by an entry wi
15c40 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a  th azCol[i]==0..
15c50 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
15c60 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74  *tableColumnList
15c70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
15c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
15c90 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  ){.  char **azCo
15ca0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
15cb0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
15cc0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
15cd0 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  t nCol = 0;.  in
15ce0 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  t nAlloc = 0;.  
15cf0 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20  int nPK = 0;    
15d00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15d10 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
15d20 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e  mns seen */.  in
15d30 74 20 69 73 49 50 4b 20 3d 20 30 3b 20 20 20 20  t isIPK = 0;    
15d40 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20   /* True if one 
15d50 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
15d60 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e 54 45 47  mn of type INTEG
15d70 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73  ER */.  int pres
15d80 65 72 76 65 52 6f 77 69 64 20 3d 20 53 68 65 6c  erveRowid = Shel
15d90 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
15da0 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
15db0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a  ;.  int rc;..  z
15dc0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
15dd0 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61  rintf("PRAGMA ta
15de0 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54  ble_info=%Q", zT
15df0 61 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ab);.  rc = sqli
15e00 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
15e10 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
15e20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
15e30 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
15e40 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
15e50 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
15e60 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
15e70 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
15e80 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  ){.    if( nCol>
15e90 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20  =nAlloc-2 ){.   
15ea0 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c     nAlloc = nAll
15eb0 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30  oc*2 + nCol + 10
15ec0 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20  ;.      azCol = 
15ed0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
15ee0 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69  azCol, nAlloc*si
15ef0 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b  zeof(azCol[0]));
15f00 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  .      if( azCol
15f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
15f20 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
15f30 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
15f40 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
15f50 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
15f60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15f70 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20  azCol[++nCol] = 
15f80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15f90 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
15fa0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
15fb0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71   1));.    if( sq
15fc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
15fd0 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20  (pStmt, 5) ){.  
15fe0 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20      nPK++;.     
15ff0 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20   if( nPK==1.    
16000 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
16010 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  ricmp((const cha
16020 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
16030 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c  n_text(pStmt,2),
16040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16050 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54 45             "INTE
16060 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 29  GER")==0.      )
16070 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
16080 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
16090 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
160a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
160b0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
160c0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
160d0 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30  ;.  if( azCol==0
160e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
160f0 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  zCol[0] = 0;.  a
16100 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30  zCol[nCol+1] = 0
16110 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63 69  ;..  /* The deci
16120 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20  sion of whether 
16130 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 72  or not a rowid r
16140 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20 62  eally needs to b
16150 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e preserved.  **
16160 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65 20   is tricky.  We 
16170 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70 72  never need to pr
16180 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20 66  eserve a rowid f
16190 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
161a0 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72  ID table.  ** or
161b0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e   a table with an
161c0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
161d0 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75 6e   KEY.  We are un
161e0 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76 65  able to preserve
161f0 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20  .  ** rowids on 
16200 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68 65  tables where the
16210 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63 65   rowid is inacce
16220 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20 74  ssible because t
16230 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 20  here are other. 
16240 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
16250 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  he table named "
16260 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
16270 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20  ", and "oid"..  
16280 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72 76  */.  if( preserv
16290 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b 20  eRowid && isIPK 
162a0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 73  ){.    /* If a s
162b0 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b 45  ingle PRIMARY KE
162c0 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79  Y column with ty
162d0 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20 73  pe INTEGER was s
162e0 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20 20  een, then it.   
162f0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e 20   ** might be an 
16300 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52 4f  alise for the RO
16310 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69 67  WID.  But it mig
16320 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49 54  ht also be a WIT
16330 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 2a  HOUT ROWID.    *
16340 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e 54  * table or a INT
16350 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
16360 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65   DESC column, ne
16370 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 61  ither of which a
16380 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20  re.    ** ROWID 
16390 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69 73  aliases.  To dis
163a0 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20 63  tinguish these c
163b0 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20 73  ases, check to s
163c0 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  ee if.    ** the
163d0 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e 74  re is a "pk" ent
163e0 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69 6e  ry in "PRAGMA in
163f0 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65 72  dex_list".  Ther
16400 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  e will be.    **
16410 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20 69   no "pk" index i
16420 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
16430 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61  Y really is an a
16440 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f 57  lias for the ROW
16450 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  ID..    */.    z
16460 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
16470 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31 20  rintf("SELECT 1 
16480 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65  FROM pragma_inde
16490 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20 20  x_list(%Q)".    
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f         " WHERE o
164c0 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61  rigin='pk'", zTa
164d0 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
164e0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
164f0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
16500 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
16510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
16520 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
16530 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f 6c  ){.      freeCol
16540 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
16550 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
16560 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
16570 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
16580 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
16590 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
165a0 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f 77  .    preserveRow
165b0 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  id = rc==SQLITE_
165c0 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROW;.  }.  if( p
165d0 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b 0a  reserveRowid ){.
165e0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73      /* Only pres
165f0 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20 69  erve the rowid i
16600 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61 20  f we can find a 
16610 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72 20  name to use for 
16620 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  the.    ** rowid
16630 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
16640 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d  har *azRowid[] =
16650 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f   { "rowid", "_ro
16660 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a  wid_", "oid" };.
16670 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
16680 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
16690 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
166a0 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b  i=1; i<=nCol; i+
166b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
166c0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
166d0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c  azRowid[j],azCol
166e0 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  [i])==0 ) break;
166f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16700 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i>nCol ){.   
16710 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
16720 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
16730 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69  hat azRowid[j] i
16740 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
16750 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  f any.        **
16760 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e   ordinary column
16770 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
16780 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52 6f  Verify that azRo
16790 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69  wid[j] is a vali
167a0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d  d.        ** nam
167b0 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  e for the rowid 
167c0 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69 74  before adding it
167d0 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57   to azCol[0].  W
167e0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
167f0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 77       ** tables w
16800 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c 61  ill fail this la
16810 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  st check */.    
16820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16830 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
16840 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a  tadata(p->db,0,z
16850 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30  Tab,azRowid[j],0
16860 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  ,0,0,0,0);.     
16870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16880 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20  E_OK ) azCol[0] 
16890 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20  = azRowid[j];.  
168a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
168b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
168c0 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d   return azCol;.}
168d0 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74  ../*.** Toggle t
168e0 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  he reverse_unord
168f0 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65 74  ered_selects set
16900 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
16910 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65 63  void toggleSelec
16920 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20 2a  tOrder(sqlite3 *
16930 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db){.  sqlite3_s
16940 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
16950 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20 3d    int iSetting =
16960 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d 74   0;.  char zStmt
16970 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [100];.  sqlite3
16980 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
16990 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f  "PRAGMA reverse_
169a0 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
169b0 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  s", -1, &pStmt, 
169c0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
169d0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
169e0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
169f0 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c 69   iSetting = sqli
16a00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
16a10 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Stmt, 0);.  }.  
16a20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
16a30 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
16a40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
16a50 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74  of(zStmt), zStmt
16a60 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  ,.       "PRAGMA
16a70 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72   reverse_unorder
16a80 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22 2c  ed_selects(%d)",
16a90 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20 73   !iSetting);.  s
16aa0 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
16ab0 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b  zStmt, 0, 0, 0);
16ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
16ad0 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 61  s a different ca
16ae0 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75  llback routine u
16af0 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20  sed for dumping 
16b00 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
16b10 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69 76   Each row receiv
16b20 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62  ed by this callb
16b30 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
16b40 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a  a table name,.**
16b50 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65 20   the table type 
16b60 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62  ("index" or "tab
16b70 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20  le") and SQL to 
16b80 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
16b90 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
16ba0 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74  e should print t
16bb0 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  ext sufficient t
16bc0 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
16bd0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
16be0 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  int dump_callbac
16bf0 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
16c00 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
16c10 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e  zArg, char **azN
16c20 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 72  otUsed){.  int r
16c30 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
16c40 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74  *zTable;.  const
16c50 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
16c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
16c70 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
16c80 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20  p = (ShellState 
16c90 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45  *)pArg;..  UNUSE
16ca0 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f  D_PARAMETER(azNo
16cb0 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e 41  tUsed);.  if( nA
16cc0 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d  rg!=3 || azArg==
16cd0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16ce0 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30  zTable = azArg[0
16cf0 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41  ];.  zType = azA
16d00 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20  rg[1];.  zSql = 
16d10 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28  azArg[2];..  if(
16d20 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
16d30 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
16d40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  ")==0 ){.    raw
16d50 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
16d60 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
16d70 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
16d80 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
16d90 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
16da0 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a  sqlite_stat?", z
16db0 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Table)==0 ){.   
16dc0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
16dd0 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
16de0 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
16df0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
16e00 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  ncmp(zTable, "sq
16e10 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  lite_", 7)==0 ){
16e20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16e30 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
16e40 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45  mp(zSql, "CREATE
16e50 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c   VIRTUAL TABLE",
16e60 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   20)==0 ){.    c
16e70 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69  har *zIns;.    i
16e80 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53  f( !p->writableS
16e90 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
16ea0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
16eb0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
16ec0 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22  le_schema=ON;\n"
16ed0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
16ee0 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a  ableSchema = 1;.
16ef0 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d      }.    zIns =
16f00 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16f10 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
16f20 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
16f30 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ter(type,name,tb
16f40 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
16f50 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41  sql)".       "VA
16f60 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71  LUES('table','%q
16f70 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22  ','%q',0,'%q');"
16f80 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c  ,.       zTable,
16f90 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a   zTable, zSql);.
16fa0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
16fb0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
16fc0 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIns);.    sqlit
16fd0 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20  e3_free(zIns);. 
16fe0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16ff0 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 53  else{.    printS
17000 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
17010 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a  , zSql, ";\n");.
17020 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d    }..  if( strcm
17030 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22  p(zType, "table"
17040 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
17050 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20  lText sSelect;. 
17060 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54 61     ShellText sTa
17070 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  ble;.    char **
17080 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69  azCol;.    int i
17090 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76 65  ;.    char *save
170a0 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  dDestTable;.    
170b0 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a  int savedMode;..
170c0 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c      azCol = tabl
170d0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a  eColumnList(p, z
170e0 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
170f0 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
17100 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20    p->nErr++;.   
17110 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
17120 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79   }..    /* Alway
17130 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62 6c  s quote the tabl
17140 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66 20  e name, even if 
17150 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  it appears to be
17160 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20 20   pure ascii,.   
17170 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20 69   ** in case it i
17180 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a  s a keyword. Ex:
17190 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 74    INSERT INTO "t
171a0 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20  able" ... */.   
171b0 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62 6c   initText(&sTabl
171c0 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
171d0 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62  xt(&sTable, zTab
171e0 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
171f0 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49  able));.    /* I
17200 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68 65  f preserving the
17210 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63 6f   rowid, add a co
17220 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72 20  lumn list after 
17230 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  the table name..
17240 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
17250 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54 20  words:  "INSERT 
17260 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c 61  INTO tab(rowid,a
17270 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53  ,b,c,...) VALUES
17280 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e  (...)".    ** in
17290 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
172a0 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
172b0 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22  tab VALUES(...)"
172c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
172d0 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20   azCol[0] ){.   
172e0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
172f0 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a  Table, "(", 0);.
17300 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
17310 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
17320 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  0], 0);.      fo
17330 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
17340 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
17350 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
17360 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  e, ",", 0);.    
17370 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
17380 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d  sTable, azCol[i]
17390 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  , quoteChar(azCo
173a0 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  l[i]));.      }.
173b0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
173c0 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20 30  (&sTable, ")", 0
173d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
173e0 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70   Build an approp
173f0 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74 61  riate SELECT sta
17400 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
17410 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  itText(&sSelect)
17420 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
17430 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
17440 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  CT ", 0);.    if
17450 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
17460 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
17470 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30  sSelect, azCol[0
17480 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ], 0);.      app
17490 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
174a0 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d  , ",", 0);.    }
174b0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  .    for(i=1; az
174c0 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
174d0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
174e0 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69  sSelect, azCol[i
174f0 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
17500 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 69  ol[i]));.      i
17510 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b  f( azCol[i+1] ){
17520 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
17530 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
17540 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
17550 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c     }.    freeCol
17560 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
17570 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
17580 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20  sSelect, " FROM 
17590 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e  ", 0);.    appen
175a0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
175b0 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
175c0 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20  r(zTable));..   
175d0 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 20   savedDestTable 
175e0 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b  = p->zDestTable;
175f0 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20 3d  .    savedMode =
17600 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d   p->mode;.    p-
17610 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 54  >zDestTable = sT
17620 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d  able.z;.    p->m
17630 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d  ode = p->cMode =
17640 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
17650 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
17660 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74  c(p->db, sSelect
17670 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  .z, shell_callba
17680 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 69  ck, p, 0);.    i
17690 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
176a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
176b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
176c0 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
176d0 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52  * CORRUPTION ERR
176e0 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b  OR *******/\n");
176f0 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c  .      toggleSel
17700 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b  ectOrder(p->db);
17710 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
17720 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74  c(p->db, sSelect
17730 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  .z, shell_callba
17740 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  ck, p, 0);.     
17750 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
17760 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  er(p->db);.    }
17770 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
17780 6c 65 20 3d 20 73 61 76 65 64 44 65 73 74 54 61  le = savedDestTa
17790 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65  ble;.    p->mode
177a0 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20   = savedMode;.  
177b0 20 20 66 72 65 65 54 65 78 74 28 26 73 54 61 62    freeText(&sTab
177c0 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78  le);.    freeTex
177d0 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
177e0 20 69 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72   if( rc ) p->nEr
177f0 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
17800 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  n 0;.}../*.** Ru
17810 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64  n zQuery.  Use d
17820 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61  ump_callback() a
17830 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
17840 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a  outine so that.*
17850 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
17860 66 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20  f the query are 
17870 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74  output as SQL st
17880 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
17890 49 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49  If we get a SQLI
178a0 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
178b0 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72  , rerun the quer
178c0 79 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e  y after appendin
178d0 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72  g.** "ORDER BY r
178e0 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68  owid DESC" to th
178f0 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e end..*/.static
17900 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f   int run_schema_
17910 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68  dump_query(.  Sh
17920 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63  ellState *p,.  c
17930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
17940 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  y.){.  int rc;. 
17950 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
17960 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17970 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65  exec(p->db, zQue
17980 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  ry, dump_callbac
17990 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
179a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
179b0 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68  ORRUPT ){.    ch
179c0 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74  ar *zQ2;.    int
179d0 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
179e0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77  zQuery);.    raw
179f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
17a00 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54  "/****** CORRUPT
17a10 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a  ION ERROR ******
17a20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  */\n");.    if( 
17a30 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74  zErr ){.      ut
17a40 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
17a50 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a  , "/****** %s **
17a60 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b  ****/\n", zErr);
17a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
17a80 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
17a90 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d   zErr = 0;.    }
17aa0 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f  .    zQ2 = mallo
17ab0 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20  c( len+100 );.  
17ac0 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72    if( zQ2==0 ) r
17ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
17ae0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c  lite3_snprintf(l
17af0 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73  en+100, zQ2, "%s
17b00 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
17b10 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a  DESC", zQuery);.
17b20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17b30 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32  _exec(p->db, zQ2
17b40 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c  , dump_callback,
17b50 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20   p, &zErr);.    
17b60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
17b70 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
17b80 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52  ut, "/****** ERR
17b90 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e  OR: %s ******/\n
17ba0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65  ", zErr);.    }e
17bb0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
17bc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
17bd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17be0 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
17bf0 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d    free(zQ2);.  }
17c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17c10 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 61  ./*.** Text of a
17c20 20 68 65 6c 70 20 6d 65 73 73 61 67 65 0a 2a 2f   help message.*/
17c30 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 48 65  .static char zHe
17c40 6c 70 5b 5d 20 3d 0a 23 69 66 20 64 65 66 69 6e  lp[] =.#if defin
17c50 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
17c60 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65 64  LIB) && !defined
17c70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
17c80 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61  TUALTABLE).  ".a
17c90 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20 20  rchive ...      
17ca0 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20       Manage SQL 
17cb0 61 72 63 68 69 76 65 73 3a 20 5c 22 2e 61 72 63  archives: \".arc
17cc0 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f  hive --help\" fo
17cd0 72 20 64 65 74 61 69 6c 73 5c 6e 22 0a 23 65 6e  r details\n".#en
17ce0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
17cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
17d00 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f  ATION.  ".auth O
17d10 4e 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 20  N|OFF           
17d20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20  Show authorizer 
17d30 63 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a 23 65 6e  callbacks\n".#en
17d40 64 69 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f  dif.  ".backup ?
17d50 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20 42 61  DB? FILE      Ba
17d60 63 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74  ckup DB (default
17d70 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49   \"main\") to FI
17d80 4c 45 5c 6e 22 0a 20 20 22 2e 62 61 69 6c 20 6f  LE\n".  ".bail o
17d90 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
17da0 53 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  Stop after hitti
17db0 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65  ng an error.  De
17dc0 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22  fault OFF\n".  "
17dd0 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20  .binary on|off  
17de0 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61         Turn bina
17df0 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20  ry output on or 
17e00 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  off.  Default OF
17e10 46 5c 6e 22 0a 20 20 22 2e 63 64 20 44 49 52 45  F\n".  ".cd DIRE
17e20 43 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 43  CTORY          C
17e30 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e  hange the workin
17e40 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44  g directory to D
17e50 49 52 45 43 54 4f 52 59 5c 6e 22 0a 20 20 22 2e  IRECTORY\n".  ".
17e60 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20  changes on|off  
17e70 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62 65        Show numbe
17e80 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65  r of rows change
17e90 64 20 62 79 20 53 51 4c 5c 6e 22 0a 20 20 22 2e  d by SQL\n".  ".
17ea0 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20  check GLOB      
17eb0 20 20 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75        Fail if ou
17ec0 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74  tput since .test
17ed0 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  case does not ma
17ee0 74 63 68 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65  tch\n".  ".clone
17ef0 20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20 20   NEWDB          
17f00 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f   Clone data into
17f10 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20   NEWDB from the 
17f20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
17f30 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61 73  e\n".  ".databas
17f40 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 4c  es             L
17f50 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69  ist names and fi
17f60 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20  les of attached 
17f70 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20 22  databases\n".  "
17f80 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20  .dbinfo ?DB?    
17f90 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
17fa0 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
17fb0 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
17fc0 65 5c 6e 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54  e\n".  ".dump ?T
17fd0 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44  ABLE? ...      D
17fe0 75 6d 70 20 74 68 65 20 64 61 74 61 62 61 73 65  ump the database
17ff0 20 69 6e 20 61 6e 20 53 51 4c 20 74 65 78 74 20   in an SQL text 
18000 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20  format\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 49 66 20 54 41 42 4c 45 20 73        If TABLE s
18030 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64  pecified, only d
18040 75 6d 70 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ump tables match
18050 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ing\n".  "      
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20     LIKE pattern 
18080 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63  TABLE.\n".  ".ec
18090 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ho on|off       
180a0 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64      Turn command
180b0 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c   echo on or off\
180c0 6e 22 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66  n".  ".eqp on|of
180d0 66 7c 66 75 6c 6c 20 20 20 20 20 20 20 45 6e 61  f|full       Ena
180e0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61  ble or disable a
180f0 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e  utomatic EXPLAIN
18100 20 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22 0a 20   QUERY PLAN\n". 
18110 20 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20   ".excel        
18120 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61 79           Display
18130 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6e   the output of n
18140 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61  ext command in a
18150 20 73 70 72 65 61 64 73 68 65 65 74 5c 6e 22 0a   spreadsheet\n".
18160 20 20 22 2e 65 78 69 74 20 20 20 20 20 20 20 20    ".exit        
18170 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74            Exit t
18180 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20  his program\n". 
18190 20 22 2e 65 78 70 65 72 74 20 20 20 20 20 20 20   ".expert       
181a0 20 20 20 20 20 20 20 20 20 45 58 50 45 52 49 4d           EXPERIM
181b0 45 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69  ENTAL. Suggest i
181c0 6e 64 65 78 65 73 20 66 6f 72 20 73 70 65 63 69  ndexes for speci
181d0 66 69 65 64 20 71 75 65 72 69 65 73 5c 6e 22 0a  fied queries\n".
181e0 2f 2a 20 42 65 63 61 75 73 65 20 65 78 70 6c 61  /* Because expla
181f0 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e  in mode comes on
18200 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e   automatically n
18210 6f 77 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69  ow, the ".explai
18220 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65  n" mode.** is re
18230 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68  moved from the h
18240 65 6c 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20  elp screen.  It 
18250 69 73 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74  is still support
18260 65 64 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68  ed for legacy, h
18270 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78  owever */./*".ex
18280 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75  plain ?on|off|au
18290 74 6f 3f 20 54 75 72 6e 20 45 58 50 4c 41 49 4e  to? Turn EXPLAIN
182a0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20   output mode on 
182b0 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74  or off or to aut
182c0 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a 20 20 22 2e  omatic\n"*/.  ".
182d0 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  fullschema ?--in
182e0 64 65 6e 74 3f 20 53 68 6f 77 20 73 63 68 65 6d  dent? Show schem
182f0 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  a and the conten
18300 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  t of sqlite_stat
18310 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 2e 68   tables\n".  ".h
18320 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20  eaders on|off   
18330 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61       Turn displa
18340 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20  y of headers on 
18350 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 68 65  or off\n".  ".he
18360 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lp              
18370 20 20 20 20 53 68 6f 77 20 74 68 69 73 20 6d 65      Show this me
18380 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69 6d 70  ssage\n".  ".imp
18390 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20  ort FILE TABLE  
183a0 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20 66     Import data f
183b0 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54 41  rom FILE into TA
183c0 42 4c 45 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53  BLE\n".#ifndef S
183d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f  QLITE_OMIT_TEST_
183e0 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f  CONTROL.  ".impo
183f0 73 74 65 72 20 49 4e 44 45 58 20 54 41 42 4c 45  ster INDEX TABLE
18400 20 20 43 72 65 61 74 65 20 69 6d 70 6f 73 74 65    Create imposte
18410 72 20 74 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e  r table TABLE on
18420 20 69 6e 64 65 78 20 49 4e 44 45 58 5c 6e 22 0a   index INDEX\n".
18430 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64 65 78  #endif.  ".index
18440 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20  es ?TABLE?      
18450 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 61   Show names of a
18460 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22 0a 20 20  ll indexes\n".  
18470 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18480 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
18490 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e  LE specified, on
184a0 6c 79 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20  ly show indexes 
184b0 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20  for tables\n".  
184c0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
184d0 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 69            matchi
184e0 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20  ng LIKE pattern 
184f0 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66 64 65 66  TABLE.\n".#ifdef
18500 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
18510 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61  OTRACE.  ".iotra
18520 63 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ce FILE         
18530 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67   Enable I/O diag
18540 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74  nostic logging t
18550 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64 69 66  o FILE\n".#endif
18560 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49  .  ".limit ?LIMI
18570 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69 73 70 6c  T? ?VAL?   Displ
18580 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74 68 65  ay or change the
18590 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c   value of an SQL
185a0 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a 20 20 22  ITE_LIMIT\n".  "
185b0 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20 20  .lint OPTIONS   
185c0 20 20 20 20 20 20 20 52 65 70 6f 72 74 20 70 6f         Report po
185d0 74 65 6e 74 69 61 6c 20 73 63 68 65 6d 61 20 69  tential schema i
185e0 73 73 75 65 73 2e 20 4f 70 74 69 6f 6e 73 3a 5c  ssues. Options:\
185f0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
18610 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20  key-indexes     
18620 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72  Find missing for
18630 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73  eign key indexes
18640 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  \n".#ifndef SQLI
18650 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
18660 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20  ENSION.  ".load 
18670 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20  FILE ?ENTRY?    
18680 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73 69   Load an extensi
18690 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a 23 65  on library\n".#e
186a0 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c  ndif.  ".log FIL
186b0 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54  E|off          T
186c0 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f  urn logging on o
186d0 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e  r off.  FILE can
186e0 20 62 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75   be stderr/stdou
186f0 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f  t\n".  ".mode MO
18700 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 53  DE ?TABLE?     S
18710 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 77  et output mode w
18720 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f 6e 65  here MODE is one
18730 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20   of:\n".  "     
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c      ascii    Col
18760 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69  umns/rows delimi
18770 74 65 64 20 62 79 20 30 78 31 46 20 61 6e 64 20  ted by 0x1F and 
18780 30 78 31 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  0x1E\n".  "     
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d      csv      Com
187b0 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ma-separated val
187c0 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ues\n".  "      
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187e0 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74     column   Left
187f0 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73  -aligned columns
18800 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29 5c  .  (See .width)\
18810 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
18830 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61  tml     HTML <ta
18840 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20 20 22  ble> code\n".  "
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20           insert 
18870 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61    SQL insert sta
18880 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c  tements for TABL
18890 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  E\n".  "        
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76 61   line     One va
188c0 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a  lue per line\n".
188d0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
188e0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
188f0 20 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69       Values deli
18900 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22 5c 6e  mited by \"|\"\n
18910 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75                qu
18930 6f 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e  ote    Escape an
18940 73 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c  swers as for SQL
18950 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 74 61 62 73 20 20 20 20 20 54 61 62 2d 73 65 70  tabs     Tab-sep
18980 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22  arated values\n"
18990 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c               tcl
189b0 20 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65        TCL list e
189c0 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e  lements\n".  ".n
189d0 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20  ullvalue STRING 
189e0 20 20 20 20 20 55 73 65 20 53 54 52 49 4e 47 20       Use STRING 
189f0 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c  in place of NULL
18a00 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e 6f   values\n".  ".o
18a10 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29  nce (-e|-x|FILE)
18a20 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20       Output for 
18a30 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d  the next SQL com
18a40 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c  mand only to FIL
18a50 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  E\n".  "        
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 6f 72 20 69 6e 76 6f 6b 65 20 73 79 73 74 65   or invoke syste
18a80 6d 20 74 65 78 74 20 65 64 69 74 6f 72 20 28 2d  m text editor (-
18a90 65 29 20 6f 72 20 73 70 72 65 61 64 73 68 65 65  e) or spreadshee
18aa0 74 20 28 2d 78 29 5c 6e 22 0a 20 20 22 20 20 20  t (-x)\n".  "   
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 20 6f 6e 20 74 68 65 20 6f 75 74        on the out
18ad0 70 75 74 2e 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e  put.\n".  ".open
18ae0 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45   ?OPTIONS? ?FILE
18af0 3f 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e 67  ? Close existing
18b00 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
18b10 6f 70 65 6e 20 46 49 4c 45 5c 6e 22 0a 20 20 22  open FILE\n".  "
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b30 20 20 20 20 20 20 20 20 20 54 68 65 20 2d 2d 6e           The --n
18b40 65 77 20 6f 70 74 69 6f 6e 20 73 74 61 72 74 73  ew option starts
18b50 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79 20 66   with an empty f
18b60 69 6c 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ile\n".  "      
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73     Other options
18b90 3a 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 2d 2d 61  : --readonly --a
18ba0 70 70 65 6e 64 20 2d 2d 7a 69 70 5c 6e 22 0a 20  ppend --zip\n". 
18bb0 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f   ".output ?FILE?
18bc0 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
18bd0 74 70 75 74 20 74 6f 20 46 49 4c 45 20 6f 72 20  tput to FILE or 
18be0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72  stdout\n".  ".pr
18bf0 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20  int STRING...   
18c00 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61      Print litera
18c10 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e  l STRING\n".  ".
18c20 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54  prompt MAIN CONT
18c30 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74 68  INUE  Replace th
18c40 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70  e standard promp
18c50 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20  ts\n".  ".quit  
18c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c70 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
18c80 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49  m\n".  ".read FI
18c90 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45  LENAME         E
18ca0 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49  xecute SQL in FI
18cb0 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65  LENAME\n".  ".re
18cc0 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20  store ?DB? FILE 
18cd0 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74      Restore cont
18ce0 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75  ent of DB (defau
18cf0 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f  lt \"main\") fro
18d00 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61  m FILE\n".  ".sa
18d10 76 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ve FILE         
18d20 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d      Write in-mem
18d30 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74  ory database int
18d40 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63  o FILE\n".  ".sc
18d50 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20  anstats on|off  
18d60 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33      Turn sqlite3
18d70 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
18d80 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72  () metrics on or
18d90 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65   off\n".  ".sche
18da0 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20  ma ?PATTERN?    
18db0 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54    Show the CREAT
18dc0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74  E statements mat
18dd0 63 68 69 6e 67 20 50 41 54 54 45 52 4e 5c 6e 22  ching PATTERN\n"
18de0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64                Ad
18e00 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72 20 70  d --indent for p
18e10 72 65 74 74 79 2d 70 72 69 6e 74 69 6e 67 5c 6e  retty-printing\n
18e20 22 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f  ".  ".selftest ?
18e30 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52 75 6e 20  --init?     Run 
18e40 74 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e  tests defined in
18e50 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
18e60 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72  ble\n".  ".separ
18e70 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20  ator COL ?ROW?  
18e80 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75   Change the colu
18e90 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 61 6e 64  mn separator and
18ea0 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65 20   optionally the 
18eb0 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  row\n".  "      
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 20 20 20 73 65 70 61 72 61 74 6f 72 20 66 6f 72     separator for
18ee0 20 62 6f 74 68 20 74 68 65 20 6f 75 74 70 75 74   both the output
18ef0 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72   mode and .impor
18f00 74 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64  t\n".#if defined
18f10 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
18f20 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73  ESSION).  ".sess
18f30 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20  ion CMD ...     
18f40 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74    Create or cont
18f50 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e 22 0a  rol sessions\n".
18f60 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33 73  #endif.  ".sha3s
18f70 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20  um ?OPTIONS...? 
18f80 20 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20   Compute a SHA3 
18f90 68 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65  hash of database
18fa0 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 23 69 66 6e   content\n".#ifn
18fb0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
18fc0 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68 65  E_SYSTEM.  ".she
18fd0 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20  ll CMD ARGS...  
18fe0 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e     Run CMD ARGS.
18ff0 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73  .. in a system s
19000 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  hell\n".#endif. 
19010 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20   ".show         
19020 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
19030 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
19040 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74   for various set
19050 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61  tings\n".  ".sta
19060 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20  ts ?on|off?     
19070 20 20 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72     Show stats or
19080 20 74 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f   turn stats on o
19090 72 20 6f 66 66 5c 6e 22 0a 23 69 66 6e 64 65 66  r off\n".#ifndef
190a0 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
190b0 59 53 54 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d  YSTEM.  ".system
190c0 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20   CMD ARGS...    
190d0 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
190e0 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
190f0 6c 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  l\n".#endif.  ".
19100 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20  tables ?TABLE?  
19110 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73        List names
19120 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20   of tables\n".  
19130 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19140 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
19150 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e  LE specified, on
19160 6c 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20 6d  ly list tables m
19170 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20  atching\n".  "  
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19190 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74         LIKE patt
191a0 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20  ern TABLE.\n".  
191b0 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45 20  ".testcase NAME 
191c0 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 72 65          Begin re
191d0 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74  directing output
191e0 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75   to 'testcase-ou
191f0 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22 2e 74 69  t.txt'\n".  ".ti
19200 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20 20  meout MS        
19210 20 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20      Try opening 
19220 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f  locked tables fo
19230 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r MS millisecond
19240 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 72 20 6f  s\n".  ".timer o
19250 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54  n|off          T
19260 75 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e  urn SQL timer on
19270 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74   or off\n".  ".t
19280 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 20 20 20  race FILE|off   
19290 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68       Output each
192a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
192b0 73 20 69 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20  s it is run\n". 
192c0 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f   ".vfsinfo ?AUX?
192d0 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d 61           Informa
192e0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74  tion about the t
192f0 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c 6e 22 0a  op-level VFS\n".
19300 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20    ".vfslist     
19310 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 61            List a
19320 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53  ll available VFS
19330 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73 6e 61 6d  es\n".  ".vfsnam
19340 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  e ?AUX?         
19350 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f  Print the name o
19360 66 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 5c  f the VFS stack\
19370 6e 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d  n".  ".width NUM
19380 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74  1 NUM2 ...   Set
19390 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66   column widths f
193a0 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f  or \"column\" mo
193b0 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  de\n".  "       
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65    Negative value
193e0 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 5c  s right-justify\
193f0 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  n".;..#if define
19400 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
19410 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50  SESSION)./*.** P
19420 72 69 6e 74 20 68 65 6c 70 20 69 6e 66 6f 72 6d  rint help inform
19430 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 22 2e  ation for the ".
19440 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d 6d 61 6e  sessions" comman
19450 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73 73 69 6f  d.*/.void sessio
19460 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53 74 61 74  n_help(ShellStat
19470 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f 70 72 69  e *p){.  raw_pri
19480 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20 20 20 20  ntf(p->out,.    
19490 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f  ".session ?NAME?
194a0 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f 41 52 47   SUBCOMMAND ?ARG
194b0 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20 22 49 66  S...?\n".    "If
194c0 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74   ?NAME? is omitt
194d0 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64 65  ed, the first de
194e0 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73  fined session is
194f0 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20 20 22 53   used.\n".    "S
19500 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a 20  ubcommands:\n". 
19510 20 20 20 22 20 20 20 61 74 74 61 63 68 20 54 41     "   attach TA
19520 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  BLE             
19530 41 74 74 61 63 68 20 54 41 42 4c 45 5c 6e 22 0a  Attach TABLE\n".
19540 20 20 20 20 22 20 20 20 63 68 61 6e 67 65 73 65      "   changese
19550 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  t FILE          
19560 20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73   Write a changes
19570 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a  et into FILE\n".
19580 20 20 20 20 22 20 20 20 63 6c 6f 73 65 20 20 20      "   close   
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195a0 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73 69   Close one sessi
195b0 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 65 6e  on\n".    "   en
195c0 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20  able ?BOOLEAN?  
195d0 20 20 20 20 20 20 20 53 65 74 20 6f 72 20 71 75         Set or qu
195e0 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20 62  ery the enable b
195f0 69 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 66 69  it\n".    "   fi
19600 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20  lter GLOB...    
19610 20 20 20 20 20 20 20 52 65 6a 65 63 74 20 74 61         Reject ta
19620 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47 4c  bles matching GL
19630 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69  OBs\n".    "   i
19640 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
19650 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72 20  ?       Mark or 
19660 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72 65  query the indire
19670 63 74 20 73 74 61 74 75 73 5c 6e 22 0a 20 20 20  ct status\n".   
19680 20 22 20 20 20 69 73 65 6d 70 74 79 20 20 20 20   "   isempty    
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75                Qu
196a0 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ery whether the 
196b0 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79  session is empty
196c0 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c 69 73 74  \n".    "   list
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e       List curren
196f0 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  tly open session
19700 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20 20 22 20   names\n".    " 
19710 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20    open DB NAME  
19720 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20             Open 
19730 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e  a new session on
19740 20 44 42 5c 6e 22 0a 20 20 20 20 22 20 20 20 70   DB\n".    "   p
19750 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20  atchset FILE    
19760 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
19770 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49  patchset into FI
19780 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65 6e  LE\n".  );.}.#en
19790 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  dif.../* Forward
197a0 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
197b0 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
197c0 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74  _input(ShellStat
197d0 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b  e *p, FILE *in);
197e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
197f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65   content of file
19800 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f   zName into memo
19810 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
19820 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
19830 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  4().** and retur
19840 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19850 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63  he buffer. The c
19860 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
19870 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
19880 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a  .** the memory..
19890 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
198a0 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74  er pnByte is not
198b0 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29   NULL, (*pnByte)
198c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
198d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
198e0 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  * read..**.** Fo
198f0 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61  r convenience, a
19900 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
19910 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61  byte is always a
19920 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
19930 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d  ata read.** from
19940 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
19950 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72   the buffer is r
19960 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79  eturned. This by
19970 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  te is not includ
19980 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e  ed in.** the fin
19990 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e  al value of (*pn
199a0 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63  Byte), if applic
199b0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c  able..**.** NULL
199c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
199d0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
199e0 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69  ountered. The fi
199f0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e  nal value of *pn
19a00 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66  Byte.** is undef
19a10 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
19a20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
19a30 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73  r *readFile(cons
19a40 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
19a50 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46  nt *pnByte){.  F
19a60 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28  ILE *in = fopen(
19a70 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
19a80 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65  long nIn;.  size
19a90 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72  _t nRead;.  char
19aa0 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e   *pBuf;.  if( in
19ab0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
19ac0 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
19ad0 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20  EEK_END);.  nIn 
19ae0 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72  = ftell(in);.  r
19af0 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75  ewind(in);.  pBu
19b00 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f = sqlite3_mall
19b10 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20  oc64( nIn+1 );. 
19b20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20 72   if( pBuf==0 ) r
19b30 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64  eturn 0;.  nRead
19b40 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e   = fread(pBuf, n
19b50 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63  In, 1, in);.  fc
19b60 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20  lose(in);.  if( 
19b70 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20  nRead!=1 ){.    
19b80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
19b90 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  f);.    return 0
19ba0 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e  ;.  }.  pBuf[nIn
19bb0 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42  ] = 0;.  if( pnB
19bc0 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20  yte ) *pnByte = 
19bd0 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  nIn;.  return pB
19be0 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  uf;.}..#if defin
19bf0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
19c00 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20  _SESSION)./*.** 
19c10 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f  Close a single O
19c20 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63  penSession objec
19c30 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  t and release al
19c40 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61  l of its associa
19c50 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73  ted.** resources
19c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19c70 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f   session_close(O
19c80 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
19c90 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  sion){.  int i;.
19ca0 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
19cb0 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e  _delete(pSession
19cc0 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ->p);.  sqlite3_
19cd0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a  free(pSession->z
19ce0 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Name);.  for(i=0
19cf0 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46  ; i<pSession->nF
19d00 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ilter; i++){.   
19d10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
19d20 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
19d30 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
19d40 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
19d50 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20  n->azFilter);.  
19d60 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c  memset(pSession,
19d70 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53   0, sizeof(OpenS
19d80 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64  ession));.}.#end
19d90 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
19da0 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  all OpenSession 
19db0 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65  objects and rele
19dc0 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  ase all associat
19dd0 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ed resources..*/
19de0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19df0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
19e00 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ON).static void 
19e10 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
19e20 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  l(ShellState *p)
19e30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
19e40 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
19e50 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ion; i++){.    s
19e60 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d  ession_close(&p-
19e70 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20  >aSession[i]);. 
19e80 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   }.  p->nSession
19e90 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20   = 0;.}.#else.# 
19ea0 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63  define session_c
19eb0 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64  lose_all(X).#end
19ec0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  if../*.** Implem
19ed0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
19ee0 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e  xFilter function
19ef0 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73   for an open ses
19f00 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61  sion.  Omit.** a
19f10 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20  ny tables named 
19f20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c  by ".session fil
19f30 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c  ter" but let all
19f40 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68 72   other table thr
19f50 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ough..*/.#if def
19f60 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
19f70 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74  LE_SESSION).stat
19f80 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66  ic int session_f
19f90 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78  ilter(void *pCtx
19fa0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
19fb0 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69  ab){.  OpenSessi
19fc0 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28  on *pSession = (
19fd0 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74  OpenSession*)pCt
19fe0 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  x;.  int i;.  fo
19ff0 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f  r(i=0; i<pSessio
1a000 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29  n->nFilter; i++)
1a010 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1a020 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69  3_strglob(pSessi
1a030 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c  on->azFilter[i],
1a040 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75   zTab)==0 ) retu
1a050 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1a060 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
1a070 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 64  /*.** Try to ded
1a080 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  uce the type of 
1a090 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62  file for zName b
1a0a0 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74  ased on its cont
1a0b0 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
1a0c0 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c 4c  one of the SHELL
1a0d0 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74  _OPEN_* constant
1a0e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a0f0 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54   deduceDatabaseT
1a100 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
1a110 7a 4e 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a  zName){.  FILE *
1a120 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  f = fopen(zName,
1a130 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74   "rb");.  size_t
1a140 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   n;.  int rc = S
1a150 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1a160 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1a170 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29  0];.  if( f==0 )
1a180 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
1a190 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 66 73 65  EN_NORMAL;.  fse
1a1a0 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f  ek(f, -25, SEEK_
1a1b0 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61  END);.  n = frea
1a1c0 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66  d(zBuf, 25, 1, f
1a1d0 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  );.  if( n==1 &&
1a1e0 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53   memcmp(zBuf, "S
1a1f0 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d  tart-Of-SQLite3-
1a200 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
1a210 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
1a220 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65  _APPENDVFS;.  }e
1a230 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66  lse{.    fseek(f
1a240 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29  , -22, SEEK_END)
1a250 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
1a260 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b  zBuf, 22, 1, f);
1a270 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
1a280 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26   zBuf[0]==0x50 &
1a290 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20  & zBuf[1]==0x4b 
1a2a0 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35  && zBuf[2]==0x05
1a2b0 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b  .       && zBuf[
1a2c0 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20  3]==0x06 ){.    
1a2d0 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
1a2e0 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
1a2f0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
1a300 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ;.  return rc;  
1a310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1a320 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
1a330 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74   is open.  If it
1a340 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70   is not, then op
1a350 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  en it.  If.** th
1a360 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73  e database fails
1a370 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20   to open, print 
1a380 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1a390 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74   and exit..*/.st
1a3a0 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64  atic void open_d
1a3b0 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  b(ShellState *p,
1a3c0 20 69 6e 74 20 6b 65 65 70 41 6c 69 76 65 29 7b   int keepAlive){
1a3d0 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
1a3e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
1a3f0 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20  nitialize();.   
1a400 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
1a410 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  ==SHELL_OPEN_UNS
1a420 50 45 43 20 26 26 20 61 63 63 65 73 73 28 70 2d  PEC && access(p-
1a430 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 30 29 3d  >zDbFilename,0)=
1a440 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  =0 ){.      p->o
1a450 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65  penMode = (u8)de
1a460 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65  duceDatabaseType
1a470 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29  (p->zDbFilename)
1a480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
1a490 63 68 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20  ch( p->openMode 
1a4a0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  ){.      case SH
1a4b0 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
1a4c0 46 53 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FS: {.        sq
1a4d0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d  lite3_open_v2(p-
1a4e0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
1a4f0 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
1a500 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1a510 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1a520 50 45 4e 5f 43 52 45 41 54 45 2c 20 22 61 70 6e  PEN_CREATE, "apn
1a530 64 76 66 73 22 29 3b 0a 20 20 20 20 20 20 20 20  dvfs");.        
1a540 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a550 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1a560 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a  OPEN_ZIPFILE: {.
1a570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a580 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c  open(":memory:",
1a590 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20   &p->db);.      
1a5a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a5b0 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
1a5c0 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a  L_OPEN_READONLY:
1a5d0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1a5e0 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44  e3_open_v2(p->zD
1a5f0 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
1a600 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  b, SQLITE_OPEN_R
1a610 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  EADONLY, 0);.   
1a620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a630 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1a640 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1a650 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  :.      case SHE
1a660 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20  LL_OPEN_NORMAL: 
1a670 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a680 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c  3_open(p->zDbFil
1a690 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  ename, &p->db);.
1a6a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a6b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a6c0 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64   globalDb = p->d
1a6d0 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  b;.    if( p->db
1a6e0 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ==0 || SQLITE_OK
1a6f0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
1a700 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
1a710 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1a720 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
1a730 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
1a740 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c  base \"%s\": %s\
1a750 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  n",.          p-
1a760 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
1a770 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1a780 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
1a790 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74 75  keepAlive ) retu
1a7a0 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  rn;.      exit(1
1a7b0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
1a7c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
1a7d0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
1a7e0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
1a7f0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
1a800 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
1a810 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1a820 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
1a830 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a840 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
1a850 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1a860 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
1a870 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
1a880 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
1a890 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
1a8a0 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
1a8b0 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
1a8c0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1a8d0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
1a8e0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
1a8f0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
1a900 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1a910 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
1a920 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
1a930 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a950 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
1a960 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
1a970 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1a980 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1a990 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
1a9a0 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
1a9b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1a9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
1a9e0 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
1a9f0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1aa00 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1aa10 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
1aa20 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
1aa30 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20  ITE_UTF8, p,.   
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75           shellPu
1aa60 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23  tsFunc, 0, 0);.#
1aa70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1aa80 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20  HAVE_SYSTEM.    
1aa90 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1aaa0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1aab0 65 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  edit", 1, SQLITE
1aac0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 20 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20        editFunc, 
1aaf0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1ab00 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1ab10 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22  on(p->db, "edit"
1ab20 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
1ab30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab50 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29   editFunc, 0, 0)
1ab60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1ab70 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1ab80 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1ab90 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1aba0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1abb0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1abc0 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
1abd0 20 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47   TABLE zip USING
1abe0 20 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20   zipfile(%Q);", 
1abf0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b  p->zDbFilename);
1ac00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
1ac10 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
1ac20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1ac30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1ac40 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ql);.    }.  }.}
1ac50 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c  ..#if HAVE_READL
1ac60 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54  INE || HAVE_EDIT
1ac70 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c  LINE./*.** Readl
1ac80 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ine completion c
1ac90 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74  allbacks.*/.stat
1aca0 69 63 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e  ic char *readlin
1acb0 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e  e_completion_gen
1acc0 65 72 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61  erator(const cha
1acd0 72 20 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61  r *text, int sta
1ace0 74 65 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  te){.  static sq
1acf0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ad00 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
1ad10 52 65 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65  Ret;.  if( state
1ad20 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
1ad30 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74  *zSql;.    sqlit
1ad40 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1ad50 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  t);.    zSql = s
1ad60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1ad70 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1ad80 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
1ad90 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d       "  FROM com
1adc0 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45  pletion(%Q) ORDE
1add0 52 20 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a  R BY 1", text);.
1ade0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
1adf0 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c  are_v2(globalDb,
1ae00 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1ae10 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
1ae20 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1ae30 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1ae40 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
1ae50 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1ae60 7a 52 65 74 20 3d 20 73 74 72 64 75 70 28 28 63  zRet = strdup((c
1ae70 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1ae80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1ae90 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c  Stmt, 0));.  }el
1aea0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
1aeb0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1aec0 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a  .    pStmt = 0;.
1aed0 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
1aee0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
1aef0 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  .}.static char *
1af00 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65  *readline_comple
1af10 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
1af20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61  *zText, int iSta
1af30 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20  rt, int iEnd){. 
1af40 20 72 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f   rl_attempted_co
1af50 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20  mpletion_over = 
1af60 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63  1;.  return rl_c
1af70 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65  ompletion_matche
1af80 73 28 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e  s(zText, readlin
1af90 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e  e_completion_gen
1afa0 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69  erator);.}..#eli
1afb0 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45  f HAVE_LINENOISE
1afc0 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65  ./*.** Linenoise
1afd0 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c   completion call
1afe0 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  back.*/.static v
1aff0 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f  oid linenoise_co
1b000 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63  mpletion(const c
1b010 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65  har *zLine, line
1b020 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73  noiseCompletions
1b030 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *lc){.  int nLi
1b040 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c  ne = strlen30(zL
1b050 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69  ine);.  int i, i
1b060 53 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33  Start;.  sqlite3
1b070 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1b080 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1b090 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
1b0a0 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e  ];..  if( nLine>
1b0b0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20  sizeof(zBuf)-30 
1b0c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1b0d0 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20  zLine[0]=='.' ) 
1b0e0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1b0f0 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26  nLine-1; i>=0 &&
1b100 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b   (isalnum(zLine[
1b110 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d  i]) || zLine[i]=
1b120 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='_'); i--){}.  
1b130 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29  if( i==nLine-1 )
1b140 20 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72   return;.  iStar
1b150 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70  t = i+1;.  memcp
1b160 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69  y(zBuf, zLine, i
1b170 53 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  Start);.  zSql =
1b180 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1b190 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43  ("SELECT DISTINC
1b1a0 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c  T candidate COLL
1b1b0 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20  ATE nocase".    
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d       "  FROM com
1b1e0 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f  pletion(%Q,%Q) O
1b1f0 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20  RDER BY 1",.    
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61       &zLine[iSta
1b220 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73  rt], zLine);.  s
1b230 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1b240 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c  2(globalDb, zSql
1b250 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
1b260 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1b270 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zSql);.  sqlite
1b280 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c  3_exec(globalDb,
1b290 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f   "PRAGMA page_co
1b2a0 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20  unt", 0, 0, 0); 
1b2b0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65  /* Load the sche
1b2c0 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73  ma */.  while( s
1b2d0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1b2e0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
1b2f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1b300 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20   *zCompletion = 
1b310 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1b320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1b330 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
1b340 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  int nCompletion 
1b350 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1b360 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29  _bytes(pStmt, 0)
1b370 3b 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  ;.    if( iStart
1b380 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73  +nCompletion < s
1b390 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b  izeof(zBuf)-1 ){
1b3a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
1b3b0 75 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70  uf+iStart, zComp
1b3c0 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74  letion, nComplet
1b3d0 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69  ion+1);.      li
1b3e0 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65  nenoiseAddComple
1b3f0 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a  tion(lc, zBuf);.
1b400 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1b410 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1b420 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  mt);.}.#endif../
1b430 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61  *.** Do C-langua
1b440 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69  ge style dequoti
1b450 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20  ng..**.**    \a 
1b460 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20     -> alarm.**  
1b470 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73    \b    -> backs
1b480 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20  pace.**    \t   
1b490 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e   -> tab.**    \n
1b4a0 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a      -> newline.*
1b4b0 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65  *    \v    -> ve
1b4c0 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20  rtical tab.**   
1b4d0 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66   \f    -> form f
1b4e0 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20  eed.**    \r    
1b4f0 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75  -> carriage retu
1b500 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d  rn.**    \s    -
1b510 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22  > space.**    \"
1b520 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c      -> ".**    \
1b530 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20  '    -> '.**    
1b540 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61  \\    -> backsla
1b550 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d  sh.**    \NNN  -
1b560 3e 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65  > ascii characte
1b570 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a  r NNN in octal.*
1b580 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1b590 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
1b5a0 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  s(char *z){.  in
1b5b0 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
1b5c0 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26  ;.  while( *z &&
1b5d0 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b   *z!='\\' ) z++;
1b5e0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63  .  for(i=j=0; (c
1b5f0 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
1b600 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , j++){.    if( 
1b610 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31  c=='\\' && z[i+1
1b620 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20  ]!=0 ){.      c 
1b630 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  = z[++i];.      
1b640 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20  if( c=='a' ){.  
1b650 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a        c = '\a';.
1b660 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b670 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20  c=='b' ){.      
1b680 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20    c = '\b';.    
1b690 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1b6a0 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  t' ){.        c 
1b6b0 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65  = '\t';.      }e
1b6c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29  lse if( c=='n' )
1b6d0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1b6e0 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n';.      }else 
1b6f0 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20  if( c=='v' ){.  
1b700 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a        c = '\v';.
1b710 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b720 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
1b730 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
1b740 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1b750 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  r' ){.        c 
1b760 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65  = '\r';.      }e
1b770 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
1b780 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22  {.        c = '"
1b790 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1b7a0 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
1b7b0 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a        c = '\'';.
1b7c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b7d0 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
1b7e0 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20     c = '\\';.   
1b7f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
1b800 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
1b810 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
1b820 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
1b830 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
1b840 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
1b850 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1b860 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
1b870 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
1b880 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
1b890 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
1b8a0 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
1b8b0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1b8c0 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
1b8d0 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
1b8e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b900 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
1b910 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69  c;.  }.  if( j<i
1b920 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a   ) z[j] = 0;.}..
1b930 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
1b940 7a 41 72 67 20 61 73 20 65 69 74 68 65 72 20 61  zArg as either a
1b950 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62  n integer or a b
1b960 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52  oolean value.  R
1b970 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20  eturn 1 or 0.** 
1b980 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c  for TRUE and FAL
1b990 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  SE.  Return the 
1b9a0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 66  integer value if
1b9b0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
1b9c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c  .static int bool
1b9d0 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  eanValue(const c
1b9e0 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e  har *zArg){.  in
1b9f0 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  t i;.  if( zArg[
1ba00 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  0]=='0' && zArg[
1ba10 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66  1]=='x' ){.    f
1ba20 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74  or(i=2; hexDigit
1ba30 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d  Value(zArg[i])>=
1ba40 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73  0; i++){}.  }els
1ba50 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
1ba60 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20  zArg[i]>='0' && 
1ba70 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b  zArg[i]<='9'; i+
1ba80 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69  +){}.  }.  if( i
1ba90 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30  >0 && zArg[i]==0
1baa0 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28   ) return (int)(
1bab0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72  integerValue(zAr
1bac0 67 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  g) & 0xffffffff)
1bad0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
1bae0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f  stricmp(zArg, "o
1baf0 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  n")==0 || sqlite
1bb00 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
1bb10 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yes")==0 ){.    
1bb20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1bb30 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
1bb40 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29  cmp(zArg, "off")
1bb50 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
1bb60 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22  tricmp(zArg,"no"
1bb70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1bb80 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38  rn 0;.  }.  utf8
1bb90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1bba0 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f  "ERROR: Not a bo
1bbb0 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25  olean value: \"%
1bbc0 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22  s\". Assuming \"
1bbd0 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  no\".\n",.      
1bbe0 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74      zArg);.  ret
1bbf0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1bc00 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73  Set or clear a s
1bc10 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64  hell flag accord
1bc20 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e  ing to a boolean
1bc30 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1bc40 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61  c void setOrClea
1bc50 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65  rFlag(ShellState
1bc60 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46   *p, unsigned mF
1bc70 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  lag, const char 
1bc80 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f  *zArg){.  if( bo
1bc90 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29  oleanValue(zArg)
1bca0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74   ){.    ShellSet
1bcb0 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a  Flag(p, mFlag);.
1bcc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65    }else{.    She
1bcd0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d  llClearFlag(p, m
1bce0 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Flag);.  }.}../*
1bcf0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74  .** Close an out
1bd00 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69  put file, assumi
1bd10 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64  ng it is not std
1bd20 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f  err or stdout.*/
1bd30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
1bd40 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46  put_file_close(F
1bd50 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66  ILE *f){.  if( f
1bd60 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26   && f!=stdout &&
1bd70 20 66 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c   f!=stderr ) fcl
1bd80 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ose(f);.}../*.**
1bd90 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20   Try to open an 
1bda0 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54  output file.   T
1bdb0 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74  he names "stdout
1bdc0 22 20 61 6e 64 20 22 73 74 64 65 72 72 22 20 61  " and "stderr" a
1bdd0 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64  re.** recognized
1bde0 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68   and do the righ
1bdf0 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69  t thing.  NULL i
1be00 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1be10 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65  e output.** file
1be20 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a  name is "off"..*
1be30 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f  /.static FILE *o
1be40 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
1be50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1be60 65 2c 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65  e, int bTextMode
1be70 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20  ){.  FILE *f;.  
1be80 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1be90 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
1bea0 0a 20 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b  .    f = stdout;
1beb0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1bec0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65  cmp(zFile, "stde
1bed0 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  rr")==0 ){.    f
1bee0 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c   = stderr;.  }el
1bef0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
1bf00 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29  ile, "off")==0 )
1bf10 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d  {.    f = 0;.  }
1bf20 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f  else{.    f = fo
1bf30 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74  pen(zFile, bText
1bf40 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62  Mode ? "w" : "wb
1bf50 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30  ");.    if( f==0
1bf60 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1bf70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1bf80 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
1bf90 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
1bfa0 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  le);.    }.  }. 
1bfb0 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69   return f;.}..#i
1bfc0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1bfd0 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 0a 23 69  E_UNTESTABLE).#i
1bfe0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1bff0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
1c000 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1c010 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c020 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72 6f  OINT)./*.** A ro
1c030 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69  utine for handli
1c040 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 73  ng output from s
1c050 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a  qlite3_trace()..
1c060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1c070 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  l_trace_callback
1c080 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 79  (.  unsigned mTy
1c090 70 65 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  pe,.  void *pArg
1c0a0 2c 0a 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20 20  ,.  void *pP,.  
1c0b0 76 6f 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46 49  void *pX.){.  FI
1c0c0 4c 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70  LE *f = (FILE*)p
1c0d0 41 72 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Arg;.  UNUSED_PA
1c0e0 52 41 4d 45 54 45 52 28 6d 54 79 70 65 29 3b 0a  RAMETER(mType);.
1c0f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c100 45 52 28 70 50 29 3b 0a 20 20 69 66 28 20 66 20  ER(pP);.  if( f 
1c110 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c120 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
1c130 61 72 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74 20  ar*)pX;.    int 
1c140 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  i = strlen30(z);
1c150 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20  .    while( i>0 
1c160 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20 29  && z[i-1]==';' )
1c170 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 75 74 66  { i--; }.    utf
1c180 38 5f 70 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a  8_printf(f, "%.*
1c190 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  s;\n", i, z);.  
1c1a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c1b0 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f  #endif.#endif../
1c1c0 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75  *.** A no-op rou
1c1d0 74 69 6e 65 20 74 68 61 74 20 72 75 6e 73 20 77  tine that runs w
1c1e0 69 74 68 20 74 68 65 20 22 2e 62 72 65 61 6b 70  ith the ".breakp
1c1f0 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e  oint" doc-comman
1c200 64 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 61  d.  This is.** a
1c210 20 75 73 65 66 75 6c 20 73 70 6f 74 20 74 6f 20   useful spot to 
1c220 73 65 74 20 61 20 64 65 62 75 67 67 65 72 20 62  set a debugger b
1c230 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  reakpoint..*/.st
1c240 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62  atic void test_b
1c250 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b  reakpoint(void){
1c260 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43  .  static int nC
1c270 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c  all = 0;.  nCall
1c280 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ++;.}../*.** An 
1c290 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  object used to r
1c2a0 65 61 64 20 61 20 43 53 56 20 61 6e 64 20 6f 74  ead a CSV and ot
1c2b0 68 65 72 20 66 69 6c 65 73 20 66 6f 72 20 69 6d  her files for im
1c2c0 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  port..*/.typedef
1c2d0 20 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74   struct ImportCt
1c2e0 78 20 49 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72  x ImportCtx;.str
1c2f0 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a  uct ImportCtx {.
1c300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1c310 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ile;  /* Name of
1c320 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
1c330 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  */.  FILE *in;  
1c340 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
1c350 20 74 68 65 20 43 53 56 20 74 65 78 74 20 66 72   the CSV text fr
1c360 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 74  om this input st
1c370 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ream */.  char *
1c380 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  z;            /*
1c390 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78   Accumulated tex
1c3a0 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f  t for a field */
1c3b0 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
1c3c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c3d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a   of bytes in z *
1c3e0 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
1c3f0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1c400 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
1c410 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e  [] */.  int nLin
1c420 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  e;          /* C
1c430 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62  urrent line numb
1c440 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74  er */.  int bNot
1c450 46 69 72 73 74 3b 20 20 20 20 20 20 2f 2a 20 54  First;      /* T
1c460 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  rue if one or mo
1c470 72 65 20 62 79 74 65 73 20 61 6c 72 65 61 64 79  re bytes already
1c480 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63   read */.  int c
1c490 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
1c4a0 2a 20 43 68 61 72 61 63 74 65 72 20 74 68 61 74  * Character that
1c4b0 20 74 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20   terminated the 
1c4c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c  most recent fiel
1c4d0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53  d */.  int cColS
1c4e0 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
1c4f0 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
1c500 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28  or character.  (
1c510 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a  Usually ",") */.
1c520 20 20 69 6e 74 20 63 52 6f 77 53 65 70 3b 20 20    int cRowSep;  
1c530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
1c540 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
1c550 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20  cter.  (Usually 
1c560 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  "\n") */.};../* 
1c570 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20  Append a single 
1c580 62 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73  byte to z[] */.s
1c590 74 61 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72  tatic void impor
1c5a0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 49 6d  t_append_char(Im
1c5b0 70 6f 72 74 43 74 78 20 2a 70 2c 20 69 6e 74 20  portCtx *p, int 
1c5c0 63 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31  c){.  if( p->n+1
1c5d0 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
1c5e0 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20     p->nAlloc += 
1c5f0 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b  p->nAlloc + 100;
1c600 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69  .    p->z = sqli
1c610 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
1c620 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
1c630 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20      if( p->z==0 
1c640 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
1c650 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74  ntf(stderr, "out
1c660 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
1c670 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
1c680 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b     }.  }.  p->z[
1c690 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29  p->n++] = (char)
1c6a0 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  c;.}../* Read a 
1c6b0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
1c6c0 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61  CSV text.  Compa
1c6d0 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34 31  tible with rfc41
1c6e0 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a  80 and extended.
1c6f0 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74 69  ** with the opti
1c700 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73  on of having a s
1c710 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74  eparator other t
1c720 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20  han ","..**.**  
1c730 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
1c740 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
1c750 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
1c760 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
1c770 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
1c780 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
1c790 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
1c7a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1c7b0 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
1c7c0 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
1c7d0 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
1c7e0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1c7f0 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  s ","..**   +  U
1c800 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
1c810 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
1c820 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
1c830 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b   "\n"..**   +  K
1c840 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
1c850 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20   line number in 
1c860 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
1c870 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
1c880 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
1c890 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
1c8a0 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
1c8b0 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
1c8c0 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
1c8d0 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
1c8e0 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
1c8f0 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
1c900 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
1c910 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  ECL csv_read_one
1c920 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
1c930 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
1c940 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
1c950 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
1c960 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
1c970 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
1c980 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1c990 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
1c9a0 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
1c9b0 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
1c9c0 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
1c9d0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d   0;.  }.  if( c=
1c9e0 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='"' ){.    int 
1c9f0 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74  pc, ppc;.    int
1ca00 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e   startLine = p->
1ca10 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63  nLine;.    int c
1ca20 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70  Quote = c;.    p
1ca30 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20  c = ppc = 0;.   
1ca40 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1ca50 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1ca60 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  in);.      if( c
1ca70 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e  ==rSep ) p->nLin
1ca80 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  e++;.      if( c
1ca90 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
1caa0 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
1cab0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
1cac0 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
1cad0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1cae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1caf0 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70      if( (c==cSep
1cb00 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
1cb10 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
1cb20 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
1cb30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1cb40 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27  rSep && pc=='\r'
1cb50 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29   && ppc==cQuote)
1cb60 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45  .       || (c==E
1cb70 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  OF && pc==cQuote
1cb80 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1cb90 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d     do{ p->n--; }
1cba0 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e  while( p->z[p->n
1cbb0 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20  ]!=cQuote );.   
1cbc0 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
1cbd0 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
1cbe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cbf0 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26  if( pc==cQuote &
1cc00 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20  & c!='\r' ){.   
1cc10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1cc20 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
1cc30 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63 68   unescaped %c ch
1cc40 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20  aracter\n",.    
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
1cc60 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20  File, p->nLine, 
1cc70 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d  cQuote);.      }
1cc80 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f  .      if( c==EO
1cc90 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  F ){.        utf
1cca0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1ccb0 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69   "%s:%d: untermi
1ccc0 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20  nated %c-quoted 
1ccd0 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  field\n",.      
1cce0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
1ccf0 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63  le, startLine, c
1cd00 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
1cd10 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1cd20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cd30 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72     }.      impor
1cd40 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
1cd50 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d   c);.      ppc =
1cd60 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20   pc;.      pc = 
1cd70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1cd80 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
1cd90 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
1cda0 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65 64  eld being parsed
1cdb0 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77   and it begins w
1cdc0 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55  ith the.    ** U
1cdd0 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20  TF-8 BOM  (0xEF 
1cde0 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70  BB BF) then skip
1cdf0 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20   the BOM */.    
1ce00 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
1ce10 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72  ef && p->bNotFir
1ce20 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st==0 ){.      i
1ce30 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1ce40 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
1ce50 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1ce60 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78  .      if( (c&0x
1ce70 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20  ff)==0xbb ){.   
1ce80 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
1ce90 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
1cea0 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63         c = fgetc
1ceb0 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  (p->in);.       
1cec0 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1ced0 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xbf ){.         
1cee0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
1cef0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
1cf00 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1cf10 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64   return csv_read
1cf20 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20  _one_field(p);. 
1cf30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cf40 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1cf50 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63  ( c!=EOF && c!=c
1cf60 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29  Sep && c!=rSep )
1cf70 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
1cf80 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1cf90 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
1cfa0 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a  c(p->in);.    }.
1cfb0 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
1cfc0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e  ){.      p->nLin
1cfd0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
1cfe0 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d  ->n>0 && p->z[p-
1cff0 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d  >n-1]=='\r' ) p-
1d000 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >n--;.    }.    
1d010 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1d020 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  }.  if( p->z ) p
1d030 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
1d040 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
1d050 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a  1;.  return p->z
1d060 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73  ;.}../* Read a s
1d070 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41  ingle field of A
1d080 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74  SCII delimited t
1d090 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20  ext..**.**   +  
1d0a0 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d  Input comes from
1d0b0 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20   p->in..**   +  
1d0c0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
1d0d0 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20   p->z of length 
1d0e0 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  p->n.  Space to 
1d0f0 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a  hold p->z comes.
1d100 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c  **      from sql
1d110 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e  ite3_malloc64().
1d120 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1d130 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75  cSep as the colu
1d140 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  mn separator.  T
1d150 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
1d160 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  x1F"..**   +  Us
1d170 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65  e p->rSep as the
1d180 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
1d190 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
1d1a0 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1E"..**   +  
1d1b0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1d1c0 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20  e row number in 
1d1d0 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
1d1e0 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
1d1f0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
1d200 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
1d210 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
1d220 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
1d230 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
1d240 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
1d250 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
1d260 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
1d270 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
1d280 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  ECL ascii_read_o
1d290 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
1d2a0 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
1d2b0 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
1d2c0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
1d2d0 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
1d2e0 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
1d2f0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1d300 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
1d310 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
1d320 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
1d330 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
1d340 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rn 0;.  }.  whil
1d350 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
1d360 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
1d370 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  ){.    import_ap
1d380 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
1d390 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70  .    c = fgetc(p
1d3a0 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->in);.  }.  if(
1d3b0 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
1d3c0 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a  p->nLine++;.  }.
1d3d0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
1d3e0 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
1d3f0 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72  z[p->n] = 0;.  r
1d400 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
1d410 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e  *.** Try to tran
1d420 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74 61  sfer data for ta
1d430 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20  ble zTable.  If 
1d440 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
1d450 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67   while.** moving
1d460 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f   forward, try to
1d470 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20   go backwards.  
1d480 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f  The backwards mo
1d490 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20  vement won't.** 
1d4a0 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54  work for WITHOUT
1d4b0 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a   ROWID tables..*
1d4c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
1d4d0 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20  yToCloneData(.  
1d4e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1d4f0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1d500 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d510 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74  Table.){.  sqlit
1d520 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20  e3_stmt *pQuery 
1d530 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1d540 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
1d550 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
1d560 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49   = 0;.  char *zI
1d570 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nsert = 0;.  int
1d580 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c   rc;.  int i, j,
1d590 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65   n;.  int nTable
1d5a0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62   = strlen30(zTab
1d5b0 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
1d5c0 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
1d5d0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
1d5e0 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
1d5f0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1d600 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1d610 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
1d620 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
1d630 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1d640 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1d650 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1d660 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1d670 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1d680 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1d690 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1d6a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d6b0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1d6c0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1d6d0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1d6e0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1d6f0 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1d700 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1d710 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
1d720 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1d730 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
1d740 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
1d750 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20  _malloc64(200 + 
1d760 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20  nTable + n*3);. 
1d770 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20   if( zInsert==0 
1d780 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
1d790 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
1d7a0 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
1d7b0 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
1d7c0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xfer;.  }.  sqli
1d7d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
1d7e0 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
1d7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d800 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
1d810 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
1d820 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
1d830 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
1d840 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
1d850 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
1d860 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
1d870 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
1d880 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
1d890 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
1d8a0 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
1d8b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1d8c0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
1d8d0 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
1d8e0 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
1d8f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1d900 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1d910 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
1d920 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1d930 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d940 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1d950 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
1d960 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
1d970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
1d980 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1d990 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1d9a0 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
1d9b0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
1d9c0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1d9d0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1d9e0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1d9f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1da00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1da10 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
1da20 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
1da30 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
1da40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1da50 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
1da60 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1da70 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
1da80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
1da90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1daa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
1dab0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
1dac0 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
1dad0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1dae0 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
1daf0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1db00 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
1db10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1db20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1db30 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
1db40 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
1db50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1db60 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
1db70 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
1db80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1db90 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
1dba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1dbb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1dbc0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
1dbd0 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
1dbe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dbf0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
1dc00 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
1dc30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1dc40 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
1dc50 29 2c 0a 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 20 20 20                  
1dc70 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
1dc80 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
1dc90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1dca0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
1dcb0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1dcd0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
1dce0 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
1dcf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1dd00 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1dd40 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
1dd50 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
1dd90 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
1dda0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1ddb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ddc0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
1ddd0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1dde0 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
1ddf0 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
1de00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1de10 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
1de20 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
1de30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
1de40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1de50 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
1de60 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
1de70 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1de80 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
1de90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1dea0 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
1deb0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1dec0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
1ded0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
1dee0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
1def0 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
1df00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
1df10 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
1df20 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
1df30 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
1df40 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
1df50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
1df60 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
1df70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1df80 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
1df90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1dfa0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1dfb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1dfc0 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
1dfd0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1dfe0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
1dff0 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
1e000 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
1e010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1e030 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
1e040 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1e050 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1e060 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1e070 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1e080 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1e090 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
1e0a0 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
1e0b0 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
1e0c0 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
1e0d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e0e0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
1e0f0 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
1e100 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
1e110 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1e120 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
1e130 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
1e140 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
1e150 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
1e160 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
1e170 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
1e180 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
1e190 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
1e1a0 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
1e1b0 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
1e1c0 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
1e1d0 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
1e1e0 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
1e1f0 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
1e200 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
1e210 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
1e220 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
1e230 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
1e240 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
1e250 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
1e260 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
1e270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1e280 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
1e290 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
1e2a0 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
1e2b0 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
1e2c0 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
1e2d0 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
1e2e0 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
1e2f0 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
1e300 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
1e310 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
1e320 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
1e330 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1e340 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1e350 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
1e360 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e370 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
1e380 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
1e390 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1e3a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1e3b0 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
1e3c0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1e3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
1e3f0 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
1e400 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e410 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
1e420 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
1e430 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
1e440 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
1e450 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1e460 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
1e470 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1e4a0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1e4b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1e4c0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1e4e0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
1e4f0 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
1e500 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
1e510 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1e520 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
1e530 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
1e540 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1e550 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
1e560 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
1e570 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1e580 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
1e590 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
1e5a0 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
1e5b0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
1e5c0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1e5d0 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
1e5e0 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
1e5f0 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
1e600 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
1e610 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e620 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
1e630 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
1e640 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
1e650 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e660 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
1e670 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
1e680 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
1e690 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
1e6a0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
1e6b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
1e6c0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1e6d0 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
1e6e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1e6f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1e700 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1e710 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
1e720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
1e730 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
1e740 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1e750 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
1e760 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
1e770 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
1e7a0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
1e7b0 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
1e7c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e7d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1e7e0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1e7f0 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
1e800 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e810 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e820 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
1e830 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
1e840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1e860 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1e870 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1e880 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8a0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1e8b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
1e8c0 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
1e8d0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
1e8e0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
1e8f0 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
1e900 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
1e910 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
1e920 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
1e930 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
1e940 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e950 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
1e960 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
1e970 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
1e980 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
1e990 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1e9a0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
1e9b0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
1e9c0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
1e9d0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
1e9e0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1e9f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1ea00 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
1ea10 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
1ea20 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
1ea30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
1ea40 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
1ea50 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
1ea60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
1ea70 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
1ea80 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
1ea90 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
1eaa0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
1eab0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
1eac0 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
1ead0 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
1eae0 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
1eaf0 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
1eb00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1eb10 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
1eb20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
1eb30 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1eb40 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
1eb50 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
1eb60 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
1eb70 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
1eb80 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
1eb90 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
1eba0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
1ebb0 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
1ebc0 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
1ebd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
1ebe0 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
1ebf0 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
1ec00 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
1ec10 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
1ec20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
1ec30 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
1ec40 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
1ec50 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1ec60 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
1ec70 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
1ec80 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
1ec90 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
1eca0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
1ecb0 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
1ecc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ecd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1ece0 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
1ecf0 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
1ed00 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
1ed10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1ed20 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
1ed30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    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 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
1ed70 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1ed80 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
1ed90 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
1eda0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
1edb0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
1edc0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
1edd0 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
1ede0 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
1edf0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
1ee00 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
1ee10 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
1ee20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1ee30 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
1ee40 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
1ee50 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1ee60 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
1ee70 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
1ee80 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
1ee90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c    }.  sqlite3_cl
1eea0 6f 73 65 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f  ose(newDb);.}../
1eeb0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1eec0 6f 75 74 70 75 74 20 66 69 6c 65 20 62 61 63 6b  output file back
1eed0 20 74 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a   to stdout..**.*
1eee0 2a 20 49 66 20 74 68 65 20 70 2d 3e 64 6f 58 64  * If the p->doXd
1eef0 67 4f 70 65 6e 20 66 6c 61 67 20 69 73 20 73 65  gOpen flag is se
1ef00 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
1ef10 65 20 6f 75 74 70 75 74 20 77 61 73 20 62 65 69  e output was bei
1ef20 6e 67 0a 2a 2a 20 72 65 64 69 72 65 63 74 65 64  ng.** redirected
1ef30 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
1ef40 66 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 70 2d  file named by p-
1ef50 3e 7a 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20  >zTempFile.  In 
1ef60 74 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61  that case,.** la
1ef70 75 6e 63 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f  unch start/open/
1ef80 78 64 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74  xdg-open on that
1ef90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1efa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1efb0 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68 65  output_reset(She
1efc0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
1efd0 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  f( p->outfile[0]
1efe0 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66  =='|' ){.#ifndef
1eff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
1f000 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70 2d  EN.    pclose(p-
1f010 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  >out);.#endif.  
1f020 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70 75  }else{.    outpu
1f030 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
1f040 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  out);.#ifndef SQ
1f050 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1f060 45 4d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f  EM.    if( p->do
1f070 58 64 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  XdgOpen ){.     
1f080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64   const char *zXd
1f090 67 4f 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64  gOpenCmd =.#if d
1f0a0 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
1f0b0 20 20 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65       "start";.#e
1f0c0 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1f0d0 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70  PLE__).      "op
1f0e0 65 6e 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  en";.#else.     
1f0f0 20 22 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e   "xdg-open";.#en
1f100 64 69 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dif.      char *
1f110 7a 43 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64  zCmd;.      zCmd
1f120 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1f130 74 66 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67  tf("%s %s", zXdg
1f140 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d  OpenCmd, p->zTem
1f150 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
1f160 28 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29  ( system(zCmd) )
1f170 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1f180 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
1f190 61 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ailed: [%s]\n", 
1f1a0 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zCmd);.      }. 
1f1b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1f1c0 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f  e(zCmd);.      o
1f1d0 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b  utputModePop(p);
1f1e0 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
1f1f0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  pen = 0;.    }.#
1f200 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1f210 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  d(SQLITE_NOHAVE_
1f220 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20  SYSTEM) */.  }. 
1f230 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d   p->outfile[0] =
1f240 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73   0;.  p->out = s
1f250 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tdout;.}../*.** 
1f260 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61  Run an SQL comma
1f270 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
1f280 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  e single integer
1f290 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
1f2a0 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68  ic int db_int(Sh
1f2b0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
1f2c0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
1f2d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1f2e0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73  pStmt;.  int res
1f2f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1f300 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1f310 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1f320 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  mt, 0);.  if( pS
1f330 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73  tmt && sqlite3_s
1f340 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1f350 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65  TE_ROW ){.    re
1f360 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
1f370 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b  mn_int(pStmt,0);
1f380 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1f390 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1f3a0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
1f3b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1f3c0 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74   2-byte or 4-byt
1f3d0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1f3e0 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69  eger into a nati
1f3f0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74  ve integer.*/.st
1f400 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
1f410 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e  t get2byteInt(un
1f420 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
1f430 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
1f440 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74  <8) + a[1];.}.st
1f450 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
1f460 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e  t get4byteInt(un
1f470 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
1f480 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
1f490 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36  <24) + (a[1]<<16
1f4a0 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20  ) + (a[2]<<8) + 
1f4b0 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  a[3];.}../*.** I
1f4c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1f4d0 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d   the ".info" com
1f4e0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mand..**.** Retu
1f4f0 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
1f500 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
1f510 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1f520 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64  atic int shell_d
1f530 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68  binfo_command(Sh
1f540 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
1f550 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
1f560 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Arg){.  static c
1f570 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f  onst struct { co
1f580 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1f590 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69   int ofst; } aFi
1f5a0 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  eld[] = {.     {
1f5b0 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f   "file change co
1f5c0 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c  unter:",  24  },
1f5d0 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
1f5e0 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  e page count:", 
1f5f0 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   28  },.     { "
1f600 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f  freelist page co
1f610 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20  unt:",  36  },. 
1f620 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f      { "schema co
1f630 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34  okie:",        4
1f640 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  0  },.     { "sc
1f650 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20  hema format:",  
1f660 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20        44  },.   
1f670 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63    { "default cac
1f680 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20  he size:",   48 
1f690 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f   },.     { "auto
1f6a0 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a  vacuum top root:
1f6b0 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20  ",  52  },.     
1f6c0 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  { "incremental v
1f6d0 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d  acuum:",   64  }
1f6e0 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65  ,.     { "text e
1f6f0 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20  ncoding:",      
1f700 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20    56  },.     { 
1f710 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c  "user version:",
1f720 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a           60  },.
1f730 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74       { "applicat
1f740 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20  ion id:",       
1f750 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  68  },.     { "s
1f760 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a  oftware version:
1f770 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20  ",     96  },.  
1f780 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
1f790 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
1f7a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f   char *zName; co
1f7b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
1f7c0 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20  } aQuery[] = {. 
1f7d0 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
1f7e0 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20   tables:",.     
1f7f0 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
1f800 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
1f810 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d   type='table'" }
1f820 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
1f830 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20   of indexes:",. 
1f840 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
1f850 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
1f860 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
1f870 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
1f880 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73  mber of triggers
1f890 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1f8a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1f8b0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
1f8c0 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20  trigger'" },.   
1f8d0 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76    { "number of v
1f8e0 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  iews:",.       "
1f8f0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1f900 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
1f910 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20  pe='view'" },.  
1f920 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a     { "schema siz
1f930 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  e:",.       "SEL
1f940 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68  ECT total(length
1f950 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20  (sql)) FROM %s" 
1f960 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
1f970 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  .  char *zSchema
1f980 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62  Tab;.  char *zDb
1f990 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
1f9a0 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a  rg[1] : "main";.
1f9b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1f9c0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73  pStmt = 0;.  uns
1f9d0 69 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b  igned char aHdr[
1f9e0 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28  100];.  open_db(
1f9f0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  p, 0);.  if( p->
1fa00 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1fa10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1fa20 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45  are_v2(p->db,"SE
1fa30 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73  LECT data FROM s
1fa40 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29  qlite_dbpage(?1)
1fa50 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a   WHERE pgno=1",.
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
1fa80 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62   0);.  sqlite3_b
1fa90 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
1faa0 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49  1, zDb, -1, SQLI
1fab0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
1fac0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1fad0 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
1fae0 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f  W.   && sqlite3_
1faf0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1fb00 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20  mt,0)>100.  ){. 
1fb10 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20     memcpy(aHdr, 
1fb20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1fb30 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30  lob(pStmt,0), 10
1fb40 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1fb50 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1fb60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
1fb70 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1fb80 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64   "unable to read
1fb90 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
1fba0 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
1fbb0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1fbc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
1fbd0 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62  .  }.  i = get2b
1fbe0 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b  yteInt(aHdr+16);
1fbf0 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20  .  if( i==1 ) i 
1fc00 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f  = 65536;.  utf8_
1fc10 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1fc20 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61  %-20s %d\n", "da
1fc30 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
1fc40 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70  :", i);.  utf8_p
1fc50 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1fc60 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69  -20s %d\n", "wri
1fc70 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  te format:", aHd
1fc80 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[18]);.  utf8_p
1fc90 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1fca0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61  -20s %d\n", "rea
1fcb0 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  d format:", aHdr
1fcc0 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [19]);.  utf8_pr
1fcd0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1fce0 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65  20s %d\n", "rese
1fcf0 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48  rved bytes:", aH
1fd00 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69  dr[20]);.  for(i
1fd10 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1fd20 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20  aField); i++){. 
1fd30 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46     int ofst = aF
1fd40 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20  ield[i].ofst;.  
1fd50 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
1fd60 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74  al = get4byteInt
1fd70 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20  (aHdr + ofst);. 
1fd80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
1fd90 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75  ->out, "%-20s %u
1fda0 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61  ", aField[i].zNa
1fdb0 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77  me, val);.    sw
1fdc0 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20  itch( ofst ){.  
1fdd0 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20      case 56: {. 
1fde0 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
1fdf0 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
1fe00 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22  ->out, " (utf8)"
1fe10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
1fe20 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e  al==2 ) raw_prin
1fe30 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
1fe40 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20  f16le)");.      
1fe50 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72    if( val==3 ) r
1fe60 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
1fe70 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b  , " (utf16be)");
1fe80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fe90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
1fea0 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
1feb0 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  .  if( zDb==0 ){
1fec0 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
1fed0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1fee0 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  f("main.sqlite_m
1fef0 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
1ff00 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c   if( strcmp(zDb,
1ff10 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "temp")==0 ){.  
1ff20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
1ff30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1ff40 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  %s", "sqlite_tem
1ff50 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65  p_master");.  }e
1ff60 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  lse{.    zSchema
1ff70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
1ff80 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71  rintf("\"%w\".sq
1ff90 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44  lite_master", zD
1ffa0 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
1ffb0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1ffc0 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20  Query); i++){.  
1ffd0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
1ffe0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
1fff0 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a  Query[i].zSql, z
20000 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20  SchemaTab);.    
20010 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74  int val = db_int
20020 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  (p, zSql);.    s
20030 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
20040 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
20050 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
20060 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b  s %d\n", aQuery[
20070 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a  i].zName, val);.
20080 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
20090 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  ee(zSchemaTab);.
200a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
200b0 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
200c0 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
200d0 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f  rrmsg() value to
200e0 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
200f0 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 1..*/.static 
20100 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73  int shellDatabas
20110 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a  eError(sqlite3 *
20120 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
20130 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  r *zErr = sqlite
20140 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
20150 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20160 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
20170 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75  ", zErr);.  retu
20180 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 1;.}../*.** P
20190 72 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  rint an out-of-m
201a0 65 6d 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f  emory message to
201b0 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
201c0 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 1..*/.static 
201d0 69 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72  int shellNomemEr
201e0 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72 61 77  ror(void){.  raw
201f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20200 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
20210 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74  emory\n");.  ret
20220 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
20230 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74  Compare the patt
20240 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61  ern in zGlob[] a
20250 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20  gainst the text 
20260 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20  in z[].  Return 
20270 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20  TRUE.** if they 
20280 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20  match and FALSE 
20290 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e  (0) if they do n
202a0 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20  ot match..**.** 
202b0 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
202c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
202d0 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
202e0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
202f0 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
20300 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
20310 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
20320 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
20330 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
20340 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
20350 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
20360 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
20370 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
20380 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20390 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
203a0 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
203b0 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
203c0 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
203d0 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
203e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27  ..**.**      '#'
203f0 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
20400 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f  ny sequence of o
20410 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
20420 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20  s with an.**    
20430 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
20440 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e  onal + or - sign
20450 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20   in front.**.** 
20460 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41       ' '       A
20470 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65  ny span of white
20480 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e  space matches an
20490 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a  y other span of.
204a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
204b0 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a    whitespace..**
204c0 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73  .** Extra whites
204d0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
204e0 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65  of z[] is ignore
204f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
20500 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63   testcase_glob(c
20510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
20520 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
20530 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
20540 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
20550 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c  nt seen;..  whil
20560 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62  e( (c = (*(zGlob
20570 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
20580 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
20590 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53  {.      if( !IsS
205a0 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72  pace(*z) ) retur
205b0 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  n 0;.      while
205c0 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62  ( IsSpace(*zGlob
205d0 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20  ) ) zGlob++;.   
205e0 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
205f0 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
20600 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a   }else if( c=='*
20610 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ' ){.      while
20620 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29  ( (c=(*(zGlob++)
20630 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d  )) == '*' || c==
20640 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '?' ){.        i
20650 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28  f( c=='?' && (*(
20660 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
20670 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
20680 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
20690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
206a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
206b0 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
206c0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
206d0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
206e0 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20  lob-1,z)==0 ){. 
206f0 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20           z++;.  
20700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20710 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a  return (*z)!=0;.
20720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
20730 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b  ile( (c2 = (*(z+
20740 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  +)))!=0 ){.     
20750 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20     while( c2!=c 
20760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
20770 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
20780 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
20790 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
207a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
207b0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
207c0 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20  lob,z) ) return 
207d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
207e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
207f0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20  else if( c=='?' 
20800 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28  ){.      if( (*(
20810 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
20820 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
20830 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
20840 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
20850 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   0;.      seen =
20860 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74   0;.      invert
20870 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 0;.      c = 
20880 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  *(z++);.      if
20890 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
208a0 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28  0;.      c2 = *(
208b0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
208c0 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
208d0 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
208e0 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
208f0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
20900 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
20910 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
20920 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
20930 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
20940 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
20950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
20960 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d  hile( c2 && c2!=
20970 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
20980 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47  f( c2=='-' && zG
20990 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  lob[0]!=']' && z
209a0 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72  Glob[0]!=0 && pr
209b0 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
209c0 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
209d0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b++);.          
209e0 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
209f0 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
20a00 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
20a10 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
20a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a30 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
20a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
20a50 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
20a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
20a70 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
20a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
20a90 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
20aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20ab0 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e  c2==0 || (seen ^
20ac0 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65   invert)==0 ) re
20ad0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
20ae0 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a  e if( c=='#' ){.
20af0 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d        if( (z[0]=
20b00 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b  ='-' || z[0]=='+
20b10 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b  ') && IsDigit(z[
20b20 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  1]) ) z++;.     
20b30 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b   if( !IsDigit(z[
20b40 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  0]) ) return 0;.
20b50 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
20b60 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
20b70 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[0]) ){ z++; }.
20b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b90 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29   if( c!=(*(z++))
20ba0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
20bb0 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
20bc0 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a  IsSpace(*z) ){ z
20bd0 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ++; }.  return *
20be0 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  z==0;.}.../*.** 
20bf0 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69  Compare the stri
20c00 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d  ng as a command-
20c10 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68  line option with
20c20 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74   either one or t
20c30 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d  wo.** initial "-
20c40 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  " characters..*/
20c50 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69  .static int opti
20c60 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
20c70 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
20c80 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69  char *zOpt){.  i
20c90 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20  f( zStr[0]!='-' 
20ca0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53  ) return 0;.  zS
20cb0 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72  tr++;.  if( zStr
20cc0 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b  [0]=='-' ) zStr+
20cd0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63  +;.  return strc
20ce0 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d  mp(zStr, zOpt)==
20cf0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
20d00 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  te a file..*/.in
20d10 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  t shellDeleteFil
20d20 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
20d30 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
20d40 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  rc;.#ifdef _WIN3
20d50 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d  2.  wchar_t *z =
20d60 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
20d70 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a  tf8_to_unicode(z
20d80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20  Filename);.  rc 
20d90 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20  = _wunlink(z);. 
20da0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
20db0 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75  ;.#else.  rc = u
20dc0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
20dd0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
20de0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20df0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ry to delete the
20e00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
20e10 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65  (if there is one
20e20 29 20 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a  ) and free the.*
20e30 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f  * memory used to
20e40 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f   hold the name o
20e50 66 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e  f the temp file.
20e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20e70 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68  clearTempFile(Sh
20e80 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
20e90 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
20ea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
20eb0 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  if( p->doXdgOpen
20ec0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
20ed0 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
20ee0 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29  (p->zTempFile) )
20ef0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
20f00 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
20f10 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
20f20 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pFile = 0;.}../*
20f30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
20f40 20 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20   temp file name 
20f50 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
20f60 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffix..*/.static
20f70 20 76 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c   void newTempFil
20f80 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
20f90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
20fa0 66 66 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65  ffix){.  clearTe
20fb0 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c  mpFile(p);.  sql
20fc0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65  ite3_free(p->zTe
20fd0 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54  mpFile);.  p->zT
20fe0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
20ff0 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
21000 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21010 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53  trol(p->db, 0, S
21020 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
21030 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54  FILENAME, &p->zT
21040 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  empFile);.  }.  
21050 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
21060 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
21070 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20  e3_uint64 r;.   
21080 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
21090 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
210a0 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70  r);.    p->zTemp
210b0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
210c0 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
210d0 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78  .%s", r, zSuffix
210e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
210f0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73  p->zTempFile = s
21100 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
21110 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70  %z.%s", p->zTemp
21120 46 69 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a  File, zSuffix);.
21130 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65    }.  if( p->zTe
21140 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
21150 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
21160 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "out of memo
21170 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
21180 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (1);.  }.}.../*.
21190 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
211a0 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61  ation of SQL sca
211b0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65  lar function fke
211c0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
211d0 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74  (), used.** by t
211e0 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69  he ".lint fkey-i
211f0 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e  ndexes" command.
21200 20 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e   This scalar fun
21210 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a  ction is always.
21220 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66  ** called with f
21230 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20  our arguments - 
21240 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
21250 20 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e   name, the paren
21260 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a  t column name,.*
21270 2a 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  * the child tabl
21280 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63  e name and the c
21290 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hild column name
212a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63  ..**.**   fkey_c
212b0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70  ollate_clause('p
212c0 61 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72  arent-tab', 'par
212d0 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64  ent-col', 'child
212e0 2d 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f  -tab', 'child-co
212f0 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  l').**.** If eit
21300 68 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  her of the named
21310 20 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d   tables or colum
21320 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c  ns do not exist,
21330 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
21340 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70  * returns an emp
21350 74 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d  ty string. An em
21360 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c  pty string is al
21370 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 62  so returned if b
21380 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e  oth tables.** an
21390 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20  d columns exist 
213a0 62 75 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  but have the sam
213b0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
213c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72  ion sequence. Or
213d0 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69  ,.** if both exi
213e0 73 74 20 62 75 74 20 74 68 65 20 64 65 66 61 75  st but the defau
213f0 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
21400 75 65 6e 63 65 73 20 61 72 65 20 64 69 66 66 65  uences are diffe
21410 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75  rent, this.** fu
21420 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
21430 68 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c  he string " COLL
21440 41 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c  ATE <parent-coll
21450 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a  ation>", where.*
21460 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  * <parent-collat
21470 69 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61  ion> is the defa
21480 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
21490 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61  quence of the pa
214a0 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  rent column..*/.
214b0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
214c0 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
214d0 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  se(.  sqlite3_co
214e0 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
214f0 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
21500 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
21510 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
21520 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
21530 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
21540 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx);.  const cha
21550 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f  r *zParent;.  co
21560 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
21570 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tCol;.  const ch
21580 61 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a  ar *zParentSeq;.
21590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
215a0 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  hild;.  const ch
215b0 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20  ar *zChildCol;. 
215c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
215d0 69 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20  ildSeq = 0;  /* 
215e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76  Initialize to av
215f0 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  oid false-positi
21600 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  ve warning */.  
21610 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
21620 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20  t( nVal==4 );.  
21630 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74  zParent = (const
21640 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
21650 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
21660 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f  0]);.  zParentCo
21670 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
21680 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
21690 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
216a0 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74   zChild = (const
216b0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
216c0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
216d0 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c  2]);.  zChildCol
216e0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
216f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
21700 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20  xt(apVal[3]);.. 
21710 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
21720 74 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d  text(pCtx, "", -
21730 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
21740 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21750 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
21760 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64  etadata(.      d
21770 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65  b, "main", zPare
21780 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20  nt, zParentCol, 
21790 30 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20  0, &zParentSeq, 
217a0 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  0, 0, 0.  );.  i
217b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
217c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
217d0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
217e0 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
217f0 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
21800 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f  zChild, zChildCo
21810 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71  l, 0, &zChildSeq
21820 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  , 0, 0, 0.    );
21830 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
21840 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
21850 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
21860 72 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53  rentSeq, zChildS
21870 65 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  eq) ){.    char 
21880 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
21890 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25  intf(" COLLATE %
218a0 73 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b  s", zParentSeq);
218b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
218c0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
218d0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
218e0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
218f0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
21900 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
21910 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
21920 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e  f dot-command ".
21930 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65  lint fkey-indexe
21940 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s"..*/.static in
21950 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  t lintFkeyIndexe
21960 73 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  s(.  ShellState 
21970 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
21980 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
21990 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
219a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
219b0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
219c0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
219d0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
219e0 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
219f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21a20 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
21a30 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73  zArg[] */.){.  s
21a40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74  qlite3 *db = pSt
21a50 61 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  ate->db;       /
21a60 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
21a70 65 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e  e to query "main
21a80 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c  " db of */.  FIL
21a90 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d  E *out = pState-
21aa0 3e 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  >out;        /* 
21ab0 53 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20  Stream to write 
21ac0 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74  non-error output
21ad0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65   to */.  int bVe
21ae0 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20  rbose = 0;      
21af0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d           /* If -
21b00 76 65 72 62 6f 73 65 20 69 73 20 70 72 65 73 65  verbose is prese
21b10 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f  nt */.  int bGro
21b20 75 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20  upByParent = 0; 
21b30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67          /* If -g
21b40 72 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73 20  roupbyparent is 
21b50 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
21b60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b80 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
21b90 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  gh azArg[] */.  
21ba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64  const char *zInd
21bb0 65 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20  ent = "";       
21bc0 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69  /* How much to i
21bd0 6e 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44  ndent CREATE IND
21be0 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72  EX by */.  int r
21bf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
21c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21c10 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
21c20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
21c30 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
21c40 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69  * Compiled versi
21c50 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  on of SQL statem
21c60 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
21c70 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c  /*.  ** This SEL
21c80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
21c90 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f  turns one row fo
21ca0 72 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b  r each foreign k
21cb0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ey constraint.  
21cc0 2a 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ** in the schema
21cd0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
21ce0 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d  abase. The colum
21cf0 6e 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20  n values are:.  
21d00 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74  **.  ** 0. The t
21d10 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  ext of an SQL st
21d20 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20  atement similar 
21d30 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
21d40 20 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52     "EXPLAIN QUER
21d50 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
21d60 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65  FROM child_table
21d70 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79   WHERE child_key
21d80 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  =?".  **.  **   
21d90 20 54 68 69 73 20 53 45 4c 45 43 54 20 69 73 20   This SELECT is 
21da0 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f  similar to the o
21db0 6e 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  ne that the fore
21dc0 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65  ign keys impleme
21dd0 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ntation.  **    
21de0 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74  needs to run int
21df0 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64  ernally on child
21e00 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72   tables. If ther
21e10 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  e is an index th
21e20 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62  at can.  **    b
21e30 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  e used to optimi
21e40 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ze this query, t
21e50 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20  hen it can also 
21e60 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 46  be used by the F
21e70 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d  K.  **    implem
21e80 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69  entation to opti
21e90 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55  mize DELETE or U
21ea0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
21eb0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20   on the parent. 
21ec0 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20   **    table..  
21ed0 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f  **.  ** 1. A GLO
21ee0 42 20 70 61 74 74 65 72 6e 20 73 75 69 74 61 62  B pattern suitab
21ef0 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73  le for sqlite3_s
21f00 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65  trglob(). If the
21f10 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a   plan output by.
21f20 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c    **    the EXPL
21f30 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
21f40 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74  ommand matches t
21f50 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
21f60 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a  n the schema.  *
21f70 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e  *    contains an
21f80 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20   index that can 
21f90 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  be used to optim
21fa0 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ize the query.. 
21fb0 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61   **.  ** 2. Huma
21fc0 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20  n readable text 
21fd0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
21fe0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61  he child table a
21ff0 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
22000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
22010 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68   "child_table(ch
22020 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f  ild_key1, child_
22030 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
22040 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62   3. Human readab
22050 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73  le text that des
22060 63 72 69 62 65 73 20 74 68 65 20 70 61 72 65 6e  cribes the paren
22070 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
22080 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
22090 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e   **       "paren
220a0 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b  t_table(parent_k
220b0 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32  ey1, parent_key2
220c0 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20  )".  **.  ** 4. 
220d0 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e  A full CREATE IN
220e0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  DEX statement fo
220f0 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
22100 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  could be used to
22110 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a  .  **    optimiz
22120 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
22130 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
22140 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
22150 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  e. e.g..  **.  *
22160 2a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  *       "CREATE 
22170 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c  INDEX child_tabl
22180 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63  e_child_key ON c
22190 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
221a0 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _key)".  **.  **
221b0 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   5. The name of 
221c0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
221d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73  ..  **.  ** Thes
221e0 65 20 73 69 78 20 76 61 6c 75 65 73 20 61 72 65  e six values are
221f0 20 75 73 65 64 20 62 79 20 74 68 65 20 43 20 6c   used by the C l
22200 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65  ogic below to ge
22210 6e 65 72 61 74 65 20 74 68 65 20 72 65 70 6f 72  nerate the repor
22220 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t..  */.  const 
22230 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22  char *zSql =.  "
22240 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
22250 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52     'EXPLAIN QUER
22260 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
22270 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28  FROM ' || quote(
22280 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45  s.name) || ' WHE
22290 52 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  RE '".    "  || 
222a0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f  group_concat(quo
222b0 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e  te(s.name) || '.
222c0 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72  ' || quote(f.[fr
222d0 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20  om]) || '=?' ". 
222e0 20 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f     "  || fkey_co
222f0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20  llate_clause(". 
22300 20 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61     "       f.[ta
22310 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
22320 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
22330 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
22340 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20  m]),' AND ')".  
22350 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
22360 20 27 53 45 41 52 43 48 20 54 41 42 4c 45 20 27   'SEARCH TABLE '
22370 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20   || s.name || ' 
22380 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
22390 4e 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20  NDEX*('".    "  
223a0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
223b0 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20  '*=?', ' AND ') 
223c0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
223d0 0a 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d  .    "     s.nam
223e0 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f  e  || '(' || gro
223f0 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
22400 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29  m],  ', ') || ')
22410 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
22420 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
22430 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
22440 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28  concat(COALESCE(
22450 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d  f.[to], p.[name]
22460 29 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22  )) || ')'".    "
22470 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 43  , ".    "     'C
22480 52 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c  REATE INDEX ' ||
22490 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c   quote(s.name ||
224a0 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  '_'|| group_conc
224b0 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27  at(f.[from], '_'
224c0 29 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20  ))".    "  || ' 
224d0 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  ON ' || quote(s.
224e0 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20  name) || '('".  
224f0 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
22500 6e 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72  ncat(quote(f.[fr
22510 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20  om]) ||".    "  
22520 20 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61        fkey_colla
22530 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
22540 22 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61  "          f.[ta
22550 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
22560 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
22570 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
22580 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20  m]), ', ')".    
22590 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20  "  || ');'".    
225a0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
225b0 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22  .[table] ".    "
225c0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
225d0 65 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f  er AS s, pragma_
225e0 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74  foreign_key_list
225f0 28 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a  (s.name) AS f ".
22600 20 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70      "LEFT JOIN p
22610 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f  ragma_table_info
22620 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73   AS p ON (pk-1=s
22630 65 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b  eq AND p.arg=f.[
22640 74 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47  table]) ".    "G
22650 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20  ROUP BY s.name, 
22660 66 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45  f.id ".    "ORDE
22670 52 20 42 59 20 28 43 41 53 45 20 57 48 45 4e 20  R BY (CASE WHEN 
22680 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d  ? THEN f.[table]
22690 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44   ELSE s.name END
226a0 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63  )".  ;.  const c
226b0 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20  har *zGlobIPK = 
226c0 22 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20  "SEARCH TABLE * 
226d0 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
226e0 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
226f0 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32  =?)";..  for(i=2
22700 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
22710 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
22720 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  en30(azArg[i]);.
22730 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
22740 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
22750 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72  "-verbose", azAr
22760 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
22770 20 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20       bVerbose = 
22780 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
22790 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c  e if( n>1 && sql
227a0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
227b0 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20  groupbyparent", 
227c0 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
227d0 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42  ){.      bGroupB
227e0 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20  yParent = 1;.   
227f0 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20     zIndent = "  
22800 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65    ";.    }.    e
22810 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
22820 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
22830 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65  sage: %s %s ?-ve
22840 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79  rbose? ?-groupby
22850 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20  parent?\n",.    
22860 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20        azArg[0], 
22870 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29  azArg[1].      )
22880 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22890 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
228a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67   }.  }..  /* Reg
228b0 69 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63  ister the fkey_c
228c0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20  ollate_clause() 
228d0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
228e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
228f0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
22900 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  b, "fkey_collate
22910 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c  _clause", 4, SQL
22920 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
22930 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  0, shellFkeyColl
22940 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a  ateClause, 0, 0.
22950 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d    );...  if( rc=
22960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
22980 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
22990 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30  ql, -1, &pSql, 0
229a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
229b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
229c0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
229d0 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f  nt(pSql, 1, bGro
229e0 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d  upByParent);.  }
229f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
22a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
22a10 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a   rc2;.    char *
22a20 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77  zPrev = 0;.    w
22a30 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
22a40 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
22a50 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  Sql) ){.      in
22a60 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  t res = -1;.    
22a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
22a80 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  pExplain = 0;.  
22a90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22aa0 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68  zEQP = (const ch
22ab0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
22ac0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
22ad0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
22ae0 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e  ar *zGlob = (con
22af0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
22b00 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
22b10 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 1);.      con
22b20 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d  st char *zFrom =
22b30 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
22b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
22b50 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20  t(pSql, 2);.    
22b60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
22b70 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63  arget = (const c
22b80 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
22b90 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
22ba0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
22bb0 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73  har *zCI = (cons
22bc0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
22bd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
22be0 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 4);.      cons
22bf0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20  t char *zParent 
22c00 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
22c10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
22c20 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20  xt(pSql, 5);..  
22c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22c40 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
22c50 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
22c60 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ain, 0);.      i
22c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22c80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
22c90 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
22ca0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
22cb0 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  plain) ){.      
22cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
22cd0 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lan = (const cha
22ce0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
22cf0 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
22d00 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73   3);.        res
22d10 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
22d20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74     0==sqlite3_st
22d30 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c  rglob(zGlob, zPl
22d40 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  an).           |
22d50 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
22d60 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a  glob(zGlobIPK, z
22d70 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b  Plan).        );
22d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22d90 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
22da0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
22db0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22dc0 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
22dd0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ..      if( res<
22de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  0 ){.        raw
22df0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
22e00 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c  "Error: internal
22e10 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
22e20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
22e40 28 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  ( bGroupByParent
22e50 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65  .        && (bVe
22e60 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29  rbose || res==0)
22e70 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72  .        && (zPr
22e80 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ev==0 || sqlite3
22e90 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
22ea0 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20  , zPrev)).      
22eb0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
22ec0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
22ed0 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  -- Parent table 
22ee0 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b  %s\n", zParent);
22ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22f00 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
22f10 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20            zPrev 
22f20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
22f30 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29  f("%s", zParent)
22f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
22f50 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
22f60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
22f70 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
22f80 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49  %s --> %s\n", zI
22f90 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72  ndent, zCI, zTar
22fa0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
22fb0 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65  lse if( bVerbose
22fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
22fd0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
22fe0 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64  s/* no extra ind
22ff0 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  exes required fo
23000 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22  r %s -> %s */\n"
23010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23020 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20  zIndent, zFrom, 
23030 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20  zTarget.        
23040 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
23050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
23070 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  rev);..    if( r
23080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23090 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
230a0 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
230b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
230c0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  db));.    }..   
230d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
230e0 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20  inalize(pSql);. 
230f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23100 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c  E_OK && rc2!=SQL
23110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23120 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
23130 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
23140 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
23150 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
23160 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
23170 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
23180 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
23190 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
231a0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
231b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
231c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
231d0 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d  ".lint" dot comm
231e0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
231f0 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e  nt lintDotComman
23200 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
23210 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
23220 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
23230 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
23240 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
23250 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
23260 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
23270 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
23280 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
23290 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
232c0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
232d0 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69  zArg[] */.){.  i
232e0 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72  nt n;.  n = (nAr
232f0 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28  g>=2 ? strlen30(
23300 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a  azArg[1]) : 0);.
23310 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c    if( n<1 || sql
23320 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a  ite3_strnicmp(az
23330 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e  Arg[1], "fkey-in
23340 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74  dexes", n) ) got
23350 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72  o usage;.  retur
23360 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  n lintFkeyIndexe
23370 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c  s(pState, azArg,
23380 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a   nArg);.. usage:
23390 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
233a0 64 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20  derr, "Usage %s 
233b0 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69  sub-command ?swi
233c0 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a  tches...?\n", az
233d0 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70  Arg[0]);.  raw_p
233e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
233f0 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  here sub-command
23400 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61  s are:\n");.  ra
23410 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
23420 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78   "    fkey-index
23430 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  es\n");.  return
23440 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
23450 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
23460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
23470 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
23480 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
23490 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ZLIB)./*********
234a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
234f0 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
23500 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ar" command..*/.
23510 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
23520 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69  lPrepare(.  sqli
23530 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
23540 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63  *pRc, .  const c
23550 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71  har *zSql, .  sq
23560 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
23570 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74  tmt.){.  *ppStmt
23580 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
23590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
235a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
235b0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
235c0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
235d0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
235e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
235f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
23600 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20  tf(stderr, "sql 
23610 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e  error: %s (%d)\n
23620 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ", .          sq
23630 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
23640 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  , sqlite3_errcod
23650 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20  e(db).      );. 
23660 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a       *pRc = rc;.
23670 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
23680 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
23690 65 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73  eparePrintf(.  s
236a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
236b0 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
236c0 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
236d0 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
236e0 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b  *zFmt, .  ....){
236f0 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
23700 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
23710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f  TE_OK ){.    va_
23720 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61  list ap;.    cha
23730 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61  r *z;.    va_sta
23740 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
23750 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
23760 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
23770 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
23780 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
23790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
237a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
237b0 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70  ellPrepare(db, p
237c0 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a  Rc, z, ppStmt);.
237d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
237e0 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(z);.    }.  }
237f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
23800 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20  shellFinalize(. 
23810 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
23820 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
23830 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74  t.){.  if( pStmt
23840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
23850 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
23860 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
23870 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
23880 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
23890 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  tmt);.    if( *p
238a0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
238b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
238c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
238d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
238e0 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
238f0 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
23900 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
23910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
23920 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
23930 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
23940 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69   shellReset(.  i
23950 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
23960 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
23970 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
23980 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
23990 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t);.  if( *pRc==
239a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
239b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
239c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
239d0 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
239e0 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
239f0 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
23a00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
23a10 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
23a20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
23a30 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  b));.    }.    *
23a40 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  pRc = rc;.  }.}.
23a50 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
23a60 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73  representing a s
23a70 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d  ingle ".ar" comm
23a80 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  and..*/.typedef 
23a90 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
23aa0 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75   ArCommand;.stru
23ab0 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20  ct ArCommand {. 
23ac0 20 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20   u8 eCmd;       
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20   /* An AR_CMD_* 
23af0 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56  value */.  u8 bV
23b00 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20  erbose;         
23b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23b20 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20  ue if --verbose 
23b30 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20  */.  u8 bZip;   
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
23b60 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20 61  the archive is a
23b70 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72   ZIP */.  u8 bDr
23b80 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20  yRun;           
23b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23ba0 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a  e if --dry-run *
23bb0 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20  /.  u8 bAppend; 
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
23be0 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  -append */.  int
23bf0 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c10 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e  Number of comman
23c20 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  d arguments */. 
23c30 20 63 68 61 72 20 2a 7a 53 72 63 54 61 62 6c 65   char *zSrcTable
23c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c50 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a 69   /* "sqlar", "zi
23c60 70 66 69 6c 65 28 24 66 69 6c 65 29 22 20 6f 72  pfile($file)" or
23c70 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73   "zip" */.  cons
23c80 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
23c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d              /* -
23ca0 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20  -file argument, 
23cb0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
23cc0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 20 20  st char *zDir;  
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ce0 2d 2d 64 69 72 65 63 74 6f 72 79 20 61 72 67 75  --directory argu
23cf0 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
23d00 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b  .  char **azArg;
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
23d30 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
23d40 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
23d50 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
23d60 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73        /* Shell s
23d70 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
23d80 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
23d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
23da0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
23db0 20 74 68 65 20 61 72 63 68 69 76 65 20 2a 2f 0a   the archive */.
23dc0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  };../*.** Print 
23dd0 61 20 75 73 61 67 65 20 6d 65 73 73 61 67 65 20  a usage message 
23de0 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d  for the .ar comm
23df0 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  and to stderr an
23e00 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
23e10 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
23e20 20 69 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c   int arUsage(FIL
23e30 45 20 2a 66 29 7b 0a 20 20 72 61 77 5f 70 72 69  E *f){.  raw_pri
23e40 6e 74 66 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61  ntf(f,."\n"."Usa
23e50 67 65 3a 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e  ge: .ar [OPTION.
23e60 2e 2e 5d 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22  ..] [FILE...]\n"
23e70 0a 22 54 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e  ."The .ar comman
23e80 64 20 6d 61 6e 61 67 65 73 20 73 71 6c 61 72 20  d manages sqlar 
23e90 61 72 63 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e  archives.\n"."\n
23ea0 22 0a 22 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a  "."Examples:\n".
23eb0 22 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69  "  .ar -cf archi
23ec0 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20  ve.sar foo bar  
23ed0 20 20 23 20 43 72 65 61 74 65 20 61 72 63 68 69    # Create archi
23ee0 76 65 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65  ve.sar from file
23ef0 73 20 66 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22  s foo and bar\n"
23f00 0a 22 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68  ."  .ar -tf arch
23f10 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
23f20 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72     # List member
23f30 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72  s of archive.sar
23f40 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 78 76 66 20  \n"."  .ar -xvf 
23f50 61 72 63 68 69 76 65 2e 73 61 72 20 20 20 20 20  archive.sar     
23f60 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c        # Verbosel
23f70 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20  y extract files 
23f80 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72  from archive.sar
23f90 5c 6e 22 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63  \n"."\n"."Each c
23fa0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74  ommand line must
23fb0 20 66 65 61 74 75 72 65 20 65 78 61 63 74 6c 79   feature exactly
23fc0 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74   one command opt
23fd0 69 6f 6e 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d  ion:\n"."  -c, -
23fe0 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20  -create         
23ff0 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
24000 65 77 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20  ew archive\n"." 
24010 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20   -u, --update   
24020 20 20 20 20 20 20 20 20 20 20 20 20 55 70 64 61              Upda
24030 74 65 20 6f 72 20 61 64 64 20 66 69 6c 65 73 20  te or add files 
24040 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 61  to an existing a
24050 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c  rchive\n"."  -t,
24060 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20   --list         
24070 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e          List con
24080 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65  tents of archive
24090 5c 6e 22 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74  \n"."  -x, --ext
240a0 72 61 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ract            
240b0 20 20 45 78 74 72 61 63 74 20 66 69 6c 65 73 20    Extract files 
240c0 66 72 6f 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a  from archive\n".
240d0 22 5c 6e 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f  "\n"."And zero o
240e0 72 20 6d 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20  r more optional 
240f0 6f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d  options:\n"."  -
24100 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20  v, --verbose    
24110 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
24120 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73  each filename as
24130 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64   it is processed
24140 5c 6e 22 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20  \n"."  -f FILE, 
24150 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20 20 20 20  --file FILE     
24160 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 61 72 63    Operate on arc
24170 68 69 76 65 20 46 49 4c 45 20 28 64 65 66 61 75  hive FILE (defau
24180 6c 74 20 69 73 20 63 75 72 72 65 6e 74 20 64 62  lt is current db
24190 29 5c 6e 22 0a 22 20 20 2d 61 20 46 49 4c 45 2c  )\n"."  -a FILE,
241a0 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20   --append FILE  
241b0 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49     Operate on FI
241c0 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  LE opened using 
241d0 74 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 5c  the apndvfs VFS\
241e0 6e 22 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d  n"."  -C DIR, --
241f0 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20  directory DIR   
24200 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   Change to direc
24210 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64  tory DIR to read
24220 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e  /extract files\n
24230 22 0a 22 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75  "."  -n, --dryru
24240 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
24250 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61  Show the SQL tha
24260 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63  t would have occ
24270 75 72 72 65 64 5c 6e 22 0a 22 5c 6e 22 0a 22 53  urred\n"."\n"."S
24280 65 65 20 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f  ee also: http://
24290 73 71 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68  sqlite.org/cli.h
242a0 74 6d 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76  tml#sqlar_archiv
242b0 65 5f 73 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e  e_support\n"."\n
242c0 22 0a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ".);.  return SQ
242d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
242e0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
242f0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
24300 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
24310 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
24320 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
24330 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
24340 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28   int arErrorMsg(
24350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
24360 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
24370 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
24380 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
24390 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  zFmt);.  z = sql
243a0 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
243b0 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mt, ap);.  va_en
243c0 64 28 61 70 29 3b 0a 20 20 72 61 77 5f 70 72 69  d(ap);.  raw_pri
243d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
243e0 6f 72 3a 20 25 73 20 28 74 72 79 20 5c 22 2e 61  or: %s (try \".a
243f0 72 20 2d 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20  r --help\")\n", 
24400 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  z);.  sqlite3_fr
24410 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
24420 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
24430 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f  ./*.** Values fo
24440 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64  r ArCommand.eCmd
24450 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f  ..*/.#define AR_
24460 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20  CMD_CREATE      
24470 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   1.#define AR_CM
24480 44 5f 45 58 54 52 41 43 54 20 20 20 20 20 20 32  D_EXTRACT      2
24490 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
244a0 4c 49 53 54 20 20 20 20 20 20 20 20 20 33 0a 23  LIST         3.#
244b0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50  define AR_CMD_UP
244c0 44 41 54 45 20 20 20 20 20 20 20 34 0a 23 64 65  DATE       4.#de
244d0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  fine AR_CMD_HELP
244e0 20 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a           5../*.*
244f0 2a 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d  * Other (non-com
24500 6d 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a  mand) switches..
24510 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  */.#define AR_SW
24520 49 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20  ITCH_VERBOSE    
24530 20 36 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   6.#define AR_SW
24540 49 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20  ITCH_FILE       
24550 20 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   7.#define AR_SW
24560 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20  ITCH_DIRECTORY  
24570 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   8.#define AR_SW
24580 49 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20  ITCH_APPEND     
24590 20 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   9.#define AR_SW
245a0 49 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20  ITCH_DRYRUN     
245b0 31 30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  10..static int a
245c0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
245d0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
245e0 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
245f0 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
24600 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
24610 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
24620 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
24630 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
24640 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
24650 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
24660 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
24670 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
24680 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69  MD_HELP:.      i
24690 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a  f( pAr->eCmd ){.
246a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
246b0 72 45 72 72 6f 72 4d 73 67 28 22 6d 75 6c 74 69  rErrorMsg("multi
246c0 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  ple command opti
246d0 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ons");.      }. 
246e0 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d       pAr->eCmd =
246f0 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20   eSwitch;.      
24700 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
24710 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
24720 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44  N:.      pAr->bD
24730 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ryRun = 1;.     
24740 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
24750 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
24760 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  SE:.      pAr->b
24770 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
24780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
24790 73 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  se AR_SWITCH_APP
247a0 45 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  END:.      pAr->
247b0 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20  bAppend = 1;.   
247c0 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
247d0 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20  into --file */. 
247e0 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
247f0 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41  H_FILE:.      pA
24800 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b  r->zFile = zArg;
24810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24820 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
24830 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20  _DIRECTORY:.    
24840 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41    pAr->zDir = zA
24850 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rg;.      break;
24860 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
24870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24880 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d  ** Parse the com
24890 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e  mand line for an
248a0 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20   ".ar" command. 
248b0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
248c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
248d0 73 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29  structure (*pAr)
248e0 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
248f0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
24900 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70  ommand line is p
24910 61 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73  arsed.** success
24920 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65  fully, otherwise
24930 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
24940 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
24950 73 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53  stderr and .** S
24960 51 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75  QLITE_ERROR retu
24970 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
24980 69 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  int arParseComma
24990 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41  nd(.  char **azA
249a0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
249b0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
249c0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
249d0 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
249e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  d */.  int nArg,
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24a10 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
24a20 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f  zArg[] */.  ArCo
24a30 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20  mmand *pAr      
24a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24a50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a  opulate this obj
24a60 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
24a70 63 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20  ct ArSwitch {.  
24a80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
24a90 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53  ong;.    char cS
24aa0 68 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77  hort;.    u8 eSw
24ab0 69 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72  itch;.    u8 bAr
24ac0 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d  g;.  } aSwitch[]
24ad0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61   = {.    { "crea
24ae0 74 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f  te",    'c', AR_
24af0 43 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20  CMD_CREATE,     
24b00 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78    0 },.    { "ex
24b10 74 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41  tract",   'x', A
24b20 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20  R_CMD_EXTRACT,  
24b30 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
24b40 6c 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c  list",      't',
24b50 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20   AR_CMD_LIST,   
24b60 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
24b70 20 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75   "update",    'u
24b80 27 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  ', AR_CMD_UPDATE
24b90 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  ,       0 },.   
24ba0 20 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20   { "help",      
24bb0 27 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50  'h', AR_CMD_HELP
24bc0 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ,         0 },. 
24bd0 20 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20     { "verbose", 
24be0 20 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48    'v', AR_SWITCH
24bf0 5f 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c  _VERBOSE,   0 },
24c00 0a 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20  .    { "file",  
24c10 20 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54      'f', AR_SWIT
24c20 43 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20  CH_FILE,      1 
24c30 7d 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64  },.    { "append
24c40 22 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57  ",    'a', AR_SW
24c50 49 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20  ITCH_APPEND,    
24c60 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65  1 },.    { "dire
24c70 63 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f  ctory", 'C', AR_
24c80 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
24c90 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72  , 1 },.    { "dr
24ca0 79 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41  yrun",    'n', A
24cb0 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c  R_SWITCH_DRYRUN,
24cc0 20 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20      0 },.  };.  
24cd0 69 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69  int nSwitch = si
24ce0 7a 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20  zeof(aSwitch) / 
24cf0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72  sizeof(struct Ar
24d00 53 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63  Switch);.  struc
24d10 74 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64  t ArSwitch *pEnd
24d20 20 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69   = &aSwitch[nSwi
24d30 74 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72  tch];..  if( nAr
24d40 67 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75  g<=1 ){.    retu
24d50 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72  rn arUsage(stder
24d60 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
24d70 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
24d80 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  [1];.    memset(
24d90 70 41 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41  pAr, 0, sizeof(A
24da0 72 43 6f 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20  rCommand));..   
24db0 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
24dc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 64 69  {.      /* Tradi
24dd0 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61  tional style [ta
24de0 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  r] invocation */
24df0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
24e00 20 20 20 20 69 6e 74 20 69 41 72 67 20 3d 20 32      int iArg = 2
24e10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
24e20 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
24e30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24e40 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  *zArg = 0;.     
24e50 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
24e60 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20  ch *pOpt;.      
24e70 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69    for(pOpt=&aSwi
24e80 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e  tch[0]; pOpt<pEn
24e90 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20  d; pOpt++){.    
24ea0 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
24eb0 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62  pOpt->cShort ) b
24ec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
24ed0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
24ee0 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ==pEnd ){.      
24ef0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
24f00 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69  orMsg("unrecogni
24f10 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c  zed option: %c",
24f20 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20   z[i]);.        
24f30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
24f40 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
24f50 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
24f60 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nArg ){.        
24f70 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
24f80 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65  orMsg("option re
24f90 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
24fa0 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20  nt: %c",z[i]);. 
24fb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24fc0 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
24fd0 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20  g[iArg++];.     
24fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
24ff0 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68   arProcessSwitch
25000 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69  (pAr, pOpt->eSwi
25010 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
25020 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25040 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
25050 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  -iArg;.      if(
25060 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a   pAr->nArg>0 ){.
25070 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
25080 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
25090 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
250a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
250b0 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69  on-traditional i
250c0 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  nvocation */.   
250d0 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20     int iArg;.   
250e0 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69     for(iArg=1; i
250f0 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b  Arg<nArg; iArg++
25100 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
25110 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a  ;.        z = az
25120 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[iArg];.     
25130 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
25140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
25150 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   All remaining c
25160 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
25170 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72  s are command ar
25180 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  guments. */.    
25190 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
251a0 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
251b0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
251c0 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
251d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
251e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
251f0 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33       n = strlen3
25200 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  0(z);..        i
25210 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[1]!='-' ){.
25220 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
25230 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  .          /* On
25240 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20  e or more short 
25250 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  options */.     
25260 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
25270 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
25280 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25290 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  *zArg = 0;.     
252a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
252b0 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20  Switch *pOpt;.  
252c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f            for(pO
252d0 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
252e0 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
252f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
25300 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74    if( z[i]==pOpt
25310 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b  ->cShort ) break
25320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
25330 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25340 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20  pOpt==pEnd ){.  
25350 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
25360 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75  rn arErrorMsg("u
25370 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
25380 6f 6e 3a 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29  on: %c\n", z[i])
25390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
253a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
253b0 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
253d0 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  i<(n-1) ){.     
253e0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
253f0 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  = &z[i+1];.     
25400 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
25410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25430 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
25440 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
25460 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
25470 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65  ("option require
25480 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
25490 63 5c 6e 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20  c\n",z[i]);.    
254a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41                zA
254c0 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72  rg = azArg[++iAr
254d0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g];.            
254e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
254f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
25500 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  ( arProcessSwitc
25510 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77  h(pAr, pOpt->eSw
25520 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
25530 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25540 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
25550 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
25560 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20   z[2]=='\0' ){. 
25570 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d           /* A --
25580 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74   option, indicat
25590 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 72 65 6d  ing that all rem
255a0 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c  aining command l
255b0 69 6e 65 20 77 6f 72 64 73 0a 20 20 20 20 20 20  ine words.      
255c0 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61      ** are comma
255d0 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a  nd arguments.  *
255e0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  /.          pAr-
255f0 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b  >azArg = &azArg[
25600 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iArg+1];.       
25610 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e     pAr->nArg = n
25620 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20  Arg-iArg-1;.    
25630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25650 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20        /* A long 
25660 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
25670 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
25680 7a 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20  zArg = 0;       
25690 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
256a0 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66  t for option, if
256b0 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20 20 20   any */.        
256c0 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
256d0 68 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20  h *pMatch = 0;  
256e0 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20      /* Matching 
256f0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
25700 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
25710 74 63 68 20 2a 70 4f 70 74 3b 20 20 20 20 20 20  tch *pOpt;      
25720 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
25730 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  r */.          f
25740 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
25750 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
25760 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
25770 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25780 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a  *zLong = pOpt->z
25790 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Long;.          
257a0 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72    if( (n-2)<=str
257b0 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20  len30(zLong) && 
257c0 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c  0==memcmp(&z[2],
257d0 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a   zLong, n-2) ){.
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
257f0 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ( pMatch ){.    
25800 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
25810 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 61  rn arErrorMsg("a
25820 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a  mbiguous option:
25830 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20   %s",z);.       
25840 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d                pM
25860 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20  atch = pOpt;.   
25870 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25890 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
258a0 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20    if( pMatch==0 
258b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
258c0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
258d0 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f  ("unrecognized o
258e0 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a  ption: %s", z);.
258f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25900 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
25910 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
25920 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
25930 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
25940 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
25950 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74   arErrorMsg("opt
25960 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
25970 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a  argument: %s", z
25980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
25990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72  .            zAr
259a0 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67  g = azArg[++iArg
259b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
259c0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50           if( arP
259d0 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
259e0 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63  , pMatch->eSwitc
259f0 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
25a00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
25a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
25a50 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
25a60 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e  that all argumen
25a70 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 72  ts within the Ar
25a80 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a  Command.azArg[].
25a90 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72 20 74  ** array refer t
25aa0 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  o archive member
25ab0 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d  s, as for the --
25ac0 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73  extract or --lis
25ad0 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20  t commands. .** 
25ae0 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 65  It checks that e
25af0 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20  ach of them are 
25b00 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20  present. If any 
25b10 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 69  specified file i
25b20 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74  s not.** present
25b30 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c   in the archive,
25b40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69   an error is pri
25b50 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72 20 61  nted to stderr a
25b60 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63  nd an error.** c
25b70 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  ode returned. Ot
25b80 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
25b90 73 70 65 63 69 66 69 65 64 20 61 72 67 75 6d 65  specified argume
25ba0 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e 74 20  nts are present 
25bb0 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76  in.** the archiv
25bc0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
25bd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
25be0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74  This function st
25bf0 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e  rips any trailin
25c00 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73  g '/' characters
25c10 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d   from each argum
25c20 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ent..** This is 
25c30 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
25c40 74 68 65 20 77 61 79 20 74 68 65 20 5b 74 61 72  the way the [tar
25c50 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20  ] command seems 
25c60 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69  to work on.** Li
25c70 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nux..*/.static i
25c80 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65  nt arCheckEntrie
25c90 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  s(ArCommand *pAr
25ca0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
25cc0 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20  Ar->nArg ){.    
25cd0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73 71  int i, j;.    sq
25ce0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73  lite3_stmt *pTes
25cf0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65 6c  t = 0;..    shel
25d00 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
25d10 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 54  Ar->db, &rc, &pT
25d20 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22 53 45  est,.        "SE
25d30 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25  LECT name FROM %
25d40 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61  s WHERE name=$na
25d50 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 70 41  me", .        pA
25d60 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20 20  r->zSrcTable.   
25d70 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69   );.    j = sqli
25d80 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
25d90 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74 2c 20  er_index(pTest, 
25da0 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66 6f  "$name");.    fo
25db0 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41  r(i=0; i<pAr->nA
25dc0 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  rg && rc==SQLITE
25dd0 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _OK; i++){.     
25de0 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
25df0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
25e00 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
25e10 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  (z);.      int b
25e20 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  Ok = 0;.      wh
25e30 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
25e40 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20  1]=='/' ) n--;. 
25e50 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27       z[n] = '\0'
25e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
25e70 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
25e80 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   j, z, -1, SQLIT
25e90 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
25ea0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
25eb0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54  =sqlite3_step(pT
25ec0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
25ed0 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
25ee0 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
25ef0 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  t(&rc, pTest);. 
25f00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25f10 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30  ITE_OK && bOk==0
25f20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
25f30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
25f40 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72  "not found in ar
25f50 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29  chive: %s\n", z)
25f60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
25f70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25f80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
25f90 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
25fa0 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20 20  , pTest);.  }.  
25fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25fc0 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45  .** Format a WHE
25fd0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63  RE clause that c
25fe0 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  an be used again
25ff0 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  st the "sqlar" t
26000 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74  able to.** ident
26010 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20  ify all archive 
26020 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74  members that mat
26030 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61  ch the command a
26040 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a  rguments held.**
26050 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76   in (*pAr). Leav
26060 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61  e this WHERE cla
26070 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65  use in (*pzWhere
26080 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
26090 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  ng..** The calle
260a0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
260b0 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20   for eventually 
260c0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
260d0 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79  free() on.** any
260e0 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68   non-NULL (*pzWh
260f0 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ere) value..*/.s
26100 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68 65  tatic void arWhe
26110 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20  reClause(.  int 
26120 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61  *pRc, .  ArComma
26130 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72  nd *pAr, .  char
26140 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20   **pzWhere      
26150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26160 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c  UT: New WHERE cl
26170 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ause */.){.  cha
26180 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
26190 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
261a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
261b0 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a  pAr->nArg==0 ){.
261c0 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73        zWhere = s
261d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
261e0 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1");.    }else{.
261f0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
26200 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26210 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
26220 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
26230 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
26240 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26250 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
26260 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72  ];.        zWher
26270 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
26280 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
26290 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25 71 27  %z%s name = '%q'
262a0 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d 65 2c   OR substr(name,
262b0 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22 2c 20  1,%d) = '%q/'", 
262c0 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72  .          zWher
262d0 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72 6c  e, zSep, z, strl
262e0 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20 20  en30(z)+1, z.   
262f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26300 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b  if( zWhere==0 ){
26310 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20  .          *pRc 
26320 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
26330 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
26340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26350 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22     zSep = " OR "
26360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26370 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d    }.  *pzWhere =
26380 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a   zWhere;.}../*.*
26390 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
263a0 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20 63   of .ar "lisT" c
263b0 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74  ommand. .*/.stat
263c0 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f 6d  ic int arListCom
263d0 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  mand(ArCommand *
263e0 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pAr){.  const ch
263f0 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45  ar *zSql = "SELE
26400 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48  CT %s FROM %s WH
26410 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73  ERE %s"; .  cons
26420 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d  t char *azCols[]
26430 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22 2c   = {.    "name",
26440 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f 64  .    "lsmode(mod
26450 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d 65  e), sz, datetime
26460 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70 6f  (mtime, 'unixepo
26470 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b  ch'), name".  };
26480 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  ..  char *zWhere
26490 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
264a0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
264b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
264c0 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
264d0 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
264e0 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
264f0 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68   &zWhere);..  sh
26500 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
26510 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
26520 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f  pSql, zSql, azCo
26530 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  ls[pAr->bVerbose
26540 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
26550 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72          pAr->zSr
26560 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 29 3b  cTable, zWhere);
26570 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79  .  if( pAr->bDry
26580 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Run ){.    utf8_
26590 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
265a0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
265b0 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
265c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
265d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
265e0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
265f0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
26600 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ql) ){.      if(
26610 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29   pAr->bVerbose )
26620 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
26630 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
26640 74 2c 20 22 25 73 20 25 20 31 30 64 20 20 25 73  t, "%s % 10d  %s
26650 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %s\n",.       
26660 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
26670 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
26680 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
26690 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
266a0 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20  t(pSql, 1), .   
266b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
266c0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
266d0 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20  l, 2),.         
266e0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
266f0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 0a  n_text(pSql, 3).
26700 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26720 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
26730 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
26740 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26750 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
26760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26770 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  }.  shellFinaliz
26780 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20  e(&rc, pSql);.  
26790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
267a0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
267b0 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72  ion of .ar "eXtr
267c0 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  act" command. .*
267d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
267e0 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72  xtractCommand(Ar
267f0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
26800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
26810 6c 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43  l1 = .    "SELEC
26820 54 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20  T ".    " ($dir 
26830 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22  || name),".    "
26840 20 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72   writefile(($dir
26850 20 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d   || name), %s, m
26860 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20  ode, mtime) ".  
26870 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45    "FROM %s WHERE
26880 20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20   (%s) AND (data 
26890 49 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f  IS NULL OR $dirO
268a0 6e 6c 79 20 3d 20 30 29 22 3b 0a 0a 20 20 63 6f  nly = 0)";..  co
268b0 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72  nst char *azExtr
268c0 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20  aArg[] = { .    
268d0 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73  "sqlar_uncompres
268e0 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20  s(data, sz)",.  
268f0 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20    "data".  };.. 
26900 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26910 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
26920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26930 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
26940 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
26950 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
26960 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
26970 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
26980 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  d, check that th
26990 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  ey actually exis
269a0 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  t within.  ** th
269b0 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65  e archive before
269c0 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64   proceeding. And
269d0 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45   formulate a WHE
269e0 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a  RE clause to.  *
269f0 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a  * match them.  *
26a00 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  /.  rc = arCheck
26a10 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
26a20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
26a30 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
26a40 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
26a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26a60 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20  ( pAr->zDir ){. 
26a70 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
26a80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
26a90 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20  ", pAr->zDir);. 
26aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26ab0 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
26ac0 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20  printf("");.    
26ad0 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  }.    if( zDir==
26ae0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
26af0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68  NOMEM;.  }..  sh
26b00 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
26b10 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
26b20 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20  pSql, zSql1, .  
26b30 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70      azExtraArg[p
26b40 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e  Ar->bZip], pAr->
26b50 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
26b60 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
26b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26b80 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
26b90 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
26ba0 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22  dex(pSql, "$dir"
26bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
26bc0 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a  ind_text(pSql, j
26bd0 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49  , zDir, -1, SQLI
26be0 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20  TE_STATIC);..   
26bf0 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45   /* Run the SELE
26c00 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69  CT statement twi
26c10 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  ce. The first ti
26c20 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20  me, writefile() 
26c30 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a  is called.    **
26c40 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65   for all archive
26c50 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68   members that sh
26c60 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65  ould be extracte
26c70 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69  d. The second ti
26c80 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  me,.    ** only 
26c90 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
26ca0 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ies. This is bec
26cb0 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61  ause the timesta
26cc0 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  mps for.    ** e
26cd0 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f  xtracted directo
26ce0 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73  ries must be res
26cf0 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72  et after they ar
26d00 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a  e populated (as.
26d10 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e      ** populatin
26d20 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74  g them changes t
26d30 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20  he timestamp).  
26d40 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
26d50 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
26d60 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
26d70 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
26d80 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c  x(pSql, "$dirOnl
26d90 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y");.      sqlit
26da0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
26db0 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , j, i);.      i
26dc0 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
26dd0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
26de0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
26df0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
26e00 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
26e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26e20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
26e30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
26e40 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
26e50 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
26e60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
26e70 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f  0 && pAr->bVerbo
26e80 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
26e90 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
26ea0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
26eb0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
26ec0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
26ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26ef0 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
26f00 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20  (&rc, pSql);.   
26f10 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
26f20 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
26f30 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
26f40 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71  free(zDir);.  sq
26f50 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
26f60 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
26f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
26f80 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
26f90 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20  in zSql.  Or if 
26fa0 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e  doing a --dryrun
26fb0 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69  , merely print i
26fc0 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t out..*/.static
26fd0 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41   int arExecSql(A
26fe0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
26ff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
27000 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
27010 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
27020 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
27030 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
27040 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
27050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
27070 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
27080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
27090 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53  exec(pAr->db, zS
270a0 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  ql, 0, 0, &zErr)
270b0 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29  ;.    if( zErr )
270c0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
270d0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52  ntf(stdout, "ERR
270e0 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  OR: %s\n", zErr)
270f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27100 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
27110 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
27120 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
27130 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
27140 61 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20  ar "create" and 
27150 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64  "update" command
27160 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  s..**.** Create 
27170 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c  the "sqlar" tabl
27180 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
27190 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
271a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
271b0 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68  ** Then add each
271c0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46   file in the azF
271d0 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74  ile[] array to t
271e0 68 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65  he archive. Dire
271f0 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61  ctories.** are a
27200 64 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  dded recursively
27210 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56  . If argument bV
27220 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65  erbose is non-ze
27230 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73  ro, a message is
27240 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73  .** printed on s
27250 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66  tdout for each f
27260 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a  ile archived..**
27270 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63  .** The create c
27280 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61  ommand is the sa
27290 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78  me as update, ex
272a0 63 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f  cept that it dro
272b0 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69  ps.** any existi
272c0 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  ng "sqlar" table
272d0 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
272e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
272f0 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
27300 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f  eCommand(.  ArCo
27310 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20  mmand *pAr,     
27320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
27330 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27340 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a   and options */.
27350 20 20 69 6e 74 20 62 55 70 64 61 74 65 20 20 20    int bUpdate   
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 20 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20    /* true for a 
27380 2d 2d 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65  --create.  false
27390 20 66 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f   for --update */
273a0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
273b0 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20   *zCreate = .   
273c0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
273d0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
273e0 71 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22  qlar(\n".      "
273f0 20 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d    name TEXT PRIM
27400 41 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d  ARY KEY,  -- nam
27410 65 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22  e of the file\n"
27420 0a 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49  .      "  mode I
27430 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
27440 20 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d    -- access perm
27450 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20  issions\n".     
27460 20 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20   "  mtime INT,  
27470 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c              -- l
27480 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ast modification
27490 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22   time\n".      "
274a0 20 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20    sz INT,       
274b0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69            -- ori
274c0 67 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c  ginal file size\
274d0 6e 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61  n".      "  data
274e0 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   BLOB           
274f0 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65      -- compresse
27500 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20  d content\n".   
27510 20 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20     ")";.  const 
27520 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44  char *zDrop = "D
27530 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
27540 53 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f  STS sqlar";.  co
27550 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72  nst char *zInser
27560 74 46 6d 74 20 3d 20 0a 20 20 20 20 20 22 52 45  tFmt = .     "RE
27570 50 4c 41 43 45 20 49 4e 54 4f 20 73 71 6c 61 72  PLACE INTO sqlar
27580 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
27590 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20  ,sz,data)\n".   
275a0 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20    "  SELECT\n". 
275b0 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a      "    %s,\n".
275c0 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c       "    mode,\
275d0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69  n".     "    mti
275e0 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  me,\n".     "   
275f0 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d   CASE substr(lsm
27600 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e  ode(mode),1,1)\n
27610 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48  ".     "      WH
27620 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67  EN '-' THEN leng
27630 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  th(data)\n".    
27640 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64 27   "      WHEN 'd'
27650 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20   THEN 0\n".     
27660 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45  "      ELSE -1 E
27670 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ND,\n".     "   
27680 20 43 41 53 45 20 57 48 45 4e 20 6c 73 6d 6f 64   CASE WHEN lsmod
27690 65 28 6d 6f 64 65 29 20 4c 49 4b 45 20 27 64 25  e(mode) LIKE 'd%
276a0 25 27 20 54 48 45 4e 20 4e 55 4c 4c 20 65 6c 73  %' THEN NULL els
276b0 65 20 64 61 74 61 20 45 4e 44 5c 6e 22 0a 20 20  e data END\n".  
276c0 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72     "  FROM fsdir
276d0 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20  (%Q,%Q)\n".     
276e0 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
276f0 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
27700 3f 25 25 27 3b 22 3b 0a 20 20 69 6e 74 20 69 3b  ?%%';";.  int i;
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
27730 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
27740 67 68 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20  gh azFile[] */. 
27750 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27780 2a 2f 0a 0a 20 20 72 63 20 3d 20 61 72 45 78 65  */..  rc = arExe
27790 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50  cSql(pAr, "SAVEP
277a0 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66  OINT ar;");.  if
277b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
277c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
277d0 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b  f( bUpdate==0 ){
277e0 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
277f0 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b  Sql(pAr, zDrop);
27800 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27810 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27820 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 61  rc;.  }.  rc = a
27830 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 43  rExecSql(pAr, zC
27840 72 65 61 74 65 29 3b 0a 20 20 66 6f 72 28 69 3d  reate);.  for(i=
27850 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26  0; i<pAr->nArg &
27860 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
27870 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
27880 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
27890 6d 70 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46  mprintf(zInsertF
278a0 6d 74 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  mt,.        pAr-
278b0 3e 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65  >bVerbose ? "she
278c0 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22  ll_putsnl(name)"
278d0 20 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20   : "name",.     
278e0 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d     pAr->azArg[i]
278f0 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
27900 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
27910 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  (pAr, zSql);.   
27920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
27930 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ql);.  }.  if( r
27940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27950 20 20 20 20 61 72 45 78 65 63 53 71 6c 28 70 41      arExecSql(pA
27960 72 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  r, "ROLLBACK TO 
27970 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22  ar; RELEASE ar;"
27980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27990 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
279a0 41 72 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b  Ar, "RELEASE ar;
279b0 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
279c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
279d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
279e0 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e  ".ar" dot comman
279f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27a00 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20   arDotCommand(. 
27a10 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
27a20 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
27a30 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
27a40 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
27a50 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
27a80 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
27a90 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
27aa0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ac0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27ad0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
27ae0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d  [] */.){.  ArCom
27af0 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20  mand cmd;.  int 
27b00 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d  rc;.  memset(&cm
27b10 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64  d, 0, sizeof(cmd
27b20 29 29 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72  ));.  rc = arPar
27b30 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c  seCommand(azArg,
27b40 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20   nArg, &cmd);.  
27b50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27b60 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62  K ){.    int eDb
27b70 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Type = SHELL_OPE
27b80 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d  N_UNSPEC;.    cm
27b90 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20  d.p = pState;.  
27ba0 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74    cmd.db = pStat
27bb0 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63  e->db;.    if( c
27bc0 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
27bd0 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75    eDbType = dedu
27be0 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63  ceDatabaseType(c
27bf0 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  md.zFile);.    }
27c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54  else{.      eDbT
27c10 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70  ype = pState->op
27c20 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20  enMode;.    }.  
27c30 20 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53    if( eDbType==S
27c40 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
27c50 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  E ){.      if( c
27c60 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  md.zFile==0 ){. 
27c70 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54         cmd.zSrcT
27c80 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  able = sqlite3_m
27c90 70 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20  printf("zip");. 
27ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27cb0 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c      cmd.zSrcTabl
27cc0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
27cd0 6e 74 66 28 22 7a 69 70 66 69 6c 65 28 25 51 29  ntf("zipfile(%Q)
27ce0 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20  ", cmd.zFile);. 
27cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27d00 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
27d10 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e  D_CREATE || cmd.
27d20 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
27d30 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ATE ){.        u
27d40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
27d50 72 2c 20 22 7a 69 70 20 61 72 63 68 69 76 65 73  r, "zip archives
27d60 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 5c 6e   are read-only\n
27d70 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
27d80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27d90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27da0 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20  ar_command;.    
27db0 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a    }.      cmd.bZ
27dc0 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ip = 1;.    }els
27dd0 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20  e if( cmd.zFile 
27de0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  ){.      int fla
27df0 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  gs;.      if( cm
27e00 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62 54  d.bAppend ) eDbT
27e10 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
27e20 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20  _APPENDVFS;.    
27e30 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d    if( cmd.eCmd==
27e40 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c  AR_CMD_CREATE ||
27e50 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
27e60 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  D_UPDATE ){.    
27e70 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
27e80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
27e90 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
27ea0 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
27eb0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
27ec0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27ed0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
27ee0 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20  .      cmd.db = 
27ef0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  0;.      if( cmd
27f00 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  .bDryRun ){.    
27f10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27f20 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d  pState->out, "--
27f30 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27   open database '
27f40 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46  %s'%s\n", cmd.zF
27f50 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
27f60 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
27f70 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
27f80 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76  ? " using 'apndv
27f90 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20  fs'" : "");.    
27fa0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
27fb0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63  qlite3_open_v2(c
27fc0 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64  md.zFile, &cmd.d
27fd0 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20  b, flags, .     
27fe0 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
27ff0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
28000 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73  NDVFS ? "apndvfs
28010 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66  " : 0);.      if
28020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28030 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
28040 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28050 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
28060 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20  : %s (%s)\n", . 
28070 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a             cmd.z
28080 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  File, sqlite3_er
28090 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20  rmsg(cmd.db).   
280a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
280b0 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
280c0 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
280d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
280e0 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  o_init(cmd.db, 0
280f0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
28100 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20  ITE_HAVE_ZLIB.  
28110 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
28120 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  r_init(cmd.db, 0
28130 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
28140 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
28150 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64  e_function(cmd.d
28160 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
28170 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
28180 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20  8, cmd.p,.      
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
281b0 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20  sFunc, 0, 0);.. 
281c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64     }.    if( cmd
281d0 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 29 7b  .zSrcTable==0 ){
281e0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
281f0 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd!=AR_CMD_CREA
28200 54 45 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  TE.       && sql
28210 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
28220 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64  n_metadata(cmd.d
28230 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d  b,0,"sqlar","nam
28240 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20  e",0,0,0,0,0).  
28250 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
28260 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
28270 72 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f 65  r, "database doe
28280 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
28290 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e   'sqlar' table\n
282a0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
282b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
282c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
282d0 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20  ar_command;.    
282e0 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53    }.      cmd.zS
282f0 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  rcTable = sqlite
28300 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72  3_mprintf("sqlar
28310 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ");.    }..    s
28320 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20  witch( cmd.eCmd 
28330 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ){.      case AR
28340 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20  _CMD_CREATE:.   
28350 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
28360 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
28370 64 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20 20  d(&cmd, 0);.    
28380 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
28390 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58    case AR_CMD_EX
283a0 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72  TRACT:.        r
283b0 63 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d  c = arExtractCom
283c0 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20  mand(&cmd);.    
283d0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
283e0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
283f0 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ST:.        rc =
28400 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26   arListCommand(&
28410 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
28420 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
28430 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
28440 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53        arUsage(pS
28450 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  tate->out);.    
28460 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
28470 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
28480 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65     assert( cmd.e
28490 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
284a0 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  TE );.        rc
284b0 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
284c0 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
284d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
284e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e  ak;.    }.  }.en
284f0 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20  d_ar_command:.  
28500 69 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61  if( cmd.db!=pSta
28510 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71  te->db ){.    sq
28520 6c 69 74 65 33 5f 63 6c 6f 73 65 28 63 6d 64 2e  lite3_close(cmd.
28530 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
28540 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63  e3_free(cmd.zSrc
28550 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72  Table);..  retur
28560 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  n rc;.}./* End o
28570 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22  f the ".archive"
28580 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   or ".ar" comman
28590 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a  d logic.********
285a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
285f0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
28600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28610 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
28620 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
28630 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  ZLIB) */.../*.**
28640 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e   If an input lin
28650 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e  e begins with ".
28660 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  " then invoke th
28670 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a  is routine to.**
28680 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69   process that li
28690 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ne..**.** Return
286a0 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74   1 on error, 2 t
286b0 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74  o exit, and 0 ot
286c0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
286d0 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63  ic int do_meta_c
286e0 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69  ommand(char *zLi
286f0 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ne, ShellState *
28700 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b  p){.  int h = 1;
28710 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
28720 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69  .  int n, c;.  i
28730 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61  nt rc = 0;.  cha
28740 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23  r *azArg[50];..#
28750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28760 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
28770 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e    if( p->expert.
28780 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65  pExpert ){.    e
28790 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31  xpertFinish(p, 1
287a0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
287b0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
287c0 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f   input line into
287d0 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
287e0 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
287f0 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a  && nArg<ArraySiz
28800 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  e(azArg) ){.    
28810 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
28820 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b  Line[h]) ){ h++;
28830 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
28840 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [h]==0 ) break;.
28850 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
28860 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
28870 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  h]=='"' ){.     
28880 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
28890 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[h++];.      a
288a0 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
288b0 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
288c0 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
288d0 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c  && zLine[h]!=del
288e0 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  im ){.        if
288f0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27  ( zLine[h]=='\\'
28900 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26   && delim=='"' &
28910 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20  & zLine[h+1]!=0 
28920 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68  ) h++;.        h
28930 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
28940 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
28950 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
28960 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
28970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28980 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20  f( delim=='"' ) 
28990 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
289a0 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
289b0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
289c0 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
289d0 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
289e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
289f0 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63  ne[h] && !IsSpac
28a00 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
28a10 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
28a20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65  zLine[h] ) zLine
28a30 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
28a40 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
28a50 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
28a60 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
28a70 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
28a80 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
28a90 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
28aa0 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
28ab0 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
28ac0 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
28ad0 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
28ae0 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
28af0 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ];.  clearTempFi
28b00 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  le(p);..#ifndef 
28b10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
28b20 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
28b30 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  c=='a' && strncm
28b40 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74  p(azArg[0], "aut
28b50 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  h", n)==0 ){.   
28b60 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
28b70 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
28b80 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
28b90 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22   .auth ON|OFF\n"
28ba0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
28bb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
28bc0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
28bd0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
28be0 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
28bf0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
28c00 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
28c10 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
28c20 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68  orizer(p->db, sh
28c30 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20  ellAuth, p);.   
28c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
28c50 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
28c60 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30  izer(p->db, 0, 0
28c70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28c80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
28c90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
28ca0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
28cb0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
28cc0 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69  E_HAVE_ZLIB).  i
28cd0 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72  f( c=='a' && str
28ce0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
28cf0 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20  archive", n)==0 
28d00 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
28d10 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  , 0);.    rc = a
28d20 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61  rDotCommand(p, a
28d30 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d  zArg, nArg);.  }
28d40 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
28d50 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e  f( (c=='b' && n>
28d60 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
28d70 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22  Arg[0], "backup"
28d80 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  , n)==0).   || (
28d90 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26  c=='s' && n>=3 &
28da0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
28db0 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d  0], "save", n)==
28dc0 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  0).  ){.    cons
28dd0 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
28de0 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  e = 0;.    const
28df0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
28e00 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65      sqlite3 *pDe
28e10 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  st;.    sqlite3_
28e20 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
28e30 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
28e40 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b  for(j=1; j<nArg;
28e50 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   j++){.      con
28e60 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41  st char *z = azA
28e70 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rg[j];.      if(
28e80 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
28e90 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30        while( z[0
28ea0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
28eb0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 74 69        /* No opti
28ec0 6f 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20 61  ons to process a
28ed0 74 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  t this time */. 
28ee0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
28ef0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
28f00 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
28f10 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61  option: %s\n", a
28f20 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  zArg[j]);.      
28f30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
28f50 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c  lse if( zDestFil
28f60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28f70 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72  zDestFile = azAr
28f80 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g[j];.      }els
28f90 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a  e if( zDb==0 ){.
28fa0 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44          zDb = zD
28fb0 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20  estFile;.       
28fc0 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41   zDestFile = azA
28fd0 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  rg[j];.      }el
28fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
28ff0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29000 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e  too many argumen
29010 74 73 20 74 6f 20 2e 62 61 63 6b 75 70 5c 6e 22  ts to .backup\n"
29020 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
29030 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
29040 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74   }.    if( zDest
29050 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
29060 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29070 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c  rr, "missing FIL
29080 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f  ENAME argument o
29090 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20  n .backup\n");. 
290a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
290b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62     }.    if( zDb
290c0 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69  ==0 ) zDb = "mai
290d0 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  n";.    rc = sql
290e0 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
290f0 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
29100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
29120 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29130 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
29140 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
29150 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20  zDestFile);.    
29160 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
29170 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
29180 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
29190 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
291a0 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
291b0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
291c0 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22  it(pDest, "main"
291d0 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20  , p->db, zDb);. 
291e0 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
291f0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
29200 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29210 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
29220 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
29230 73 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  st));.      sqli
29240 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
29250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
29260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
29270 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65  e(  (rc = sqlite
29280 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
29290 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
292a0 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73  ITE_OK ){}.    s
292b0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
292c0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
292d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
292e0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
292f0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
29300 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
29310 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
29320 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
29330 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
29340 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
29350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29360 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
29370 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
29380 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
29390 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
293a0 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d  [0], "bail", n)=
293b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
293c0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62  rg==2 ){.      b
293d0 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62  ail_on_error = b
293e0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
293f0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
29400 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
29410 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
29420 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c  e: .bail on|off\
29430 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29440 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
29450 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
29460 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
29470 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e  p(azArg[0], "bin
29480 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ary", n)==0 ){. 
29490 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
294a0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c  {.      if( bool
294b0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
294c0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ]) ){.        se
294d0 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f  tBinaryMode(p->o
294e0 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ut, 1);.      }e
294f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74  lse{.        set
29500 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  TextMode(p->out,
29510 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
29520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
29530 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29540 20 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79   "Usage: .binary
29550 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
29560 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
29570 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
29580 63 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70  c=='c' && strcmp
29590 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d  (azArg[0],"cd")=
295a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
295b0 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66  rg==2 ){.#if def
295c0 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
295d0 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20  defined(WIN32). 
295e0 20 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20       wchar_t *z 
295f0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
29600 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
29610 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
29620 20 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e   rc = !SetCurren
29630 74 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a  tDirectoryW(z);.
29640 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29650 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ee(z);.#else.   
29660 20 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a     rc = chdir(az
29670 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a  Arg[1]);.#endif.
29680 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29690 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
296a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
296b0 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69  not change to di
296c0 72 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e  rectory \"%s\"\n
296d0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
296e0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
296f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
29700 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29710 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
29720 3a 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c  : .cd DIRECTORY\
29730 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29740 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
29750 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63  ..  /* The undoc
29760 75 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70  umented ".breakp
29770 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61  oint" command ca
29780 75 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74  uses a call to t
29790 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f  he no-op.  ** ro
297a0 75 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74  utine named test
297b0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20  _breakpoint().. 
297c0 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27   */.  if( c=='b'
297d0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
297e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
297f0 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d  reakpoint", n)==
29800 30 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72  0 ){.    test_br
29810 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65  eakpoint();.  }e
29820 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
29830 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
29840 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29850 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20  changes", n)==0 
29860 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
29870 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f  =2 ){.      setO
29880 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  rClearFlag(p, SH
29890 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73  FLG_CountChanges
298a0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
298b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
298c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
298d0 20 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65   "Usage: .change
298e0 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
298f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29900 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
29910 43 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65  Cancel output re
29920 64 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74  direction, if it
29930 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
29940 74 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29  t (by .testcase)
29950 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20  .  ** Then read 
29960 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
29970 68 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  he testcase-out.
29980 74 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d  txt file and com
29990 70 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a  pare against.  *
299a0 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20  * azArg[1].  If 
299b0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
299c0 65 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e  ences, report an
299d0 20 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e   error and exit.
299e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  .  */.  if( c=='
299f0 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  c' && n>=3 && st
29a00 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
29a10 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29  "check", n)==0 )
29a20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73  {.    char *zRes
29a30 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74   = 0;.    output
29a40 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
29a50 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
29a60 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29a70 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
29a80 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45  check GLOB-PATTE
29a90 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  RN\n");.      rc
29aa0 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 2;.    }else 
29ab0 69 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64  if( (zRes = read
29ac0 46 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f  File("testcase-o
29ad0 75 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20  ut.txt", 0))==0 
29ae0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
29af0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
29b00 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20  or: cannot read 
29b10 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  'testcase-out.tx
29b20 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t'\n");.      rc
29b30 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 2;.    }else 
29b40 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
29b50 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29  b(azArg[1],zRes)
29b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
29b70 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29b90 20 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46    "testcase-%s F
29ba0 41 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64  AILED\n Expected
29bb0 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f  : [%s]\n      Go
29bc0 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  t: [%s]\n",.    
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
29be0 7a 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67  zTestcase, azArg
29bf0 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20  [1], zRes);.    
29c00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
29c10 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
29c20 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
29c30 74 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e  testcase-%s ok\n
29c40 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  ", p->zTestcase)
29c50 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63  ;.      p->nChec
29c60 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  k++;.    }.    s
29c70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
29c80 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
29c90 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e  ( c=='c' && strn
29ca0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
29cb0 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lone", n)==0 ){.
29cc0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
29cd0 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c  ){.      tryToCl
29ce0 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29  one(p, azArg[1])
29cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29d00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29d10 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
29d20 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  lone FILENAME\n"
29d30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
29d40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
29d50 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
29d60 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
29d70 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61  zArg[0], "databa
29d80 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ses", n)==0 ){. 
29d90 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
29da0 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
29db0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f  rrMsg = 0;.    o
29dc0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
29dd0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
29de0 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
29df0 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
29e00 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
29e10 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
29e20 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
29e30 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  t;.    sqlite3_s
29e40 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64  nprintf(sizeof(d
29e50 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
29e60 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  ),data.colSepara
29e70 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64  tor,": ");.    d
29e80 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ata.cnt = 0;.   
29e90 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
29ea0 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d  >db, "SELECT nam
29eb0 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61  e, file FROM pra
29ec0 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73  gma_database_lis
29ed0 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
29ee0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
29ef0 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
29f00 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
29f10 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
29f20 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
29f30 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
29f40 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
29f50 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
29f60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
29f70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
29f80 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
29f90 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
29fa0 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d  , "dbinfo", n)==
29fb0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 68  0 ){.    rc = sh
29fc0 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
29fd0 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72  nd(p, nArg, azAr
29fe0 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  g);.  }else..  i
29ff0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
2a000 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2a010 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  dump", n)==0 ){.
2a020 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a030 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20 20 69  zLike = 0;.    i
2a040 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 73 61  nt i;.    int sa
2a050 76 65 64 53 68 6f 77 48 65 61 64 65 72 20 3d 20  vedShowHeader = 
2a060 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
2a070 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61     ShellClearFla
2a080 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
2a090 72 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e  rveRowid|SHFLG_N
2a0a0 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 66 6f  ewlines);.    fo
2a0b0 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
2a0c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
2a0d0 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20  zArg[i][0]=='-' 
2a0e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2a0f0 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
2a100 5b 69 5d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  [i]+1;.        i
2a110 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  f( z[0]=='-' ) z
2a120 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
2a130 73 74 72 63 6d 70 28 7a 2c 22 70 72 65 73 65 72  strcmp(z,"preser
2a140 76 65 2d 72 6f 77 69 64 73 22 29 3d 3d 30 20 29  ve-rowids")==0 )
2a150 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2a160 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2a170 45 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  E.          raw_
2a180 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a190 54 68 65 20 2d 2d 70 72 65 73 65 72 76 65 2d 72  The --preserve-r
2a1a0 6f 77 69 64 73 20 6f 70 74 69 6f 6e 20 69 73 20  owids option is 
2a1b0 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a  not compatible".
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77               " w
2a1e0 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ith SQLITE_OMIT_
2a1f0 56 49 52 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29  VIRTUALTABLE\n")
2a200 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2a210 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
2a220 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2a230 65 78 69 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20  exit;.#else.    
2a240 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c        ShellSetFl
2a250 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
2a260 65 72 76 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64  erveRowid);.#end
2a270 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
2a280 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
2a290 63 6d 70 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22  cmp(z,"newlines"
2a2a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a2b0 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70    ShellSetFlag(p
2a2c0 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
2a2d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2a2e0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2a2f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2a300 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e  stderr, "Unknown
2a310 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f   option \"%s\" o
2a320 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20  n \".dump\"\n", 
2a330 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
2a340 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2a350 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2a360 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2a370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a380 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29  else if( zLike )
2a390 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2a3a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2a3b0 61 67 65 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72  age: .dump ?--pr
2a3c0 65 73 65 72 76 65 2d 72 6f 77 69 64 73 3f 20 22  eserve-rowids? "
2a3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 22 3f 2d 2d              "?--
2a3f0 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d  newlines? ?LIKE-
2a400 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
2a410 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2a420 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2a430 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2a440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a450 20 20 20 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67     zLike = azArg
2a460 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
2a470 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
2a480 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65  , 0);.    /* Whe
2a490 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61  n playing back a
2a4a0 20 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e   "dump", the con
2a4b0 74 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61  tent might appea
2a4c0 72 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20  r in an order.  
2a4d0 20 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65    ** which cause
2a4e0 73 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  s immediate fore
2a4f0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2a500 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74  nts to be violat
2a510 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69  ed..    ** So di
2a520 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65  sable foreign-ke
2a530 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66  y constraint enf
2a540 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76  orcement to prev
2a550 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f  ent problems. */
2a560 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2a570 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
2a580 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
2a590 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70  ;\n");.    raw_p
2a5a0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42  rintf(p->out, "B
2a5b0 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
2a5c0 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72  ;\n");.    p->wr
2a5d0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
2a5e0 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61  ;.    p->showHea
2a5f0 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  der = 0;.    /* 
2a600 53 65 74 20 77 72 69 74 61 62 6c 65 5f 73 63 68  Set writable_sch
2a610 65 6d 61 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69  ema=ON since doi
2a620 6e 67 20 73 6f 20 66 6f 72 63 65 73 20 53 51 4c  ng so forces SQL
2a630 69 74 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ite to initializ
2a640 65 0a 20 20 20 20 2a 2a 20 61 73 20 6d 75 63 68  e.    ** as much
2a650 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 61   of the schema a
2a660 73 20 69 74 20 63 61 6e 20 65 76 65 6e 20 69 66  s it can even if
2a670 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2a680 65 72 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20  er table is.    
2a690 2a 2a 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  ** corrupt. */. 
2a6a0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2a6b0 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e  p->db, "SAVEPOIN
2a6c0 54 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77  T dump; PRAGMA w
2a6d0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
2a6e0 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
2a6f0 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20    p->nErr = 0;. 
2a700 20 20 20 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20     if( zLike==0 
2a710 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  ){.      run_sch
2a720 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
2a730 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
2a740 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
2a750 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
2a760 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
2a770 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
2a780 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  LL AND type=='ta
2a790 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27  ble' AND name!='
2a7a0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
2a7b0 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
2a7c0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
2a7d0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
2a7e0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
2a7f0 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
2a800 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
2a810 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6e 61         "WHERE na
2a820 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me=='sqlite_sequ
2a830 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
2a840 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
2a850 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
2a860 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
2a870 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
2a880 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
2a890 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
2a8a0 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  LL AND type IN (
2a8b0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
2a8c0 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20  ','view')", 0.  
2a8d0 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
2a8e0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
2a8f0 71 6c 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  ql;.      zSql =
2a900 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2a910 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
2a920 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
2a930 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
2a940 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
2a950 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c  WHERE tbl_name L
2a960 49 4b 45 20 25 51 20 41 4e 44 20 74 79 70 65 3d  IKE %Q AND type=
2a970 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20  ='table'".      
2a980 20 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54    "  AND sql NOT
2a990 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a   NULL", zLike);.
2a9a0 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
2a9b0 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53  _dump_query(p,zS
2a9c0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
2a9d0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2a9e0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
2a9f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2aa00 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
2aa10 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2aa20 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
2aa30 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
2aa40 4c 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  L".        "  AN
2aa50 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
2aa60 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
2aa70 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 22 20  ew')".        " 
2aa80 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
2aa90 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a  KE %Q", zLike);.
2aaa0 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
2aab0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53  dump_query(p, zS
2aac0 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ql, 0);.      sq
2aad0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2aae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2aaf0 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
2ab00 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
2ab10 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
2ab20 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
2ab30 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  chema=OFF;\n");.
2ab40 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c        p->writabl
2ab50 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
2ab60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
2ab70 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
2ab80 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
2ab90 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20  ma=OFF;", 0, 0, 
2aba0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
2abb0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
2abc0 45 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20  EASE dump;", 0, 
2abd0 30 2c 20 30 29 3b 0a 20 20 20 20 72 61 77 5f 70  0, 0);.    raw_p
2abe0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d  rintf(p->out, p-
2abf0 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43  >nErr ? "ROLLBAC
2ac00 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72  K; -- due to err
2ac10 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54  ors\n" : "COMMIT
2ac20 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68  ;\n");.    p->sh
2ac30 6f 77 48 65 61 64 65 72 20 3d 20 73 61 76 65 64  owHeader = saved
2ac40 53 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 7d 65  ShowHeader;.  }e
2ac50 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
2ac60 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2ac70 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e  rg[0], "echo", n
2ac80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2ac90 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2aca0 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
2acb0 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61  p, SHFLG_Echo, a
2acc0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2acd0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2ace0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2acf0 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f  sage: .echo on|o
2ad00 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2ad10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2ad20 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
2ad30 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2ad40 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29  rg[0], "eqp", n)
2ad50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2ad60 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2ad70 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
2ad80 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29  [1],"full")==0 )
2ad90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
2ada0 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66  oEQP = AUTOEQP_f
2adb0 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ull;.      }else
2adc0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
2add0 67 5b 31 5d 2c 22 74 72 69 67 67 65 72 22 29 3d  g[1],"trigger")=
2ade0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
2adf0 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45  >autoEQP = AUTOE
2ae00 51 50 5f 74 72 69 67 67 65 72 3b 0a 20 20 20 20  QP_trigger;.    
2ae10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ae20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75   p->autoEQP = (u
2ae30 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
2ae40 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2ae50 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2ae60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2ae70 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
2ae80 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65  qp off|on|trigge
2ae90 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20  r|full\n");.    
2aea0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2aeb0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2aec0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
2aed0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
2aee0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2aef0 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72  if( nArg>1 && (r
2af00 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  c = (int)integer
2af10 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29  Value(azArg[1]))
2af20 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a  !=0 ) exit(rc);.
2af30 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
2af40 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e  lse..  /* The ".
2af50 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64  explain" command
2af60 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f   is automatic no
2af70 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c  w.  It is largel
2af80 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74  y pointless.  It
2af90 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70  .  ** retained p
2afa0 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61  urely for backwa
2afb0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2afc0 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65  y */.  if( c=='e
2afd0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2afe0 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22  rg[0], "explain"
2aff0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2b000 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20  nt val = 1;.    
2b010 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
2b020 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2b030 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29  azArg[1],"auto")
2b040 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  ==0 ){.        v
2b050 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d  al = 99;.      }
2b060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61  else{.        va
2b070 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  l =  booleanValu
2b080 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2b090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b0a0 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e  f( val==1 && p->
2b0b0 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode!=MODE_Expla
2b0c0 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  in ){.      p->n
2b0d0 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d  ormalMode = p->m
2b0e0 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ode;.      p->mo
2b0f0 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
2b100 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  n;.      p->auto
2b110 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
2b120 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
2b130 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2b140 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
2b150 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
2b160 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
2b170 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
2b180 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
2b190 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20  lse if( val==99 
2b1a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2b1b0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
2b1c0 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
2b1d0 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
2b1e0 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
2b1f0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  in = 1;.    }.  
2b200 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2b210 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2b220 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d  ALTABLE.  if( c=
2b230 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2b240 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72  azArg[0], "exper
2b250 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2b260 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b270 20 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d      expertDotCom
2b280 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
2b290 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
2b2a0 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
2b2b0 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  f' && strncmp(az
2b2c0 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68  Arg[0], "fullsch
2b2d0 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ema", n)==0 ){. 
2b2e0 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
2b2f0 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
2b300 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
2b310 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a  nt doStats = 0;.
2b320 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2b330 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
2b340 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
2b350 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
2b360 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2b370 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53  ta.mode = MODE_S
2b380 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  emi;.    if( nAr
2b390 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61  g==2 && optionMa
2b3a0 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69  tch(azArg[1], "i
2b3b0 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
2b3c0 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2b3d0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50  ta.mode = MODE_P
2b3e0 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72  retty;.      nAr
2b3f0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
2b400 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a   if( nArg!=1 ){.
2b410 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2b420 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2b430 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d   .fullschema ?--
2b440 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20  indent?\n");.   
2b450 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2b460 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2b470 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2b480 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2b490 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2b4a0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
2b4b0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
2b4c0 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22  l FROM".       "
2b4d0 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
2b4e0 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
2b4f0 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
2b500 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
2b510 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20 20  d x".       "   
2b520 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
2b530 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
2b540 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
2b550 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  T sql, type, tbl
2b560 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77  _name, name, row
2b570 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  id FROM sqlite_t
2b580 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20  emp_master) ".  
2b590 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
2b5a0 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
2b5b0 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d   NOTNULL AND nam
2b5c0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
2b5d0 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22  te_%' ".       "
2b5e0 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
2b5f0 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b  .       callback
2b600 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2b610 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  g.    );.    if(
2b620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b630 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2b640 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
2b650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2b660 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2b670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b680 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
2b690 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2b6a0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2b6b0 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47    " WHERE name G
2b6c0 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74  LOB 'sqlite_stat
2b6d0 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20  [134]'",.       
2b6e0 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
2b6f0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f  mt, 0);.      do
2b700 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  Stats = sqlite3_
2b710 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2b720 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73  ITE_ROW;.      s
2b730 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2b740 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
2b750 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30    if( doStats==0
2b760 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2b770 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
2b780 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20   No STAT tables 
2b790 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29  available */\n")
2b7a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b7b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2b7c0 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
2b7d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
2b7e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b7f0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2b800 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71  LECT 'ANALYZE sq
2b810 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20  lite_master'",. 
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b830 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
2b840 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
2b850 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2b860 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2b870 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
2b880 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2b890 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  = "sqlite_stat1"
2b8a0 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2b8b0 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
2b8c0 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2b8d0 73 74 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20  stat1",.        
2b8e0 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63           shell_c
2b8f0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26  allback, &data,&
2b900 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2b910 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2b920 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22  = "sqlite_stat3"
2b930 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2b940 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
2b950 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2b960 73 74 61 74 33 22 2c 0a 20 20 20 20 20 20 20 20  stat3",.        
2b970 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63           shell_c
2b980 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26  allback, &data,&
2b990 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2b9a0 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2b9b0 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  = "sqlite_stat4"
2b9c0 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2b9d0 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
2b9e0 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2b9f0 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20 20 20  stat4",.        
2ba00 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63           shell_c
2ba10 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
2ba20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
2ba30 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2ba40 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
2ba50 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
2ba60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2ba70 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20    if( c=='h' && 
2ba80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ba90 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d  , "headers", n)=
2baa0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2bab0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg==2 ){.      p
2bac0 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62  ->showHeader = b
2bad0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2bae0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2baf0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2bb00 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2bb10 65 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f  e: .headers on|o
2bb20 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2bb30 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2bb40 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68  lse..  if( c=='h
2bb50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2bb60 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e  rg[0], "help", n
2bb70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
2bb80 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2bb90 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20  "%s", zHelp);.  
2bba0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2bbb0 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2bbc0 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74  zArg[0], "import
2bbd0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2bbe0 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2bc00 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2bc10 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2bc20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bc40 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
2bc50 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66   extra content f
2bc60 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  rom */.    sqlit
2bc70 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2bc80 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74   NULL; /* A stat
2bc90 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
2bca0 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
2bcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bcc0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2bcd0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2bce0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2bd10 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e   in an SQL strin
2bd20 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  g */.    int i, 
2bd30 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2bd40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2bd50 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
2bd60 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20   needCommit;    
2bd70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2bd80 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f   to COMMIT or RO
2bd90 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f  LLBACK at end */
2bda0 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
2bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2bdd0 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70  tes in p->colSep
2bde0 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20  arator[] */.    
2bdf0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
2be00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2be10 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
2be20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78  */.    ImportCtx
2be30 20 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20   sCtx;          
2be40 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e     /* Reader con
2be50 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  text */.    char
2be60 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20   *(SQLITE_CDECL 
2be70 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74  *xRead)(ImportCt
2be80 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20  x*); /* Func to 
2be90 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a  read one value *
2bea0 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54  /.    int (SQLIT
2beb0 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72  E_CDECL *xCloser
2bec0 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f  )(FILE*);      /
2bed0 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20  * Func to close 
2bee0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  file */..    if(
2bef0 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
2bf00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2bf10 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d  err, "Usage: .im
2bf20 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c  port FILE TABLE\
2bf30 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  n");.      goto 
2bf40 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2bf50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69  t;.    }.    zFi
2bf60 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
2bf70 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72     zTable = azAr
2bf80 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e  g[2];.    seenIn
2bf90 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  terrupt = 0;.   
2bfa0 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30   memset(&sCtx, 0
2bfb0 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b  , sizeof(sCtx));
2bfc0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2bfd0 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
2bfe0 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65  trlen30(p->colSe
2bff0 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66  parator);.    if
2c000 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
2c010 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c020 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
2c030 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e         "Error: n
2c040 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73  on-null column s
2c050 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
2c060 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
2c070 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2c080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c090 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSep>1 ){.      
2c0a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c0b0 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69  r, "Error: multi
2c0c0 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d  -character colum
2c0d0 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  n separators not
2c0e0 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c100 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
2c110 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2c120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70  ;.    }.    nSep
2c130 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72   = strlen30(p->r
2c140 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
2c150 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
2c160 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2c170 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2c180 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73  : non-null row s
2c190 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
2c1a0 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
2c1b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2c1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c1d0 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f  nSep==2 && p->mo
2c1e0 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20  de==MODE_Csv && 
2c1f0 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70  strcmp(p->rowSep
2c200 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66  arator, SEP_CrLf
2c210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
2c220 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20   When importing 
2c230 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74  CSV (only), if t
2c240 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
2c250 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
2c260 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20       ** default 
2c270 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72  output row separ
2c280 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20  ator, change it 
2c290 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 69  to the default i
2c2a0 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f  nput.      ** ro
2c2b0 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
2c2c0 69 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67  is avoids having
2c2d0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66   to maintain dif
2c2e0 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20  ferent input.   
2c2f0 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74     ** and output
2c300 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e   row separators.
2c310 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2c320 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2c330 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2c340 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2c350 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
2c360 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c       nSep = strl
2c370 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
2c380 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ator);.    }.   
2c390 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20   if( nSep>1 ){. 
2c3a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2c3b0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2c3c0 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20  multi-character 
2c3d0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e  row separators n
2c3e0 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
2c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c400 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
2c410 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2c420 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43   1;.    }.    sC
2c430 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65  tx.zFile = zFile
2c440 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65  ;.    sCtx.nLine
2c450 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43   = 1;.    if( sC
2c460 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27  tx.zFile[0]=='|'
2c470 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2c480 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
2c490 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c4a0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69  derr, "Error: pi
2c4b0 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  pes are not supp
2c4c0 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53  orted in this OS
2c4d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2c4e0 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  rn 1;.#else.    
2c4f0 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65    sCtx.in = pope
2c500 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20  n(sCtx.zFile+1, 
2c510 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78  "r");.      sCtx
2c520 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e  .zFile = "<pipe>
2c530 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  ";.      xCloser
2c540 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69   = pclose;.#endi
2c550 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2c560 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70     sCtx.in = fop
2c570 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22  en(sCtx.zFile, "
2c580 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  rb");.      xClo
2c590 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20  ser = fclose;.  
2c5a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d    }.    if( p->m
2c5b0 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20  ode==MODE_Ascii 
2c5c0 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d  ){.      xRead =
2c5d0 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
2c5e0 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65  field;.    }else
2c5f0 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20  {.      xRead = 
2c600 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
2c610 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ld;.    }.    if
2c620 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a  ( sCtx.in==0 ){.
2c630 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c640 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2c650 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2c660 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
2c670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2c680 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e  .    }.    sCtx.
2c690 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c  cColSep = p->col
2c6a0 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
2c6b0 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d    sCtx.cRowSep =
2c6c0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2c6d0 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  [0];.    zSql = 
2c6e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c6f0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
2c700 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
2c710 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
2c720 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c730 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2c740 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
2c750 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  ");.      xClose
2c760 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2c770 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2c780 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
2c790 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
2c7a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2c7b0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2c7c0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2c7d0 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72  t, 0);.    impor
2c7e0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73  t_append_char(&s
2c7f0 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54  Ctx, 0);    /* T
2c800 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20  o ensure sCtx.z 
2c810 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  is allocated */.
2c820 20 20 20 20 69 66 28 20 72 63 20 26 26 20 73 71      if( rc && sq
2c830 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e  lite3_strglob("n
2c840 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22  o such table: *"
2c850 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2c860 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20  (p->db))==0 ){. 
2c870 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61       char *zCrea
2c880 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
2c890 69 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42  intf("CREATE TAB
2c8a0 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b  LE %s", zTable);
2c8b0 0a 20 20 20 20 20 20 63 68 61 72 20 63 53 65 70  .      char cSep
2c8c0 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68   = '(';.      wh
2c8d0 69 6c 65 28 20 78 52 65 61 64 28 26 73 43 74 78  ile( xRead(&sCtx
2c8e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72  ) ){.        zCr
2c8f0 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
2c900 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20  printf("%z%c\n  
2c910 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43  \"%w\" TEXT", zC
2c920 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74  reate, cSep, sCt
2c930 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53  x.z);.        cS
2c940 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  ep = ',';.      
2c950 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d    if( sCtx.cTerm
2c960 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  !=sCtx.cColSep )
2c970 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2c980 20 20 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d        if( cSep==
2c990 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73  '(' ){.        s
2c9a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
2c9b0 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ate);.        sq
2c9c0 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
2c9d0 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f  z);.        xClo
2c9e0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2c9f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2ca00 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d  f(stderr,"%s: em
2ca10 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74  pty file\n", sCt
2ca20 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  x.zFile);.      
2ca30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2ca40 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74    }.      zCreat
2ca50 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2ca60 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72  ntf("%z\n)", zCr
2ca70 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  eate);.      rc 
2ca80 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
2ca90 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
2caa0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2cab0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
2cac0 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
2cad0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2cae0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2caf0 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
2cb00 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20  %s(...) failed: 
2cb10 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20  %s\n", zTable,. 
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2cb30 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2cb40 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  >db));.        s
2cb50 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78  qlite3_free(sCtx
2cb60 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c  .z);.        xCl
2cb70 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2cb80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cb90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2cba0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2cbb0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2cbc0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2cbd0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
2cbe0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2cbf0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2cc00 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
2cc10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2cc20 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2cc30 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2cc40 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
2cc50 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2cc60 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
2cc70 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2cc80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2cc90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
2cca0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2ccb0 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
2ccc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2ccd0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2cce0 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
2ccf0 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  if( nCol==0 ) re
2cd00 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f  turn 0; /* no co
2cd10 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20  lumns, no error 
2cd20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  */.    zSql = sq
2cd30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
2cd40 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e  nByte*2 + 20 + n
2cd50 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
2cd60 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2cd70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2cd80 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
2cd90 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
2cda0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2cdb0 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  tx.in);.      re
2cdc0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2cdd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2cde0 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71  tf(nByte+20, zSq
2cdf0 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  l, "INSERT INTO 
2ce00 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28 3f 22  \"%w\" VALUES(?"
2ce10 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
2ce20 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
2ce30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
2ce40 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
2ce50 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2ce60 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
2ce70 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
2ce80 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
2ce90 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
2cea0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
2ceb0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2cec0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2ced0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2cee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2cef0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
2cf00 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
2cf10 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2cf20 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2cf30 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2cf40 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  ->db));.      if
2cf50 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
2cf60 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2cf70 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
2cf80 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2cf90 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2cfa0 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d      needCommit =
2cfb0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
2cfc0 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a  ocommit(p->db);.
2cfd0 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d      if( needComm
2cfe0 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  it ) sqlite3_exe
2cff0 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  c(p->db, "BEGIN"
2d000 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2d010 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  do{.      int st
2d020 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e  artLine = sCtx.n
2d030 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
2d040 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
2d050 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2d060 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43 74 78  *z = xRead(&sCtx
2d070 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20  );.        /*.  
2d080 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20        ** Did we 
2d090 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
2d0a0 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67  e before finding
2d0b0 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20   any columns?.  
2d0c0 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20        ** If so, 
2d0d0 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20  stop instead of 
2d0e0 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65  NULL filling the
2d0f0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
2d100 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
2d110 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20         if( z==0 
2d120 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b  && i==0 ) break;
2d130 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
2d140 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65      ** Did we re
2d150 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20  ach end-of-file 
2d160 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62  OR end-of-line b
2d170 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e  efore finding an
2d180 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c  y.        ** col
2d190 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20 6d 6f  umns in ASCII mo
2d1a0 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f 70  de?  If so, stop
2d1b0 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c   instead of NULL
2d1c0 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   filling.       
2d1d0 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   ** the remainin
2d1e0 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20  g columns..     
2d1f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2d200 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
2d210 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c  Ascii && (z==0 |
2d220 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d  | z[0]==0) && i=
2d230 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2d240 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
2d250 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
2d260 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
2d270 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
2d280 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31      if( i<nCol-1
2d290 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d 21 3d   && sCtx.cTerm!=
2d2a0 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a  sCtx.cColSep ){.
2d2b0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2d2c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
2d2d0 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  s:%d: expected %
2d2e0 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f  d columns but fo
2d2f0 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20  und %d - ".     
2d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d310 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20 74 68       "filling th
2d320 65 20 72 65 73 74 20 77 69 74 68 20 4e 55 4c 4c  e rest with NULL
2d330 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2d350 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74  Ctx.zFile, start
2d360 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  Line, nCol, i+1)
2d370 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
2d380 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   2;.          wh
2d390 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20  ile( i<=nCol ){ 
2d3a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
2d3b0 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b  l(pStmt, i); i++
2d3c0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
2d3d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d3e0 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78  sCtx.cTerm==sCtx
2d3f0 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20  .cColSep ){.    
2d400 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
2d410 20 20 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a    xRead(&sCtx);.
2d420 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
2d430 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 73         }while( s
2d440 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e  Ctx.cTerm==sCtx.
2d450 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20 20 20  cColSep );.     
2d460 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2d470 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
2d480 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2d490 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
2d4a0 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 74              "ext
2d4c0 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a  ras ignored\n",.
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4e0 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
2d4f0 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
2d500 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  Col, i);.      }
2d510 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43  .      if( i>=nC
2d520 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
2d530 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2d540 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d550 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
2d560 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  tmt);.        if
2d570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
2d590 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2d5a0 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52 54 20   "%s:%d: INSERT 
2d5b0 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
2d5c0 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20  Ctx.zFile,.     
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5e0 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69   startLine, sqli
2d5f0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2d600 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
2d610 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
2d620 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f  ( sCtx.cTerm!=EO
2d630 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65  F );..    xClose
2d640 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2d650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
2d660 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x.z);.    sqlite
2d670 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2d680 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43  );.    if( needC
2d690 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f  ommit ) sqlite3_
2d6a0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d  exec(p->db, "COM
2d6b0 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
2d6c0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
2d6d0 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42   SQLITE_UNTESTAB
2d6e0 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  LE.  if( c=='i' 
2d6f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d700 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c  [0], "imposter",
2d710 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
2d720 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68  ar *zSql;.    ch
2d730 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30  ar *zCollist = 0
2d740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
2d750 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69  mt *pStmt;.    i
2d760 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  nt tnum = 0;.   
2d770 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
2d780 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20  nArg!=3 ){.     
2d790 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d7a0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d  err, "Usage: .im
2d7b0 70 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50  poster INDEX IMP
2d7c0 4f 53 54 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20  OSTER\n");.     
2d7d0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2d7e0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2d7f0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2d800 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2d810 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2d820 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
2d830 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
2d840 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d860 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
2d870 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  RE name='%q' AND
2d880 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
2d890 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73  azArg[1]);.    s
2d8a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2d8b0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2d8c0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2d8d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d8e0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73  zSql);.    if( s
2d8f0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2d900 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
2d910 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73  {.      tnum = s
2d920 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2d930 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2d940 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2d950 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d960 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20      if( tnum==0 
2d970 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2d980 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f  intf(stderr, "no
2d990 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25   such index: \"%
2d9a0 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
2d9b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2d9c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2d9d0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2d9e0 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
2d9f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2da00 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69  "PRAGMA index_xi
2da10 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67  nfo='%q'", azArg
2da20 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  [1]);.    rc = s
2da30 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2da40 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2da50 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2da60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2da70 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30  zSql);.    i = 0
2da80 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
2da90 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2daa0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2dab0 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65        char zLabe
2dac0 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e  l[20];.      con
2dad0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  st char *zCol = 
2dae0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2daf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2db00 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20  (pStmt,2);.     
2db10 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   i++;.      if( 
2db20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCol==0 ){.     
2db30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
2db40 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2db50 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  1)==-1 ){.      
2db60 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57      zCol = "_ROW
2db70 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  ID_";.        }e
2db80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2db90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2dba0 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a  sizeof(zLabel),z
2dbb0 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69  Label,"expr%d",i
2dbc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  );.          zCo
2dbd0 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  l = zLabel;.    
2dbe0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2dbf0 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74      if( zCollist
2dc00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
2dc10 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Collist = sqlite
2dc20 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
2dc30 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  "", zCol);.     
2dc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dc50 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74  zCollist = sqlit
2dc60 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c  e3_mprintf("%z,\
2dc70 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74  "%w\"", zCollist
2dc80 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  , zCol);.      }
2dc90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2dca0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2dcb0 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  t);.    zSql = s
2dcc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2dcd0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
2dce0 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25  E TABLE \"%w\"(%
2dcf0 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73  s,PRIMARY KEY(%s
2dd00 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22  ))WITHOUT ROWID"
2dd10 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72  ,.          azAr
2dd20 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  g[2], zCollist, 
2dd30 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73  zCollist);.    s
2dd40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
2dd50 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  list);.    rc = 
2dd60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2dd70 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2dd80 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
2dd90 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c  ->db, "main", 1,
2dda0 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20   tnum);.    if( 
2ddb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ddc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ddd0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2dde0 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
2ddf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
2de00 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2de10 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
2de20 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
2de30 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  n", 0, 0);.     
2de40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2de50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2de60 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e  tderr, "Error in
2de70 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53   [%s]: %s\n", zS
2de80 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ql, sqlite3_errm
2de90 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2dea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2deb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2dec0 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53  out, "%s;\n", zS
2ded0 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ql);.        raw
2dee0 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a  _printf(stdout,.
2def0 20 20 20 20 20 20 20 20 20 20 20 22 57 41 52 4e             "WARN
2df00 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20  ING: writing to 
2df10 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  an imposter tabl
2df20 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74  e will corrupt t
2df30 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20  he index!\n".   
2df40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
2df50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2df60 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2df70 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54  rr, "SQLITE_TEST
2df80 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65  CTRL_IMPOSTER re
2df90 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29  turns %d\n", rc)
2dfa0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2dfb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2dfc0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2dfd0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
2dfe0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2dff0 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f  OMIT_TEST_CONTRO
2e000 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  L) */..#ifdef SQ
2e010 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
2e020 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  ACE.  if( c=='i'
2e030 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2e040 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c  g[0], "iotrace",
2e050 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51   n)==0 ){.    SQ
2e060 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20  LITE_API extern 
2e070 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45  void (SQLITE_CDE
2e080 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  CL *sqlite3IoTra
2e090 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
2e0a0 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69   ...);.    if( i
2e0b0 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63  otrace && iotrac
2e0c0 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f  e!=stdout ) fclo
2e0d0 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20  se(iotrace);.   
2e0e0 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20   iotrace = 0;.  
2e0f0 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
2e100 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
2e110 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  race = 0;.    }e
2e120 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
2e130 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30  zArg[1], "-")==0
2e140 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e150 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
2e160 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
2e170 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  iotrace = stdout
2e180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e190 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70     iotrace = fop
2e1a0 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22  en(azArg[1], "w"
2e1b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74  );.      if( iot
2e1c0 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  race==0 ){.     
2e1d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e1e0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
2e1f0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
2e200 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
2e210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e220 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
2e230 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e250 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
2e260 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66   = iotracePrintf
2e270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e280 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2e290 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
2e2a0 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=5 && strncmp(
2e2b0 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74  azArg[0], "limit
2e2c0 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
2e2d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2e2e0 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f  ruct {.       co
2e2f0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74  nst char *zLimit
2e300 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2e310 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  of a limit */.  
2e320 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f       int limitCo
2e330 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  de;            /
2e340 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66  * Integer code f
2e350 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f  or that limit */
2e360 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20  .    } aLimit[] 
2e370 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e  = {.      { "len
2e380 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
2e390 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2e3a0 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  T_LENGTH        
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2e3c0 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67       { "sql_leng
2e3d0 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
2e3e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
2e3f0 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
2e400 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2e410 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20  { "column",     
2e420 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2e430 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20  E_LIMIT_COLUMN  
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e450 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78    },.      { "ex
2e460 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20  pr_depth",      
2e470 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2e480 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20  IT_EXPR_DEPTH   
2e490 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2e4a0 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e        { "compoun
2e4b0 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20  d_select",      
2e4c0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
2e4d0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20  MPOUND_SELECT   
2e4e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2e4f0 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20   { "vdbe_op",   
2e500 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2e510 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e530 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66     },.      { "f
2e540 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20  unction_arg",   
2e550 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2e560 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2e580 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61 63 68  .      { "attach
2e590 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
2e5a0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41    SQLITE_LIMIT_A
2e5b0 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20  TTACHED         
2e5c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2e5d0 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72    { "like_patter
2e5e0 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c  n_length",   SQL
2e5f0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
2e600 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20  ATTERN_LENGTH   
2e610 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2e620 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22  variable_number"
2e630 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ,       SQLITE_L
2e640 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
2e650 4d 42 45 52 20 20 20 20 20 20 20 20 20 20 20 7d  MBER           }
2e660 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67 67  ,.      { "trigg
2e670 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20  er_depth",      
2e680 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2e690 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 20  TRIGGER_DEPTH   
2e6a0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2e6b0 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72     { "worker_thr
2e6c0 65 61 64 73 22 2c 20 20 20 20 20 20 20 20 53 51  eads",        SQ
2e6d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
2e6e0 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20 20  R_THREADS       
2e6f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20       },.    };. 
2e700 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20     int i, n2;.  
2e710 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2e720 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
2e730 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
2e740 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
2e750 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20  Limit); i++){.  
2e760 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32        printf("%2
2e770 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74  0s %d\n", aLimit
2e780 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a  [i].zLimitName,.
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2e7a0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
2e7b0 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69  db, aLimit[i].li
2e7c0 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20  mitCode, -1));. 
2e7d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e7e0 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20   if( nArg>3 ){. 
2e7f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e800 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2e810 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57  .limit NAME ?NEW
2e820 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20  -VALUE?\n");.   
2e830 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2e840 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2e850 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c  nd_exit;.    }el
2e860 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  se{.      int iL
2e870 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
2e880 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61   n2 = strlen30(a
2e890 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2e8a0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
2e8b0 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b  Size(aLimit); i+
2e8c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2e8d0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
2e8e0 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69  (aLimit[i].zLimi
2e8f0 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c  tName, azArg[1],
2e900 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   n2)==0 ){.     
2e910 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
2e920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e930 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20   iLimit = i;.   
2e940 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e950 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2e960 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61  rintf(stderr, "a
2e970 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20  mbiguous limit: 
2e980 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2e990 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
2e9a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2e9b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2e9c0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2e9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e9e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e9f0 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29    if( iLimit<0 )
2ea00 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2ea10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
2ea20 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22  nknown limit: \"
2ea30 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20  %s\"\n".        
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea50 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73  "enter \".limits
2ea60 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  \" with no argum
2ea70 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e  ents for a list.
2ea80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
2eaa0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2eab0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2eac0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2ead0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
2eae0 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d  .      if( nArg=
2eaf0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
2eb00 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
2eb10 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
2eb20 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20  ].limitCode,.   
2eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb40 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56     (int)integerV
2eb50 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b  alue(azArg[2]));
2eb60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2eb70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e  rintf("%20s %d\n
2eb80 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  ", aLimit[iLimit
2eb90 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20  ].zLimitName,.  
2eba0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ebb0 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
2ebc0 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c  aLimit[iLimit].l
2ebd0 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  imitCode, -1));.
2ebe0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2ebf0 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e   if( c=='l' && n
2ec00 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >2 && strncmp(az
2ec10 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20  Arg[0], "lint", 
2ec20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  n)==0 ){.    ope
2ec30 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2ec40 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70  lintDotCommand(p
2ec50 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
2ec60 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
2ec70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2ec80 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66  D_EXTENSION.  if
2ec90 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e  ( c=='l' && strn
2eca0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
2ecb0 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  oad", n)==0 ){. 
2ecc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2ecd0 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20  File, *zProc;.  
2ece0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2ecf0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 0;.    if( nAr
2ed00 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g<2 ){.      raw
2ed10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ed20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49  "Usage: .load FI
2ed30 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c  LE ?ENTRYPOINT?\
2ed40 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ed50 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2ed60 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2ed70 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
2ed80 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
2ed90 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33   zProc = nArg>=3
2eda0 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b   ? azArg[2] : 0;
2edb0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2edc0 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
2edd0 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
2ede0 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65  ion(p->db, zFile
2edf0 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73  , zProc, &zErrMs
2ee00 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
2ee10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ee20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2ee30 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2ee40 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
2ee50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ee60 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
2ee70 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2ee80 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
2ee90 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
2eea0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2eeb0 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20  ], "log", n)==0 
2eec0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  ){.    if( nArg!
2eed0 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
2eee0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2eef0 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45  Usage: .log FILE
2ef00 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  NAME\n");.      
2ef10 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
2ef20 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
2ef30 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41  har *zFile = azA
2ef40 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74  rg[1];.      out
2ef50 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70  put_file_close(p
2ef60 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70  ->pLog);.      p
2ef70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f  ->pLog = output_
2ef80 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  file_open(zFile,
2ef90 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2efa0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27  se..  if( c=='m'
2efb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2efc0 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29  g[0], "mode", n)
2efd0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
2efe0 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e   char *zMode = n
2eff0 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
2f000 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  ] : "";.    int 
2f010 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d  n2 = strlen30(zM
2f020 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32  ode);.    int c2
2f030 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20   = zMode[0];.   
2f040 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20   if( c2=='l' && 
2f050 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28  n2>2 && strncmp(
2f060 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22  azArg[1],"lines"
2f070 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2f080 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2f090 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Line;.      sqli
2f0a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2f0b0 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2f0c0 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2f0d0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
2f0e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2f0f0 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  2=='c' && strncm
2f100 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75  p(azArg[1],"colu
2f110 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  mns",n2)==0 ){. 
2f120 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2f130 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
2f140 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2f150 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2f160 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2f170 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2f180 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
2f190 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20   if( c2=='l' && 
2f1a0 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28  n2>2 && strncmp(
2f1b0 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c  azArg[1],"list",
2f1c0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
2f1d0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
2f1e0 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
2f1f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2f200 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
2f210 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
2f220 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e  ator, SEP_Column
2f230 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f240 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2f250 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
2f260 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
2f270 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
2f280 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2f290 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
2f2a0 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e  zArg[1],"html",n
2f2b0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2f2c0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74  ->mode = MODE_Ht
2f2d0 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ml;.    }else if
2f2e0 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72  ( c2=='t' && str
2f2f0 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  ncmp(azArg[1],"t
2f300 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  cl",n2)==0 ){.  
2f310 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2f320 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71  DE_Tcl;.      sq
2f330 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2f340 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
2f350 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
2f360 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61  parator, SEP_Spa
2f370 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ce);.      sqlit
2f380 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2f390 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2f3a0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2f3b0 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
2f3c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
2f3d0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
2f3e0 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c  (azArg[1],"csv",
2f3f0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
2f400 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
2f410 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  sv;.      sqlite
2f420 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f430 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
2f440 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
2f450 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b  tor, SEP_Comma);
2f460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2f470 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2f480 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2f490 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2f4a0 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20  , SEP_CrLf);.   
2f4b0 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2f4c0 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
2f4d0 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32  Arg[1],"tabs",n2
2f4e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2f4f0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
2f500 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2f510 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2f520 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2f530 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2f540 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20  or, SEP_Tab);.  
2f550 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2f560 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2f570 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22  zArg[1],"insert"
2f580 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2f590 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2f5a0 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65  Insert;.      se
2f5b0 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20  t_table_name(p, 
2f5c0 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b  nArg>=3 ? azArg[
2f5d0 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20  2] : "table");. 
2f5e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2f5f0 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
2f600 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22  azArg[1],"quote"
2f610 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2f620 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2f630 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Quote;.    }else
2f640 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20   if( c2=='a' && 
2f650 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2f660 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20  ,"ascii",n2)==0 
2f670 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2f680 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20   = MODE_Ascii;. 
2f690 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2f6a0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2f6b0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
2f6c0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
2f6d0 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20  SEP_Unit);.     
2f6e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2f6f0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
2f700 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
2f710 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2f720 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c  Record);.    }el
2f730 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29  se if( nArg==1 )
2f740 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2f750 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72  tf(p->out, "curr
2f760 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a  ent output mode:
2f770 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63   %s\n", modeDesc
2f780 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20  r[p->mode]);.   
2f790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2f7a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2f7b0 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68   "Error: mode sh
2f7c0 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
2f7d0 22 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69  ".         "asci
2f7e0 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d  i column csv htm
2f7f0 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69  l insert line li
2f800 73 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63  st quote tabs tc
2f810 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  l\n");.      rc 
2f820 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
2f830 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
2f840 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  e;.  }else..  if
2f850 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e  ( c=='n' && strn
2f860 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e  cmp(azArg[0], "n
2f870 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30  ullvalue", n)==0
2f880 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2f890 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==2 ){.      sql
2f8a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2f8b0 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75  zeof(p->nullValu
2f8c0 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  e), p->nullValue
2f8d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f8e0 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
2f8f0 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
2f900 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c  p->nullValue)-1,
2f910 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2f920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2f930 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f940 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c  "Usage: .nullval
2f950 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20  ue STRING\n");. 
2f960 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f970 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2f980 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e  ( c=='o' && strn
2f990 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
2f9a0 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  pen", n)==0 && n
2f9b0 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=2 ){.    char 
2f9c0 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20  *zNewFilename;  
2f9d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2f9e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2f9f0 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
2fa00 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20  iName = 1;      
2fa10 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41   /* Index in azA
2fa20 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65  rg[] of the file
2fa30 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  name */.    int 
2fa40 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  newFlag = 0;    
2fa50 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
2fa60 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f  te file before o
2fa70 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a  pening */.    /*
2fa80 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74   Close the exist
2fa90 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ing database */.
2faa0 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73      session_clos
2fab0 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71  e_all(p);.    sq
2fac0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
2fad0 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
2fae0 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  0;.    p->zDbFil
2faf0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  ename = 0;.    s
2fb00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
2fb10 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  FreeOnClose);.  
2fb20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
2fb30 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70  e = 0;.    p->op
2fb40 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
2fb50 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20  PEN_UNSPEC;.    
2fb60 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d  /* Check for com
2fb70 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65  mand-line argume
2fb80 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  nts */.    for(i
2fb90 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41  Name=1; iName<nA
2fba0 72 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d  rg && azArg[iNam
2fbb0 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d  e][0]=='-'; iNam
2fbc0 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  e++){.      cons
2fbd0 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
2fbe0 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20  g[iName];.      
2fbf0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
2fc00 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20  z,"new") ){.    
2fc10 20 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b      newFlag = 1;
2fc20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2fc30 41 56 45 5f 5a 49 50 0a 20 20 20 20 20 20 7d 65  AVE_ZIP.      }e
2fc40 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
2fc50 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b  tch(z, "zip") ){
2fc60 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
2fc70 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
2fc80 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69  N_ZIPFILE;.#endi
2fc90 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
2fca0 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
2fcb0 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20   "append") ){.  
2fcc0 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
2fcd0 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  e = SHELL_OPEN_A
2fce0 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20  PPENDVFS;.      
2fcf0 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
2fd00 4d 61 74 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e  Match(z, "readon
2fd10 6c 79 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ly") ){.        
2fd20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
2fd30 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
2fd40 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
2fd50 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
2fd60 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2fd70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
2fd80 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
2fd90 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
2fda0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2fdb0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2fdc0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
2fdd0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
2fde0 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73 70  a filename is sp
2fdf0 65 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f 20  ecified, try to 
2fe00 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a 2f  open it first */
2fe10 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  .    zNewFilenam
2fe20 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f  e = nArg>iName ?
2fe30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2fe40 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61  ("%s", azArg[iNa
2fe50 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  me]) : 0;.    if
2fe60 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29  ( zNewFilename )
2fe70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 46  {.      if( newF
2fe80 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65 74  lag ) shellDelet
2fe90 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61  eFile(zNewFilena
2fea0 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44  me);.      p->zD
2feb0 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77  bFilename = zNew
2fec0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2fed0 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20  open_db(p, 1);. 
2fee0 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d       if( p->db==
2fef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
2ff00 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2ff10 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
2ff20 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e  open '%s'\n", zN
2ff30 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ewFilename);.   
2ff40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ff50 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  e(zNewFilename);
2ff60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ff70 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e        p->zFreeOn
2ff80 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65  Close = zNewFile
2ff90 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  name;.      }.  
2ffa0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
2ffb0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b==0 ){.      /*
2ffc0 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20   As a fall-back 
2ffd0 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74 61  open a TEMP data
2ffe0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d  base */.      p-
2fff0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30  >zDbFilename = 0
30000 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28  ;.      open_db(
30010 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  p, 0);.    }.  }
30020 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d  else..  if( (c==
30030 27 6f 27 0a 20 20 20 20 20 20 20 20 26 26 20 28  'o'.        && (
30040 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30050 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
30060 30 7c 7c 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  0||strncmp(azArg
30070 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
30080 3d 30 29 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  =0)).   || (c=='
30090 65 27 20 26 26 20 6e 3d 3d 35 20 26 26 20 73 74  e' && n==5 && st
300a0 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 65  rcmp(azArg[0],"e
300b0 78 63 65 6c 22 29 3d 3d 30 29 0a 20 20 29 7b 0a  xcel")==0).  ){.
300c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
300d0 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20  zFile = nArg>=2 
300e0 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74  ? azArg[1] : "st
300f0 64 6f 75 74 22 3b 0a 20 20 20 20 69 6e 74 20 62  dout";.    int b
30100 54 78 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  TxtMode = 0;.   
30110 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 5b 30 5d   if( azArg[0][0]
30120 3d 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 2f  =='e' ){.      /
30130 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * Transform the 
30140 22 2e 65 78 63 65 6c 22 20 63 6f 6d 6d 61 6e 64  ".excel" command
30150 20 69 6e 74 6f 20 22 2e 6f 6e 63 65 20 2d 78 22   into ".once -x"
30160 20 2a 2f 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   */.      nArg =
30170 20 32 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b   2;.      azArg[
30180 30 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a 20 20 20  0] = "once";.   
30190 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
301a0 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a 20 20 20 20  [1] = "-x";.    
301b0 20 20 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20    n = 4;.    }. 
301c0 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b     if( nArg>2 ){
301d0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
301e0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
301f0 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46 49  e: .%s [-e|-x|FI
30200 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  LE]\n", azArg[0]
30210 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
30220 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
30230 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
30240 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31     }.    if( n>1
30250 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30260 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29  g[0], "once", n)
30270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
30280 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
30290 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
302a0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f  derr, "Usage: .o
302b0 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29  nce (-e|-x|FILE)
302c0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
302d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
302e0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
302f0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
30300 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20      p->outCount 
30310 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 2;.    }else{.
30320 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e        p->outCoun
30330 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
30340 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
30350 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b  ;.    if( zFile[
30360 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65  0]=='-' && zFile
30370 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 46 69 6c 65  [1]=='-' ) zFile
30380 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
30390 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
303a0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
303b0 7a 46 69 6c 65 2c 20 22 2d 65 22 29 3d 3d 30 20  zFile, "-e")==0 
303c0 7c 7c 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  || strcmp(zFile,
303d0 20 22 2d 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "-x")==0 ){.   
303e0 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20     p->doXdgOpen 
303f0 3d 20 31 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  = 1;.      outpu
30400 74 4d 6f 64 65 50 75 73 68 28 70 29 3b 0a 20 20  tModePush(p);.  
30410 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 31 5d      if( zFile[1]
30420 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20  =='x' ){.       
30430 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20   newTempFile(p, 
30440 22 63 73 76 22 29 3b 0a 20 20 20 20 20 20 20 20  "csv");.        
30450 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
30460 73 76 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sv;.        sqli
30470 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30480 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
30490 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
304a0 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61  rator, SEP_Comma
304b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
304c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
304d0 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
304e0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
304f0 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
30500 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30510 20 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c        newTempFil
30520 65 28 70 2c 20 22 74 78 74 22 29 3b 0a 20 20 20  e(p, "txt");.   
30530 20 20 20 20 20 62 54 78 74 4d 6f 64 65 20 3d 20       bTxtMode = 
30540 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
30550 20 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d   zFile = p->zTem
30560 70 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  pFile;.    }.#en
30570 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f  dif /* SQLITE_NO
30580 48 41 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 20  HAVE_SYSTEM */. 
30590 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
305a0 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53  ='|' ){.#ifdef S
305b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
305c0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
305d0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
305e0 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20  : pipes are not 
305f0 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69  supported in thi
30600 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20  s OS\n");.      
30610 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  rc = 1;.      p-
30620 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23  >out = stdout;.#
30630 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75  else.      p->ou
30640 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20  t = popen(zFile 
30650 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  + 1, "w");.     
30660 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29   if( p->out==0 )
30670 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
30680 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
30690 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
306a0 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c   pipe \"%s\"\n",
306b0 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20   zFile + 1);.   
306c0 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
306d0 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
306e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
306f0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
30700 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30710 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20  of(p->outfile), 
30720 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22  p->outfile, "%s"
30730 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
30740 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
30750 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
30760 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
30770 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 78 74 4d  pen(zFile, bTxtM
30780 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
30790 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
307a0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
307b0 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20  zFile,"off")!=0 
307c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
307d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
307e0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77  "Error: cannot w
307f0 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e  rite to \"%s\"\n
30800 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
30810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
30820 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
30830 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30840 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
30850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
30860 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30870 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74  outfile), p->out
30880 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  file, "%s", zFil
30890 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
308a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
308b0 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20   c=='p' && n>=3 
308c0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
308d0 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29  [0], "print", n)
308e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
308f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
30900 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
30910 20 20 20 69 66 28 20 69 3e 31 20 29 20 72 61 77     if( i>1 ) raw
30920 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
30930 22 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  " ");.      utf8
30940 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
30950 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
30960 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
30970 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
30980 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  n");.  }else..  
30990 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74  if( c=='p' && st
309a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
309b0 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20  "prompt", n)==0 
309c0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20  ){.    if( nArg 
309d0 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 2) {.      st
309e0 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74  rncpy(mainPrompt
309f0 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41  ,azArg[1],(int)A
30a00 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f  rraySize(mainPro
30a10 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
30a20 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33     if( nArg >= 3
30a30 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
30a40 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  y(continuePrompt
30a50 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41  ,azArg[2],(int)A
30a60 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75  rraySize(continu
30a70 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  ePrompt)-1);.   
30a80 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
30a90 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e  ( c=='q' && strn
30aa0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71  cmp(azArg[0], "q
30ab0 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uit", n)==0 ){. 
30ac0 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
30ad0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
30ae0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
30af0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
30b00 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ead", n)==0 ){. 
30b10 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20     FILE *alt;.  
30b20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
30b30 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
30b40 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
30b50 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22 29  : .read FILE\n")
30b60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30b70 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
30b80 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
30b90 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f    }.    alt = fo
30ba0 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72  pen(azArg[1], "r
30bb0 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74  b");.    if( alt
30bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
30bd0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30be0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
30bf0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
30c00 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
30c10 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
30c20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
30c30 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
30c40 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
30c50 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
30c60 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
30c70 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
30c80 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
30c90 20 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d   "restore", n)==
30ca0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
30cb0 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
30cc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30cd0 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
30ce0 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
30cf0 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
30d00 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
30d10 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
30d20 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
30d30 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
30d40 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a  zArg[1];.      z
30d50 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
30d60 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
30d70 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =3 ){.      zSrc
30d80 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  File = azArg[2];
30d90 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41  .      zDb = azA
30da0 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  rg[1];.    }else
30db0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
30dc0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30dd0 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f  e: .restore ?DB?
30de0 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
30df0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
30e00 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
30e10 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
30e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
30e30 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53  en(zSrcFile, &pS
30e40 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  rc);.    if( rc!
30e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30e60 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
30e70 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
30e80 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
30e90 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29  \"\n", zSrcFile)
30ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30eb0 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
30ec0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
30ed0 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
30ee0 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75  , 0);.    pBacku
30ef0 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
30f00 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 7a  up_init(p->db, z
30f10 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22  Db, pSrc, "main"
30f20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
30f30 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  up==0 ){.      u
30f40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
30f50 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
30f60 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
30f70 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
30f80 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
30f90 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
30fa0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n 1;.    }.    w
30fb0 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
30fc0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
30fd0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
30fe0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
30ff0 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
31000 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20 20  _BUSY  ){.      
31010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
31020 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69  USY ){.        i
31030 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d  f( nTimeout++ >=
31040 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   3 ) break;.    
31050 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
31060 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a  p(100);.      }.
31070 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
31080 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
31090 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
310a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
310b0 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
310c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
310d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
310e0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c   || rc==SQLITE_L
310f0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72  OCKED ){.      r
31100 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31110 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65  , "Error: source
31120 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73   database is bus
31130 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  y\n");.      rc 
31140 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
31150 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31160 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
31170 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
31180 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
31190 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
311a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
311b0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
311c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
311d0 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
311e0 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
311f0 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
31200 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
31210 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
31220 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f  tatsOn = (u8)boo
31230 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
31240 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
31250 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
31260 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
31270 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31280 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
31290 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
312a0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
312b0 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
312c0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
312d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
312e0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
312f0 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
31300 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
31310 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
31320 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
31330 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
31340 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
31350 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
31360 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
31370 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
31380 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
31390 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
313a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
313b0 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
313c0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
313d0 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
313e0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
313f0 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
31400 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
31410 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
31420 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
31430 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
31440 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
31450 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
31460 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
31470 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
31480 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
31490 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
314a0 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
314b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
314c0 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
314d0 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
314e0 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
314f0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
31500 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
31510 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31520 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
31530 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
31540 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
31550 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
31560 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
31570 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
31580 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
31590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
315a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
315b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
315c0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
315d0 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
315e0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
315f0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
31600 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
31610 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
31620 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
31630 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
31640 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
31650 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
31660 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
31670 22 2c 20 30 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ", 0)==0;.      
31680 69 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20  if( isMaster || 
31690 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
316a0 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65  zName,"sqlite_te
316b0 6d 70 5f 6d 61 73 74 65 72 22 2c 30 29 3d 3d 30  mp_master",0)==0
316c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
316d0 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
316e0 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
316f0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
31700 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
31710 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
31720 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
31730 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31750 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
31760 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
31780 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317a0 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
317b0 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
317d0 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
317e0 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
31800 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31820 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
31830 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
31840 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
31850 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
31860 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
31870 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
31880 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
31890 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
318a0 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
318b0 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
318c0 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
318d0 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
318e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
318f0 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
31900 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
31910 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
31920 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
31930 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
31940 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
31950 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
31960 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
31970 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
31980 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319a0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
319b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
319c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
319d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
319e0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
319f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
31a00 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
31a10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
31a20 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
31a30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31a40 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31a50 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
31a60 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
31a70 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
31a80 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
31a90 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
31aa0 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
31ab0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
31ac0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
31ad0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
31ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
31af0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
31b00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
31b10 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
31b20 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
31b30 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
31b40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
31b50 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
31b60 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
31b70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
31b80 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
31b90 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
31ba0 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
31bb0 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
31bc0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
31bd0 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
31be0 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
31bf0 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
31c00 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
31c10 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
31c20 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
31c30 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
31c40 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
31c50 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
31c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31c70 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
31c80 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
31c90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ca0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
31cb0 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
31cc0 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
31cd0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
31ce0 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
31cf0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
31d00 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
31d10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
31d20 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
31d30 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
31d40 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
31d50 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
31d60 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
31d70 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
31d80 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
31d90 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
31da0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
31db0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
31dc0 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
31dd0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
31de0 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
31df0 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
31e00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
31e10 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
31e20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
31e30 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
31e40 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
31e50 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
31e60 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
31e70 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
31e80 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
31e90 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
31ea0 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
31eb0 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
31ec0 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
31ed0 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
31ee0 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
31ef0 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
31f00 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
31f10 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
31f20 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
31f30 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
31f40 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
31f50 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
31f60 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
31f70 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
31f80 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
31f90 28 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20  ( strchr(zName, 
31fa0 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
31fb0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
31fc0 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72  elect, "lower(pr
31fd0 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61  intf('%s.%s',sna
31fe0 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20  me,tbl_name))", 
31ff0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
32000 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
32010 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
32020 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d  , "lower(tbl_nam
32030 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  e)", 0);.       
32040 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
32050 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
32060 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a  strchr(zName, '*
32070 27 29 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20  ') ? " GLOB " : 
32080 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20  " LIKE ", 0);.  
32090 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
320a0 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67  (&sSelect, zQarg
320b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
320c0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
320d0 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a  t, " AND ", 0);.
320e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
320f0 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20  free(zQarg);.   
32100 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
32110 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
32120 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e  "type!='meta' AN
32130 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
32140 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L".             
32150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
32160 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72  ORDER BY snum, r
32170 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  owid", 0);.     
32180 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20   if( bDebug ){. 
32190 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
321a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a  tf(p->out, "SQL:
321b0 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74   %s;\n", sSelect
321c0 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .z);.      }else
321d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
321e0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
321f0 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61  b, sSelect.z, ca
32200 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
32210 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
32220 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74  }.      freeText
32230 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
32240 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
32250 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
32260 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
32270 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
32280 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
32290 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
322a0 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
322b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
322c0 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc != SQLITE_OK 
322d0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
322e0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
322f0 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65  r: querying sche
32300 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  ma information\n
32310 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
32320 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32330 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
32340 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65  .  }else..#if de
32350 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
32360 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
32370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
32380 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20  ECTTRACE).  if( 
32390 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20  c=='s' && n==11 
323a0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
323b0 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63  [0], "selecttrac
323c0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
323d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
323e0 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ace = (int)integ
323f0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
32400 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
32410 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
32420 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
32430 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27  SION).  if( c=='
32440 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
32450 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22  Arg[0],"session"
32460 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29  ,n)==0 && n>=3 )
32470 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f  {.    OpenSessio
32480 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70  n *pSession = &p
32490 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20  ->aSession[0];. 
324a0 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20     char **azCmd 
324b0 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20  = &azArg[1];.   
324c0 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20   int iSes = 0;. 
324d0 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41     int nCmd = nA
324e0 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20  rg - 1;.    int 
324f0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  i;.    if( nArg<
32500 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
32510 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
32520 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
32530 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  );.    if( nArg>
32540 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =3 ){.      for(
32550 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e  iSes=0; iSes<p->
32560 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b  nSession; iSes++
32570 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
32580 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f  trcmp(p->aSessio
32590 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61  n[iSes].zName, a
325a0 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72  zArg[1])==0 ) br
325b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
325c0 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e     if( iSes<p->n
325d0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
325e0 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70     pSession = &p
325f0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
32600 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b  ;.        azCmd+
32610 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d  +;.        nCmd-
32620 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
32630 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
32640 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
32650 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73  0];.        iSes
32660 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
32670 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73    }..    /* .ses
32680 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c  sion attach TABL
32690 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  E.    ** Invoke 
326a0 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
326b0 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65  on_attach() inte
326c0 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20  rface to attach 
326d0 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20  a particular.   
326e0 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61   ** table so tha
326f0 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69  t it is never fi
32700 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ltered..    */. 
32710 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
32720 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29  Cmd[0],"attach")
32730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
32740 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20   nCmd!=2 ) goto 
32750 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
32760 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
32770 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29  pSession->p==0 )
32780 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
32790 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20  n_not_open:.    
327a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
327b0 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
327c0 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f  o sessions are o
327d0 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  pen\n");.      }
327e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
327f0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
32800 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
32810 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b  n->p, azCmd[1]);
32820 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
32830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
32840 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32850 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73  "ERROR: sqlite3s
32860 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
32870 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
32880 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  c);.          rc
32890 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
328a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
328b0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
328c0 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c  on changeset FIL
328d0 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f  E.    ** .sessio
328e0 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a  n patchset FILE.
328f0 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63      ** Write a c
32900 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63  hangeset or patc
32910 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65  hset into a file
32920 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f  .  The file is o
32930 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  verwritten..    
32940 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
32950 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e  p(azCmd[0],"chan
32960 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74  geset")==0 || st
32970 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70  rcmp(azCmd[0],"p
32980 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a  atchset")==0 ){.
32990 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
329a0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
329b0 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
329c0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
329d0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
329e0 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67  ession->p==0 ) g
329f0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f  oto session_not_
32a00 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20  open;.      out 
32a10 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d  = fopen(azCmd[1]
32a20 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
32a30 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
32a40 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
32a50 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
32a60 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
32a70 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c  s\" for writing\
32a80 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  n", azCmd[1]);. 
32a90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32aa0 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a      int szChng;.
32ab0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
32ac0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  hng;.        if(
32ad0 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63   azCmd[0][0]=='c
32ae0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ' ){.          r
32af0 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
32b00 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65  on_changeset(pSe
32b10 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e  ssion->p, &szChn
32b20 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20  g, &pChng);.    
32b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32b40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32b50 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
32b60 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
32b70 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
32b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32b90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
32ba0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45         printf("E
32bb0 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65  rror: error code
32bc0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
32bd0 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
32be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32bf0 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20   if( pChng.     
32c00 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70       && fwrite(p
32c10 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c  Chng, szChng, 1,
32c20 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20   out)!=1 ){.    
32c30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32c40 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
32c50 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65   Failed to write
32c60 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20   entire %d-byte 
32c70 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20  output\n",.     
32c80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43               szC
32c90 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
32ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32cb0 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20  free(pChng);.   
32cc0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
32cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
32ce0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
32cf0 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a  sion close.    *
32d00 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e  * Close the iden
32d10 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20  tified session. 
32d20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
32d30 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
32d40 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  close")==0 ){.  
32d50 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
32d60 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
32d70 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
32d80 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
32d90 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  on ){.        se
32da0 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73  ssion_close(pSes
32db0 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  sion);.        p
32dc0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
32dd0 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d   = p->aSession[-
32de0 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  -p->nSession];. 
32df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
32e00 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
32e10 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41  n enable ?BOOLEA
32e20 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
32e30 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c  or set the enabl
32e40 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  e flag.    */.  
32e50 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
32e60 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29  md[0], "enable")
32e70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
32e80 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
32e90 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
32ea0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
32eb0 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
32ec0 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
32ed0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
32ee0 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
32ef0 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
32f00 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
32f10 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65  e3session_enable
32f20 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69  (pSession->p, ii
32f30 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
32f40 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
32f50 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c  session %s enabl
32f60 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  e flag = %d\n",.
32f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f80 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
32f90 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
32fa0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
32fb0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c   /* .session fil
32fc0 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20  ter GLOB .....  
32fd0 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20    ** Set a list 
32fe0 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73  of GLOB patterns
32ff0 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20   of table names 
33000 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  to be excluded..
33010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
33020 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
33030 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a  "filter")==0 ){.
33040 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42        int ii, nB
33050 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  yte;.      if( n
33060 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd<2 ) goto ses
33070 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
33080 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
33090 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
330a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
330b0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
330c0 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  er; ii++){.     
330d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
330e0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
330f0 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20  lter[ii]);.     
33100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
33110 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
33120 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
33130 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
33140 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e  izeof(pSession->
33150 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43  azFilter[0])*(nC
33160 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70  md-1);.        p
33170 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
33180 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
33190 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
331a0 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
331b0 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29  n->azFilter==0 )
331c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
331d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
331e0 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65  Error: out or me
331f0 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
33200 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
33210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
33220 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64  or(ii=1; ii<nCmd
33230 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
33240 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
33250 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71  ilter[ii-1] = sq
33260 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
33270 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a  s", azCmd[ii]);.
33280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33290 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
332a0 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20  ter = ii-1;.    
332b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
332c0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69     /* .session i
332d0 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
332e0 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
332f0 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65  r set the indire
33300 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  ct flag.    */. 
33310 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
33320 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63  Cmd[0], "indirec
33330 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
33340 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
33350 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20  ( nCmd>2 ) goto 
33360 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
33370 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d  rror;.      ii =
33380 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20   nCmd==1 ? -1 : 
33390 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43  booleanValue(azC
333a0 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  md[1]);.      if
333b0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
333c0 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
333d0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64  lite3session_ind
333e0 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e  irect(pSession->
333f0 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
33400 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33410 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
33420 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20  indirect flag = 
33430 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
33440 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73             pSess
33450 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b  ion->zName, ii);
33460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
33470 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
33480 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20  ion isempty.    
33490 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
334a0 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
334b0 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mpty.    */.    
334c0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
334d0 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d  [0], "isempty")=
334e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
334f0 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
33500 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73  md!=1 ) goto ses
33510 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
33520 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
33530 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
33540 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
33550 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28  session_isempty(
33560 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
33570 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33580 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69  f(p->out, "sessi
33590 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c  on %s isempty fl
335a0 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335c0 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
335d0 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
335e0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
335f0 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20  .session list.  
33600 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75    ** List all cu
33610 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73  rrently open ses
33620 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20  sions.    */.   
33630 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
33640 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20  d[0],"list")==0 
33650 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
33660 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
33670 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
33680 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
33690 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c  t, "%d %s\n", i,
336a0 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e   p->aSession[i].
336b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
336c0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
336d0 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20  * .session open 
336e0 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f  DB NAME.    ** O
336f0 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
33700 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e  n called NAME on
33710 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61   the attached da
33720 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a  tabase DB..    *
33730 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  * DB is normally
33740 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a   "main"..    */.
33750 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
33760 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d  zCmd[0],"open")=
33770 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
33780 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69   *zName;.      i
33790 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74  f( nCmd!=3 ) got
337a0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
337b0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e  _error;.      zN
337c0 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a  ame = azCmd[2];.
337d0 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
337e0 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  0]==0 ) goto ses
337f0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
33800 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
33810 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
33820 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
33830 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
33840 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a  ssion[i].zName,z
33850 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
33860 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33870 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69  f(stderr, "Sessi
33880 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  on \"%s\" alread
33890 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61  y exists\n", zNa
338a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
338b0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
338c0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
338d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
338e0 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d  f( p->nSession>=
338f0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
33900 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  ssion) ){.      
33910 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33920 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66  err, "Maximum of
33930 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c   %d sessions\n",
33940 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53   ArraySize(p->aS
33950 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  ession));.      
33960 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
33970 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
33980 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e  }.      pSession
33990 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
339a0 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
339b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
339c0 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70  session_create(p
339d0 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20  ->db, azCmd[1], 
339e0 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  &pSession->p);. 
339f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33a00 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
33a10 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f  f(stderr, "Canno
33a20 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20  t open session: 
33a30 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22  error code=%d\n"
33a40 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72  , rc);.        r
33a50 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  c = 0;.        g
33a60 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33a70 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
33a80 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e       pSession->n
33a90 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Filter = 0;.    
33aa0 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
33ab0 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53  _table_filter(pS
33ac0 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69  ession->p, sessi
33ad0 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73  on_filter, pSess
33ae0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ion);.      p->n
33af0 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20  Session++;.     
33b00 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
33b10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
33b20 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
33b30 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f  .    }else.    /
33b40 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20  * If no command 
33b50 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68  name matches, sh
33b60 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  ow a syntax erro
33b70 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  r */.    session
33b80 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20  _syntax_error:. 
33b90 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28     session_help(
33ba0 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
33bb0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
33bc0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64  E_DEBUG.  /* Und
33bd0 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e  ocumented comman
33be0 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ds for internal 
33bf0 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63  testing.  Subjec
33c00 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a  t to change.  **
33c10 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e   without notice.
33c20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27   */.  if( c=='s'
33c30 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72   && n>=10 && str
33c40 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33c50 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d  selftest-", 9)==
33c60 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  0 ){.    if( str
33c70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
33c80 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29   "boolean", n-9)
33c90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
33ca0 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72   i, v;.      for
33cb0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
33cc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  +){.        v = 
33cd0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
33ce0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
33cf0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33d00 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78  ut, "%s: %d 0x%x
33d10 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76  \n", azArg[i], v
33d20 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
33d30 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
33d40 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
33d50 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d  "integer", n-9)=
33d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
33d70 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  i; sqlite3_int64
33d80 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
33d90 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
33da0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42  .        char zB
33db0 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20  uf[200];.       
33dc0 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75   v = integerValu
33dd0 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
33de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
33df0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
33e00 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c  f),zBuf,"%s: %ll
33e10 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41  d 0x%llx\n", azA
33e20 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20  rg[i],v,v);.    
33e30 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33e40 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  p->out, "%s", zB
33e50 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uf);.      }.   
33e60 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
33e70 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  f..  if( c=='s' 
33e80 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63  && n>=4 && strnc
33e90 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c  mp(azArg[0],"sel
33ea0 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  ftest",n)==0 ){.
33eb0 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20      int bIsInit 
33ec0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
33ed0 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  True to initiali
33ee0 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  ze the SELFTEST 
33ef0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
33f00 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
33f10 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65        /* Verbose
33f20 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
33f30 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69 73  nt bSelftestExis
33f40 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ts;     /* True 
33f50 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65  if SELFTEST alre
33f60 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
33f70 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20    int i, k;     
33f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33f90 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
33fa0 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30     int nTest = 0
33fb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
33fc0 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
33fd0 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uns */.    int n
33fe0 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Err = 0;        
33ff0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34000 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
34010 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74      ShellText st
34020 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
34030 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75 65  Answer for a que
34040 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ry */.    sqlite
34050 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
34060 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69  0; /* Query agai
34070 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53 54  nst the SELFTEST
34080 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f   table */..    o
34090 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20  pen_db(p,0);.   
340a0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
340b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
340c0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
340d0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
340e0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
340f0 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
34100 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
34110 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
34120 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e 69  {.        bIsIni
34130 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
34140 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
34150 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29  cmp(z,"-v")==0 )
34160 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62 6f  {.        bVerbo
34170 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  se++;.      }els
34180 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  e.      {.      
34190 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
341a0 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
341b0 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
341c0 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
341d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
341e0 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30  zArg[i], azArg[0
341f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ]);.        raw_
34200 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34210 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  Should be one of
34220 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b  : --init -v\n");
34230 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
34240 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
34250 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
34260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34270 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
34280 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
34290 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e  data(p->db,"main
342a0 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30  ","selftest",0,0
342b0 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20  ,0,0,0,0).      
342c0 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f       != SQLITE_O
342d0 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66  K ){.      bSelf
342e0 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a  testExists = 0;.
342f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34300 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
34310 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
34320 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20  if( bIsInit ){. 
34330 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66 74       createSelft
34340 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20  estTable(p);.   
34350 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
34360 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
34370 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72 29    initText(&str)
34380 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
34390 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a  (&str, "x", 0);.
343a0 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74      for(k=bSelft
343b0 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b  estExists; k>=0;
343c0 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   k--){.      if(
343d0 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k==1 ){.       
343e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
343f0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
34400 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
34410 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  ECT tno,op,cmd,a
34420 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  ns FROM selftest
34430 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a   ORDER BY tno",.
34440 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
34450 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
34460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
34480 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
34490 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45            "VALUE
344a0 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73  S(0,'memo','Miss
344b0 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61 62  ing SELFTEST tab
344c0 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65  le - default che
344d0 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a  cks only',''),".
344e0 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
344f0 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d   (1,'run','PRAGM
34500 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
34510 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20  k','ok')",.     
34520 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
34530 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
34540 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34550 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34560 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71  stderr, "Error q
34570 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66  uerying the self
34580 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a  test table\n");.
34590 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
345a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
345b0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
345c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
345d0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
345e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
345f0 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f  or(i=1; sqlite3_
34600 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
34610 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20  ITE_ROW; i++){. 
34620 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d         int tno =
34630 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
34640 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
34650 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
34660 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
34670 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
34680 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
34690 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   1);.        con
346a0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
346b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
346c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
346d0 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
346e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
346f0 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  zAns = (const ch
34700 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
34710 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33  mn_text(pStmt, 3
34720 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  );..        k = 
34730 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  0;.        if( b
34740 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20  Verbose>0 ){.   
34750 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75         char *zQu
34760 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ote = sqlite3_mp
34770 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c  rintf("%q", zSql
34780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  );.          pri
34790 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e  ntf("%d: %s %s\n
347a0 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71  ", tno, zOp, zSq
347b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
347c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
347d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
347e0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
347f0 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20  (zOp,"memo")==0 
34800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
34810 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
34820 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
34830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
34840 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
34850 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29  (zOp,"run")==0 )
34860 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
34870 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
34880 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d           str.n =
34890 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
348a0 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  r.z[0] = 0;.    
348b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
348c0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
348d0 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70  Sql, captureOutp
348e0 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72  utCallback, &str
348f0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
34900 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a         nTest++;.
34910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 56            if( bV
34920 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
34930 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
34940 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c  f(p->out, "Resul
34950 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29  t: %s\n", str.z)
34960 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
34970 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 7c          if( rc |
34980 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
34990 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
349a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
349b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
349c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
349d0 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d  out, "%d: error-
349e0 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20  code-%d: %s\n", 
349f0 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  tno, rc, zErrMsg
34a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
34a10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
34a20 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
34a30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
34a40 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20  (zAns,str.z)!=0 
34a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
34a60 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
34a70 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34a80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
34a90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20  tf(p->out, "%d: 
34aa0 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
34ab0 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20  ", tno, zAns);. 
34ac0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
34ad0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
34ae0 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  %d:      Got: [%
34af0 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e  s]\n", tno, str.
34b00 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  z);.          }.
34b10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
34b20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
34b30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
34b40 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
34b50 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61    "Unknown opera
34b60 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73  tion \"%s\" on s
34b70 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c  elftest line %d\
34b80 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20  n", zOp, tno);. 
34b90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
34ba0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
34bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34bc0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
34bd0 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e  over rows of con
34be0 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45  tent from SELFTE
34bf0 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ST */.      sqli
34c00 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
34c10 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  mt);.    } /* En
34c20 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f  d loop over k */
34c30 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
34c40 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  tr);.    utf8_pr
34c50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
34c60 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
34c70 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72  d tests\n", nErr
34c80 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , nTest);.  }els
34c90 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
34ca0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
34cb0 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
34cc0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
34cd0 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72  f( nArg<2 || nAr
34ce0 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
34cf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34d00 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74  "Usage: .separat
34d10 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29  or COL ?ROW?\n")
34d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
34d30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
34d40 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
34d50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34d60 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
34d70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
34d80 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
34d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34da0 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
34db0 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65  raySize(p->colSe
34dc0 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
34dd0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[1]);.    }.   
34de0 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
34df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
34e00 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
34e10 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
34e20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
34e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34e40 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
34e50 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
34e60 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d  ->rowSeparator)-
34e70 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  1, azArg[2]);.  
34e80 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
34e90 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
34ea0 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
34eb0 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c  rg[0],"sha3sum",
34ec0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
34ed0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
34ee0 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74   0;   /* Which t
34ef0 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d  able to checksum
34f00 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74  . 0 means everyt
34f10 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hing */.    int 
34f20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
34f30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34f40 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
34f50 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  bSchema = 0;    
34f60 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73       /* Also has
34f70 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  h the schema */.
34f80 20 20 20 20 69 6e 74 20 62 53 65 70 61 72 61 74      int bSeparat
34f90 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
34fa0 48 61 73 68 20 65 61 63 68 20 74 61 62 6c 65 20  Hash each table 
34fb0 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20  separately */.  
34fc0 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32    int iSize = 22
34fd0 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  4;         /* Ha
34fe0 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  sh algorithm to 
34ff0 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  use */.    int b
35000 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20  Debug = 0;      
35010 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77      /* Only show
35020 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74 20   the query that 
35030 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a  would have run *
35040 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
35050 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
35060 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74  * For querying t
35070 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20  ables names */. 
35080 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
35090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
350a0 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  QL to be run */.
350b0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20      char *zSep; 
350c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
350d0 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20  Separator */.   
350e0 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b   ShellText sSql;
350f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
35100 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68  plete SQL for th
35110 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74  e query to run t
35120 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53  he hash */.    S
35130 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b  hellText sQuery;
35140 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
35150 66 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  f queries used t
35160 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65  o read all conte
35170 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64  nt */.    open_d
35180 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
35190 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
351a0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
351b0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
351c0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  i];.      if( z[
351d0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
351e0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
351f0 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  if( z[0]=='-' ) 
35200 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
35210 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d   strcmp(z,"schem
35220 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  a")==0 ){.      
35230 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b      bSchema = 1;
35240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
35250 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
35260 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d  p(z,"sha3-224")=
35270 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
35280 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20  sha3-256")==0.  
35290 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
352a0 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d  (z,"sha3-384")==
352b0 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73  0 || strcmp(z,"s
352c0 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20  ha3-512")==0.   
352d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
352e0 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26    iSize = atoi(&
352f0 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[5]);.        }
35300 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
35310 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67   strcmp(z,"debug
35320 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
35330 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
35340 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
35350 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
35360 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
35370 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
35380 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
35390 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
353a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353b0 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
353c0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0]);.          r
353d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
353e0 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65  , "Should be one
353f0 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20   of: --schema". 
35400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35410 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d              " --
35420 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d  sha3-224 --sha3-
35430 32 35 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d  255 --sha3-384 -
35440 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20  -sha3-512\n");. 
35450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
35460 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
35470 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
35480 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
35490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
354a0 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
354b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
354c0 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75   "Usage: .sha3su
354d0 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b  m ?OPTIONS? ?LIK
354e0 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
354f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
35500 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
35510 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
35520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35530 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a       zLike = z;.
35540 20 20 20 20 20 20 20 20 62 53 65 70 61 72 61 74          bSeparat
35550 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
35560 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
35570 6b 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 7a  ke("sqlite_%", z
35580 4c 69 6b 65 2c 20 30 29 3d 3d 30 20 29 20 62 53  Like, 0)==0 ) bS
35590 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
355a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
355b0 20 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   bSchema ){.    
355c0 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
355d0 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
355e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
355f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
35600 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
35610 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
35620 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
35630 20 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e              " UN
35640 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
35650 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 0a  sqlite_master'".
35660 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
35670 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
35680 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
35690 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
356a0 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
356b0 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
356c0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
356d0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
356e0 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
356f0 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
35700 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
35710 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65        " AND name
35720 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
35730 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20  e_%'".          
35740 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
35750 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
35760 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
35770 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
35780 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
35790 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
357a0 6e 69 74 54 65 78 74 28 26 73 51 75 65 72 79 29  nitText(&sQuery)
357b0 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  ;.    initText(&
357c0 73 53 71 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e  sSql);.    appen
357d0 64 54 65 78 74 28 26 73 53 71 6c 2c 20 22 57 49  dText(&sSql, "WI
357e0 54 48 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72  TH [sha3sum$quer
357f0 79 5d 28 61 2c 62 29 20 41 53 28 22 2c 30 29 3b  y](a,b) AS(",0);
35800 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 56 41 4c  .    zSep = "VAL
35810 55 45 53 28 22 3b 0a 20 20 20 20 77 68 69 6c 65  UES(";.    while
35820 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
35830 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
35840 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
35850 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63   char *zTab = (c
35860 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
35870 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
35880 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 69  Stmt,0);.      i
35890 66 28 20 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69  f( zLike && sqli
358a0 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b  te3_strlike(zLik
358b0 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d 30 20 29  e, zTab, 0)!=0 )
358c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
358d0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
358e0 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c 37 29 21  b, "sqlite_",7)!
358f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
35900 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
35910 2c 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ,"SELECT * FROM 
35920 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
35930 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
35940 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a 20 20 20  y,zTab,'"');.   
35950 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
35960 26 73 51 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e  &sQuery," NOT IN
35970 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20  DEXED;", 0);.   
35980 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
35990 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
359a0 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  e_master")==0 ){
359b0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
359c0 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
359d0 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
359e0 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20  l_name,sql FROM 
359f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a10 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
35a20 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
35a30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
35a40 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
35a50 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
35a60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
35a70 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
35a80 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73  y,"SELECT name,s
35a90 65 71 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  eq FROM sqlite_s
35aa0 65 71 75 65 6e 63 65 22 0a 20 20 20 20 20 20 20  equence".       
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ac0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
35ad0 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
35ae0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
35af0 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
35b00 73 74 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20  stat1")==0 ){.  
35b10 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
35b20 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
35b30 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52   tbl,idx,stat FR
35b40 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22  OM sqlite_stat1"
35b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b60 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
35b70 44 45 52 20 42 59 20 74 62 6c 2c 69 64 78 3b 22  DER BY tbl,idx;"
35b80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
35b90 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
35ba0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33  b, "sqlite_stat3
35bb0 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ")==0.          
35bc0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61     || strcmp(zTa
35bd0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
35be0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
35bf0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
35c00 65 72 79 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ery, "SELECT * F
35c10 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
35c20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35c30 51 75 65 72 79 2c 20 7a 54 61 62 2c 20 30 29 3b  Query, zTab, 0);
35c40 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
35c50 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 20 4f  ext(&sQuery, " O
35c60 52 44 45 52 20 42 59 20 74 62 6c 2c 20 69 64 78  RDER BY tbl, idx
35c70 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20 30 29 3b  , rowid;\n", 0);
35c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35c90 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
35ca0 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20 20 20 20   zSep, 0);.     
35cb0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
35cc0 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20 27 5c 27  l, sQuery.z, '\'
35cd0 27 29 3b 0a 20 20 20 20 20 20 73 51 75 65 72 79  ');.      sQuery
35ce0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 70  .n = 0;.      ap
35cf0 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
35d00 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ",", 0);.      a
35d10 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
35d20 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b 0a 20 20   zTab, '\'');.  
35d30 20 20 20 20 7a 53 65 70 20 3d 20 22 29 2c 28 22      zSep = "),("
35d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
35d50 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
35d60 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 62 53 65  mt);.    if( bSe
35d70 70 61 72 61 74 65 20 29 7b 0a 20 20 20 20 20 20  parate ){.      
35d80 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
35d90 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
35da0 20 20 22 25 73 29 29 22 0a 20 20 20 20 20 20 20    "%s))".       
35db0 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65     " SELECT lowe
35dc0 72 28 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  r(hex(sha3_query
35dd0 28 61 2c 25 64 29 29 29 20 41 53 20 68 61 73 68  (a,%d))) AS hash
35de0 2c 20 62 20 41 53 20 6c 61 62 65 6c 22 0a 20 20  , b AS label".  
35df0 20 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d          "   FROM
35e00 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
35e10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71  ",.          sSq
35e20 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  l.z, iSize);.   
35e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
35e40 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
35e50 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
35e60 22 25 73 29 29 22 0a 20 20 20 20 20 20 20 20 20  "%s))".         
35e70 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28   " SELECT lower(
35e80 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 67  hex(sha3_query(g
35e90 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61 2c 27 27  roup_concat(a,''
35ea0 29 2c 25 64 29 29 29 20 41 53 20 68 61 73 68 22  ),%d))) AS hash"
35eb0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 46  .          "   F
35ec0 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75 65  ROM [sha3sum$que
35ed0 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ry]",.          
35ee0 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a  sSql.z, iSize);.
35ef0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 54 65      }.    freeTe
35f00 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20  xt(&sQuery);.   
35f10 20 66 72 65 65 54 65 78 74 28 26 73 53 71 6c 29   freeText(&sSql)
35f20 3b 0a 20 20 20 20 69 66 28 20 62 44 65 62 75 67  ;.    if( bDebug
35f30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35f40 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
35f50 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
35f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
35f70 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
35f80 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
35f90 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
35fa0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
35fb0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
35fc0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
35fd0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
35fe0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 0a 20 20  .  if( c=='s'.  
35ff0 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41   && (strncmp(azA
36000 72 67 5b 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20  rg[0], "shell", 
36010 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70  n)==0 || strncmp
36020 28 61 7a 41 72 67 5b 30 5d 2c 22 73 79 73 74 65  (azArg[0],"syste
36030 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  m",n)==0).  ){. 
36040 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20     char *zCmd;. 
36050 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
36060 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
36070 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36080 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36090 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c  .system COMMAND\
360a0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
360b0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
360c0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
360d0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6d 64 20  .    }.    zCmd 
360e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
360f0 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31  f(strchr(azArg[1
36100 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73 22 3a 22  ],' ')==0?"%s":"
36110 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72 67 5b 31  \"%s\"", azArg[1
36120 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b  ]);.    for(i=2;
36130 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
36140 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69       zCmd = sqli
36150 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63  te3_mprintf(strc
36160 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27 20 27 29  hr(azArg[i],' ')
36170 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22 25 7a 20  ==0?"%z %s":"%z 
36180 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
36190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361a0 20 20 20 20 20 20 7a 43 6d 64 2c 20 61 7a 41 72        zCmd, azAr
361b0 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[i]);.    }.   
361c0 20 78 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64   x = system(zCmd
361d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
361e0 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69  ree(zCmd);.    i
361f0 66 28 20 78 20 29 20 72 61 77 5f 70 72 69 6e 74  f( x ) raw_print
36200 66 28 73 74 64 65 72 72 2c 20 22 53 79 73 74 65  f(stderr, "Syste
36210 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  m command return
36220 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d  s %d\n", x);.  }
36230 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
36240 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
36250 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f  OHAVE_SYSTEM) */
36260 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
36270 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
36280 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d  0], "show", n)==
36290 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
362a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 42 6f  const char *azBo
362b0 6f 6c 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20  ol[] = { "off", 
362c0 22 6f 6e 22 2c 20 22 74 72 69 67 67 65 72 22 2c  "on", "trigger",
362d0 20 22 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e   "full"};.    in
362e0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
362f0 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
36300 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36310 20 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e   "Usage: .show\n
36320 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
36330 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
36340 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
36350 20 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70      }.    utf8_p
36360 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
36370 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65  12.12s: %s\n","e
36380 63 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  cho",.          
36390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
363a0 20 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53          azBool[S
363b0 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
363c0 48 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20  HFLG_Echo)]);.  
363d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
363e0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
363f0 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42  %s\n","eqp", azB
36400 6f 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33  ool[p->autoEQP&3
36410 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ]);.    utf8_pri
36420 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
36430 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70  .12s: %s\n","exp
36440 6c 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lain",.         
36450 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
36460 70 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70  plain ? "on" : p
36470 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20  ->autoExplain ? 
36480 22 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b  "auto" : "off");
36490 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
364a0 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73  (p->out,"%12.12s
364b0 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73  : %s\n","headers
364c0 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f  ", azBool[p->sho
364d0 77 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20  wHeader!=0]);.  
364e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
364f0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
36500 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f  %s\n","mode", mo
36510 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
36520 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
36530 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
36540 31 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c  12s: ", "nullval
36550 75 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  ue");.      outp
36560 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
36570 75 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ut, p->nullValue
36580 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
36590 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
365a0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
365b0 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31  tf(p->out,"%12.1
365c0 32 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75  2s: %s\n","outpu
365d0 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
365e0 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66  strlen30(p->outf
365f0 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
36600 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
36610 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
36620 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
36630 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72  ", "colseparator
36640 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
36650 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
36660 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
36670 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  r);.      raw_pr
36680 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
36690 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
366a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e  ntf(p->out,"%12.
366b0 31 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61  12s: ", "rowsepa
366c0 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f  rator");.      o
366d0 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
366e0 2d 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70  ->out, p->rowSep
366f0 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  arator);.      r
36700 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
36710 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66  , "\n");.    utf
36720 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
36730 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
36740 2c 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c  ,"stats", azBool
36750 5b 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29  [p->statsOn!=0])
36760 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
36770 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
36780 32 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b  2s: ", "width");
36790 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c  .    for (i=0;i<
367a0 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
367b0 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70  ->colWidth) && p
367c0 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d  ->colWidth[i] !=
367d0 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20   0;i++) {.      
367e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
367f0 74 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c  t, "%d ", p->col
36800 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  Width[i]);.    }
36810 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
36820 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
36830 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
36840 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
36850 20 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d   %s\n", "filenam
36860 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
36870 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
36880 6d 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  me ? p->zDbFilen
36890 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c  ame : "");.  }el
368a0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
368b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
368c0 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e  g[0], "stats", n
368d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
368e0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
368f0 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 28 75   p->statsOn = (u
36900 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
36910 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
36920 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20  lse if( nArg==1 
36930 29 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  ){.      display
36940 5f 73 74 61 74 73 28 70 2d 3e 64 62 2c 20 70 2c  _stats(p->db, p,
36950 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
36960 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36970 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
36980 20 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f   .stats ?on|off?
36990 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
369a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
369b0 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 74 27  e..  if( (c=='t'
369c0 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63   && n>1 && strnc
369d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61  mp(azArg[0], "ta
369e0 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  bles", n)==0).  
369f0 20 7c 7c 20 28 63 3d 3d 27 69 27 20 26 26 20 28   || (c=='i' && (
36a00 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36a10 2c 20 22 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d  , "indices", n)=
36a20 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
36a30 20 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61      || strncmp(a
36a40 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 65 78 65  zArg[0], "indexe
36a50 73 22 2c 20 6e 29 3d 3d 30 29 20 29 0a 20 20 29  s", n)==0) ).  )
36a60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
36a70 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63  mt *pStmt;.    c
36a80 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a  har **azResult;.
36a90 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41      int nRow, nA
36aa0 6c 6c 6f 63 3b 0a 20 20 20 20 69 6e 74 20 69 69  lloc;.    int ii
36ab0 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
36ac0 73 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  s;.    initText(
36ad0 26 73 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  &s);.    open_db
36ae0 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
36af0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
36b00 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  _v2(p->db, "PRAG
36b10 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74  MA database_list
36b20 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  ", -1, &pStmt, 0
36b30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
36b40 72 65 74 75 72 6e 20 73 68 65 6c 6c 44 61 74 61  return shellData
36b50 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29  baseError(p->db)
36b60 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  ;..    if( nArg>
36b70 32 20 26 26 20 63 3d 3d 27 69 27 20 29 7b 0a 20  2 && c=='i' ){. 
36b80 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 61 6e       /* It is an
36b90 20 68 69 73 74 6f 72 69 63 61 6c 20 61 63 63 69   historical acci
36ba0 64 65 6e 74 20 74 68 61 74 20 74 68 65 20 2e 69  dent that the .i
36bb0 6e 64 65 78 65 73 20 63 6f 6d 6d 61 6e 64 20 73  ndexes command s
36bc0 68 6f 77 73 20 61 6e 20 65 72 72 6f 72 0a 20 20  hows an error.  
36bd0 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 61 6c 6c      ** when call
36be0 65 64 20 77 69 74 68 20 74 68 65 20 77 72 6f 6e  ed with the wron
36bf0 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
36c00 6d 65 6e 74 73 20 77 68 65 72 65 61 73 20 74 68  ments whereas th
36c10 65 20 2e 74 61 62 6c 65 73 0a 20 20 20 20 20 20  e .tables.      
36c20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 20  ** command does 
36c30 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 61  not. */.      ra
36c40 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36c50 20 22 55 73 61 67 65 3a 20 2e 69 6e 64 65 78 65   "Usage: .indexe
36c60 73 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f  s ?LIKE-PATTERN?
36c70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
36c80 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
36c90 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
36ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
36cb0 69 69 3d 30 3b 20 73 71 6c 69 74 65 33 5f 73 74  ii=0; sqlite3_st
36cc0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
36cd0 45 5f 52 4f 57 3b 20 69 69 2b 2b 29 7b 0a 20 20  E_ROW; ii++){.  
36ce0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36cf0 7a 44 62 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  zDbName = (const
36d00 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
36d10 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
36d20 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
36d30 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e  zDbName==0 ) con
36d40 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
36d50 20 73 2e 7a 20 26 26 20 73 2e 7a 5b 30 5d 20 29   s.z && s.z[0] )
36d60 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
36d70 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 2c 20 30  " UNION ALL ", 0
36d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
36d90 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62  ite3_stricmp(zDb
36da0 4e 61 6d 65 2c 20 22 6d 61 69 6e 22 29 3d 3d 30  Name, "main")==0
36db0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
36dc0 6e 64 54 65 78 74 28 26 73 2c 20 22 53 45 4c 45  ndText(&s, "SELE
36dd0 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20  CT name FROM ", 
36de0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
36df0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
36e00 65 78 74 28 26 73 2c 20 22 53 45 4c 45 43 54 20  ext(&s, "SELECT 
36e10 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
36e20 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44  ppendText(&s, zD
36e30 62 4e 61 6d 65 2c 20 27 5c 27 27 29 3b 0a 20 20  bName, '\'');.  
36e40 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
36e50 28 26 73 2c 20 22 7c 7c 27 2e 27 7c 7c 6e 61 6d  (&s, "||'.'||nam
36e60 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  e FROM ", 0);.  
36e70 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
36e80 6e 64 54 65 78 74 28 26 73 2c 20 7a 44 62 4e 61  ndText(&s, zDbNa
36e90 6d 65 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20  me, '"');.      
36ea0 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
36eb0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22  .sqlite_master "
36ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
36ed0 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
36ee0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
36ef0 22 20 57 48 45 52 45 20 74 79 70 65 20 49 4e 20  " WHERE type IN 
36f00 28 27 74 61 62 6c 65 27 2c 27 76 69 65 77 27 29  ('table','view')
36f10 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
36f20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
36f30 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
36f40 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20  qlite_%'".      
36f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f60 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b  "   AND name LIK
36f70 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20 20  E ?1", 0);.     
36f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36f90 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 22 20  appendText(&s," 
36fa0 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
36fb0 78 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  x'".            
36fc0 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
36fd0 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  D tbl_name LIKE 
36fe0 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ?1", 0);.      }
36ff0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
37000 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
37010 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 61 70 70  (pStmt);.    app
37020 65 6e 64 54 65 78 74 28 26 73 2c 20 22 20 4f 52  endText(&s, " OR
37030 44 45 52 20 42 59 20 31 22 2c 20 30 29 3b 0a 20  DER BY 1", 0);. 
37040 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
37050 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
37060 2c 20 73 2e 7a 2c 20 2d 31 2c 20 26 70 53 74 6d  , s.z, -1, &pStm
37070 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 54  t, 0);.    freeT
37080 65 78 74 28 26 73 29 3b 0a 20 20 20 20 69 66 28  ext(&s);.    if(
37090 20 72 63 20 29 20 72 65 74 75 72 6e 20 73 68 65   rc ) return she
370a0 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28  llDatabaseError(
370b0 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  p->db);..    /* 
370c0 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74  Run the SQL stat
370d0 65 6d 65 6e 74 20 70 72 65 70 61 72 65 64 20 62  ement prepared b
370e0 79 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63  y the above bloc
370f0 6b 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  k. Store the res
37100 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 73 20 61  ults.    ** as a
37110 6e 20 61 72 72 61 79 20 6f 66 20 6e 75 6c 2d 74  n array of nul-t
37120 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
37130 73 20 69 6e 20 61 7a 52 65 73 75 6c 74 5b 5d 2e  s in azResult[].
37140 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20    */.    nRow = 
37150 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  nAlloc = 0;.    
37160 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  azResult = 0;.  
37170 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a    if( nArg>1 ){.
37180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
37190 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
371a0 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c 20  , azArg[1], -1, 
371b0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
371c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
371d0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
371e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
371f0 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  "%", -1, SQLITE_
37200 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
37210 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
37220 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
37230 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
37240 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c     if( nRow>=nAl
37250 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  loc ){.        c
37260 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20  har **azNew;.   
37270 20 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 6e 41       int n2 = nA
37280 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
37290 20 20 20 20 20 61 7a 4e 65 77 20 3d 20 73 71 6c       azNew = sql
372a0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61  ite3_realloc64(a
372b0 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28  zResult, sizeof(
372c0 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a 6e 32 29  azResult[0])*n2)
372d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a  ;.        if( az
372e0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
372f0 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f      rc = shellNo
37300 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  memError();.    
37310 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
37330 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a 20 20 20 20  Alloc = n2;.    
37340 20 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 61      azResult = a
37350 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zNew;.      }.  
37360 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f      azResult[nRo
37370 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  w] = sqlite3_mpr
37380 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
37390 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
373a0 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
373b0 20 69 66 28 20 30 3d 3d 61 7a 52 65 73 75 6c 74   if( 0==azResult
373c0 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20 20 20 20 20  [nRow] ){.      
373d0 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65    rc = shellNome
373e0 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  mError();.      
373f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
37400 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  .      nRow++;. 
37410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
37420 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
37430 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  tmt)!=SQLITE_OK 
37440 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 68  ){.      rc = sh
37450 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
37460 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 0a  (p->db);.    }..
37470 20 20 20 20 2f 2a 20 50 72 65 74 74 79 2d 70 72      /* Pretty-pr
37480 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  int the contents
37490 20 6f 66 20 61 72 72 61 79 20 61 7a 52 65 73 75   of array azResu
374a0 6c 74 5b 5d 20 74 6f 20 74 68 65 20 6f 75 74 70  lt[] to the outp
374b0 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ut */.    if( rc
374c0 3d 3d 30 20 26 26 20 6e 52 6f 77 3e 30 20 29 7b  ==0 && nRow>0 ){
374d0 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20  .      int len, 
374e0 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  maxlen = 0;.    
374f0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
37500 20 20 69 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c    int nPrintCol,
37510 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20   nPrintRow;.    
37520 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f    for(i=0; i<nRo
37530 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
37540 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
37550 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20  azResult[i]);.  
37560 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61        if( len>ma
37570 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
37580 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
37590 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38     nPrintCol = 8
375a0 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20  0/(maxlen+2);.  
375b0 20 20 20 20 69 66 28 20 6e 50 72 69 6e 74 43 6f      if( nPrintCo
375c0 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20  l<1 ) nPrintCol 
375d0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e  = 1;.      nPrin
375e0 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e  tRow = (nRow + n
375f0 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50  PrintCol - 1)/nP
37600 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66  rintCol;.      f
37610 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74  or(i=0; i<nPrint
37620 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Row; i++){.     
37630 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52     for(j=i; j<nR
37640 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77  ow; j+=nPrintRow
3765