/ Hex Artifact Content
Login

Artifact a1fa74761b1bdeca5d40dcfdf55fd88f5139155e2bdd2c6b3e9e8e359d062a7d:


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: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23 20  # undef popen.# 
0de0: 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70 6f  define popen _po
0df0: 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c 6f  pen.# undef pclo
0e00: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c 6f  se.# define pclo
0e10: 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73 65  se _pclose.#else
0e20: 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  . /* Make sure i
0e30: 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70 72  satty() has a pr
0e40: 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78 74  ototype. */. ext
0e50: 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28 69  ern int isatty(i
0e60: 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66 69  nt);..# if !defi
0e70: 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20  ned(__RTP__) && 
0e80: 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45  !defined(_WRS_KE
0e90: 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65 6e  RNEL).  /* popen
0ea0: 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65 20   and pclose are 
0eb0: 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f 6e  not C89 function
0ec0: 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 2a  s and so are.  *
0ed0: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69 74  * sometimes omit
0ee0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73 74  ted from the <st
0ef0: 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a 2f  dio.h> header */
0f00: 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45 20  .   extern FILE 
0f10: 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  *popen(const cha
0f20: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
0f30: 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 70  .   extern int p
0f40: 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23 20  close(FILE*);.# 
0f50: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 53  else.#  define S
0f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
0f70: 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69   1.# endif.#endi
0f80: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
0f90: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69  WIN32_WCE)./* Wi
0fa0: 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69  ndows CE (arm-wi
0fb0: 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63  nce-mingw32ce-gc
0fc0: 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  c) does not prov
0fd0: 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20  ide isatty(). * 
0fe0: 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61  thus we always a
0ff0: 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61  ssume that we ha
1000: 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68  ve a console. Th
1010: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65  at can be. * ove
1020: 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65  rridden with the
1030: 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20   -batch command 
1040: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f  line option.. */
1050: 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28  .#define isatty(
1060: 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  x) 1.#endif../* 
1070: 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68 61  ctype macros tha
1080: 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67 6e  t work with sign
1090: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ed characters */
10a0: 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63 65  .#define IsSpace
10b0: 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75 6e  (X)  isspace((un
10c0: 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23  signed char)X).#
10d0: 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28 58  define IsDigit(X
10e0: 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  )  isdigit((unsi
10f0: 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64 65  gned char)X).#de
1100: 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29 20  fine ToLower(X) 
1110: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 28   (char)tolower((
1120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
1130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
1140: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1150: 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64 65  (WIN32).#include
1160: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a   <windows.h>../*
1170: 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73 69   string conversi
1180: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c 79  on routines only
1190: 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33 32   needed on Win32
11a0: 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72 20   */.extern char 
11b0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
11c0: 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c  nicode_to_utf8(L
11d0: 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e 20  PCWSTR);.extern 
11e0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
11f0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
1200: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1210: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 63  , int);.extern c
1220: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
1230: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
1240: 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  v2(const char *,
1250: 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c 50   int);.extern LP
1260: 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e  WSTR sqlite3_win
1270: 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
1280: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
1290: 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  Text);.#endif../
12a0: 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  * On Windows, we
12b0: 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77 69   normally run wi
12c0: 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f  th output mode o
12d0: 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20 5c  f TEXT so that \
12e0: 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  n characters.** 
12f0: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
1300: 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  y translated int
1310: 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65 72  o \r\n.  However
1320: 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  , this behavior 
1330: 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 64  needs.** to be d
1340: 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65 20  isabled in some 
1350: 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e 20  cases (ex: when 
1360: 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20 6f  generating CSV o
1370: 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a 2a  utput and when.*
1380: 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f 74  * rendering quot
1390: 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74 20  ed strings that 
13a0: 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72 61  contain \n chara
13b0: 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f 6c  cters).  The fol
13c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
13d0: 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  es take care of 
13e0: 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  that..*/.#if def
13f0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
1400: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 73  defined(WIN32).s
1410: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42 69  tatic void setBi
1420: 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a 66  naryMode(FILE *f
1430: 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75  ile, int isOutpu
1440: 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70  t){.  if( isOutp
1450: 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65  ut ) fflush(file
1460: 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66  );.  _setmode(_f
1470: 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f  ileno(file), _O_
1480: 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74 69  BINARY);.}.stati
1490: 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d 6f  c void setTextMo
14a0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
14b0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
14c0: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
14d0: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
14e0: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
14f0: 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29 3b  file), _O_TEXT);
1500: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1510: 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28  e setBinaryMode(
1520: 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73 65  X,Y).# define se
1530: 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a 23  tTextMode(X,Y).#
1540: 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65 20  endif.../* True 
1550: 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73 20  if the timer is 
1560: 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
1570: 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65  c int enableTime
1580: 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75 72  r = 0;../* Retur
1590: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61  n the current wa
15a0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f  ll-clock time */
15b0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
15c0: 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79 28  int64 timeOfDay(
15d0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
15e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f  sqlite3_vfs *clo
15f0: 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c  ckVfs = 0;.  sql
1600: 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20  ite3_int64 t;.  
1610: 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20  if( clockVfs==0 
1620: 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c  ) clockVfs = sql
1630: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1640: 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73  ;.  if( clockVfs
1650: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26  ->iVersion>=2 &&
1660: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1670: 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30 20  entTimeInt64!=0 
1680: 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  ){.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  >xCurrentTimeInt
16a0: 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29  64(clockVfs, &t)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
16c0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f  ouble r;.    clo
16d0: 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  ckVfs->xCurrentT
16e0: 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72  ime(clockVfs, &r
16f0: 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c 69  );.    t = (sqli
1700: 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34  te3_int64)(r*864
1710: 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20  00000.0);.  }.  
1720: 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66  return t;.}..#if
1730: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1740: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49  ) && !defined(WI
1750: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
1760: 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c 75  (__minux).#inclu
1770: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
1780: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
1790: 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56 78  source.h>../* Vx
17a0: 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20 73  Works does not s
17b0: 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67 65  upport getrusage
17c0: 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65 20  () as far as we 
17d0: 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a 2f  can determine */
17e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 52  .#if defined(_WR
17f0: 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65 66  S_KERNEL) || def
1800: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73 74  ined(__RTP__).st
1810: 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20 20  ruct rusage {.  
1820: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72  struct timeval r
1830: 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65 72  u_utime; /* user
1840: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1850: 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  /.  struct timev
1860: 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a 20  al ru_stime; /* 
1870: 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65 20  system CPU time 
1880: 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  used */.};.#defi
1890: 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c 42  ne getrusage(A,B
18a0: 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69 7a  ) memset(B,0,siz
18b0: 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66 0a  eof(*B)).#endif.
18c0: 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75 72  ./* Saved resour
18d0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
18e0: 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  or the beginning
18f0: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
1900: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1910: 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e 3b  t rusage sBegin;
1920: 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61 74    /* CPU time at
1930: 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69 63   start */.static
1940: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1950: 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c 2d  Begin;  /* Wall-
1960: 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73 74  clock time at st
1970: 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65  art */../*.** Be
1980: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
1990: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
19a0: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
19b0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
19c0: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
19d0: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
19e0: 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69 6e  GE_SELF, &sBegin
19f0: 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d 20  );.    iBegin = 
1a00: 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d  timeOfDay();.  }
1a10: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
1a20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20  e difference of 
1a30: 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74 73  two time_structs
1a40: 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73   in seconds */.s
1a50: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d  tatic double tim
1a60: 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69 6d  eDiff(struct tim
1a70: 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73 74  eval *pStart, st
1a80: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 45  ruct timeval *pE
1a90: 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  nd){.  return (p
1aa0: 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20 70  End->tv_usec - p
1ab0: 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29 2a  Start->tv_usec)*
1ac0: 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20 20  0.000001 +.     
1ad0: 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45 6e      (double)(pEn
1ae0: 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74 61  d->tv_sec - pSta
1af0: 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a 0a  rt->tv_sec);.}..
1b00: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1b10: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
1b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b30: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
1b40: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
1b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b60: 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69 6d  int64 iEnd = tim
1b70: 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73 74  eOfDay();.    st
1b80: 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e 64  ruct rusage sEnd
1b90: 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  ;.    getrusage(
1ba0: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 45  RUSAGE_SELF, &sE
1bb0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
1bc0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
1bd0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
1be0: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
1bf0: 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a 30  iEnd - iBegin)*0
1c00: 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d  .001,.       tim
1c10: 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75  eDiff(&sBegin.ru
1c20: 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75  _utime, &sEnd.ru
1c30: 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _utime),.       
1c40: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
1c50: 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_stime, &sEnd
1c60: 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20 7d  .ru_stime));.  }
1c70: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49  .}..#define BEGI
1c80: 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d  N_TIMER beginTim
1c90: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44  er().#define END
1ca0: 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28  _TIMER endTimer(
1cb0: 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  ).#define HAS_TI
1cc0: 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64 65  MER 1..#elif (de
1cd0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1ce0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
1cf0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1d00: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1d10: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1d20: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1d30: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e 44  n */.static HAND
1d40: 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74 61  LE hProcess;.sta
1d50: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 4b  tic FILETIME ftK
1d60: 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61 74  ernelBegin;.stat
1d70: 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55 73  ic FILETIME ftUs
1d80: 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20  erBegin;.static 
1d90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
1da0: 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65 64  WallBegin;.typed
1db0: 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49 20  ef BOOL (WINAPI 
1dc0: 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28 48  *GETPROCTIMES)(H
1dd0: 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ANDLE, LPFILETIM
1de0: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a 20  E, LPFILETIME,. 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c     LPFILETIME, L
1e20: 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61 74  PFILETIME);.stat
1e30: 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53 20  ic GETPROCTIMES 
1e40: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1e50: 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a  ddr = NULL;../*.
1e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1e70: 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65 72  if we have timer
1e80: 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75 72   support.  Retur
1e90: 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72 79  n 1 if necessary
1ea0: 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75 6e  .** support foun
1eb0: 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65 76  d (or found prev
1ec0: 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74  iously)..*/.stat
1ed0: 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72 28  ic int hasTimer(
1ee0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65 74  void){.  if( get
1ef0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f10: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
1f20: 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54 69   /* GetProcessTi
1f30: 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70 70  mes() isn't supp
1f40: 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20 61  orted in WIN95 a
1f50: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57 69  nd some other Wi
1f60: 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65 72  ndows.    ** ver
1f70: 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74 68  sions. See if th
1f80: 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72 65  e version we are
1f90: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73 20   running on has 
1fa0: 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20 20  it, and if it.  
1fb0: 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65 20    ** does, save 
1fc0: 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  off a pointer to
1fd0: 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72 72   it and the curr
1fe0: 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e 64  ent process hand
1ff0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 68  le..    */.    h
2000: 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75 72  Process = GetCur
2010: 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a 20  rentProcess();. 
2020: 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73 20     if( hProcess 
2030: 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41 4e  ){.      HINSTAN
2040: 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c 6f  CE hinstLib = Lo
2050: 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28 22  adLibrary(TEXT("
2060: 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29 3b  Kernel32.dll"));
2070: 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20  .      if( NULL 
2080: 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a 20  != hinstLib ){. 
2090: 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65 73         getProces
20a0: 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20 20  sTimesAddr =.   
20b0: 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52 4f           (GETPRO
20c0: 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63 41  CTIMES) GetProcA
20d0: 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62 2c  ddress(hinstLib,
20e0: 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65   "GetProcessTime
20f0: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s");.        if(
2100: 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f 63   NULL != getProc
2110: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
2120: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2130: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2140: 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61 72        FreeLibrar
2150: 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20 20  y(hinstLib);.   
2160: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2170: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2180: 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67  .** Begin timing
2190: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f   an operation.*/
21a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67  .static void beg
21b0: 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  inTimer(void){. 
21c0: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
21d0: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
21e0: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 46  mesAddr ){.    F
21f0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
2200: 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20 20  on, ftExit;.    
2210: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2220: 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74  ddr(hProcess,&ft
2230: 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74  Creation,&ftExit
2240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2250: 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65 72            &ftKer
2260: 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65 72  nelBegin,&ftUser
2270: 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57 61  Begin);.    ftWa
2280: 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66  llBegin = timeOf
2290: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
22a0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
22b0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46 49  erence of two FI
22c0: 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20 69  LETIME structs i
22d0: 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61  n seconds */.sta
22e0: 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65 44  tic double timeD
22f0: 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70 53  iff(FILETIME *pS
2300: 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20 2a  tart, FILETIME *
2310: 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65 5f  pEnd){.  sqlite_
2320: 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20 3d  int64 i64Start =
2330: 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   *((sqlite_int64
2340: 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20 73   *) pStart);.  s
2350: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 45  qlite_int64 i64E
2360: 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  nd = *((sqlite_i
2370: 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a 20  nt64 *) pEnd);. 
2380: 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29   return (double)
2390: 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34 53   ((i64End - i64S
23a0: 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30 30  tart) / 10000000
23b0: 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .0);.}../*.** Pr
23c0: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
23d0: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
23e0: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
23f0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
2400: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
2410: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 29  rocessTimesAddr)
2420: 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66  {.    FILETIME f
2430: 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69  tCreation, ftExi
2440: 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  t, ftKernelEnd, 
2450: 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20 73  ftUserEnd;.    s
2460: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 57  qlite3_int64 ftW
2470: 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44  allEnd = timeOfD
2480: 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72 6f  ay();.    getPro
2490: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
24a0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
24b0: 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b 65  on,&ftExit,&ftKe
24c0: 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72 45  rnelEnd,&ftUserE
24d0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
24e0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
24f0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
2500: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
2510: 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57 61  ftWallEnd - ftWa
2520: 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a  llBegin)*0.001,.
2530: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
2540: 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26 66  &ftUserBegin, &f
2550: 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20 20  tUserEnd),.     
2560: 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b 65    timeDiff(&ftKe
2570: 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b 65  rnelBegin, &ftKe
2580: 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d  rnelEnd));.  }.}
2590: 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f  ..#define BEGIN_
25a0: 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72  TIMER beginTimer
25b0: 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  ().#define END_T
25c0: 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a  IMER endTimer().
25d0: 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45  #define HAS_TIME
25e0: 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23 65  R hasTimer()..#e
25f0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47 49  lse.#define BEGI
2600: 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20  N_TIMER.#define 
2610: 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e  END_TIMER.#defin
2620: 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23 65  e HAS_TIMER 0.#e
2630: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64  ndif../*.** Used
2640: 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72 6e   to prevent warn
2650: 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
2660: 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a  d parameters.*/.
2670: 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50  #define UNUSED_P
2680: 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f 69  ARAMETER(x) (voi
2690: 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  d)(x)../*.** Num
26a0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
26b0: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23  in an array.*/.#
26c0: 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65  define ArraySize
26d0: 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65 6f  (X)  (int)(sizeo
26e0: 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d  f(X)/sizeof(X[0]
26f0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ))../*.** If the
2700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
2710: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
2720: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
2730: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
2740: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
2750: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
2760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
2770: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
2780: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
2790: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
27a0: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
27c0: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
27d0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
27e0: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
27f0: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
2800: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
2810: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
2820: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
2830: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69 6e  1;../*.** On Win
2840: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65 20  dows systems we 
2850: 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66 20  have to know if 
2860: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20  standard output 
2870: 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a 20  is a console.** 
2880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61 6e  in order to tran
2890: 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74 6f  slate UTF-8 into
28a0: 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c 6c   MBCS.  The foll
28b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
28c0: 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72 61  s.** true if tra
28d0: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71 75  nslation is requ
28e0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
28f0: 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f  int stdout_is_co
2900: 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  nsole = 1;../*.*
2910: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2920: 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69  is the open SQLi
2930: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57 65  te database.  We
2940: 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a   make a pointer.
2950: 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ** to this datab
2960: 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61 72  ase a static var
2970: 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  iable so that it
2980: 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65 64   can be accessed
2990: 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e  .** by the SIGIN
29a0: 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74  T handler to int
29b0: 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  errupt database 
29c0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73  processing..*/.s
29d0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 67  tatic sqlite3 *g
29e0: 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f 2a  lobalDb = 0;../*
29f0: 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69  .** True if an i
2a00: 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f  nterrupt (Contro
2a10: 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65  l-C) has been re
2a20: 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ceived..*/.stati
2a30: 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73  c volatile int s
2a40: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
2a50: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2a60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72   the name of our
2a70: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
2a80: 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75  set in main(), u
2a90: 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62  sed.** in a numb
2aa0: 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63  er of other plac
2ab0: 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65  es, mostly for e
2ac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
2ad0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 41  /.static char *A
2ae0: 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rgv0;../*.** Pro
2af0: 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69  mpt strings. Ini
2b00: 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e  tialized in main
2b10: 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a  . Settable with.
2b20: 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69  **   .prompt mai
2b30: 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74  n continue.*/.st
2b40: 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72  atic char mainPr
2b50: 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a  ompt[20];     /*
2b60: 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d   First line prom
2b70: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71  pt. default: "sq
2b80: 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63  lite> "*/.static
2b90: 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72   char continuePr
2ba0: 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e  ompt[20]; /* Con
2bb0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
2bc0: 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e  . default: "   .
2bd0: 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ..> " */../*.** 
2be0: 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69  Render output li
2bf0: 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20 45  ke fprintf().  E
2c00: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 75  xcept, if the ou
2c10: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
2c20: 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65 20   the.** console 
2c30: 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 72  and if this is r
2c40: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e 64  unning on a Wind
2c50: 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72 61  ows machine, tra
2c60: 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f 75  nslate the.** ou
2c70: 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38 20  tput from UTF-8 
2c80: 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23 69  into MBCS..*/.#i
2c90: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
2ca0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
2cb0: 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70 72  32).void utf8_pr
2cc0: 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c 20  intf(FILE *out, 
2cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2ce0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2cf0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
2d00: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2d10: 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f 69  ;.  if( stdout_i
2d20: 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f 75  s_console && (ou
2d30: 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75 74  t==stdout || out
2d40: 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20 20  ==stderr) ){.   
2d50: 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c 69   char *z1 = sqli
2d60: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2d70: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 63  rmat, ap);.    c
2d80: 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65  har *z2 = sqlite
2d90: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
2da0: 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b 0a  mbcs_v2(z1, 0);.
2db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2dc0: 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73 28  (z1);.    fputs(
2dd0: 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73 71  z2, out);.    sq
2de0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b 0a  lite3_free(z2);.
2df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66 70    }else{.    vfp
2e00: 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72 6d  rintf(out, zForm
2e10: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 76  at, ap);.  }.  v
2e20: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6c  a_end(ap);.}.#el
2e30: 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66 38  if !defined(utf8
2e40: 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e  _printf).# defin
2e50: 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66 70  e utf8_printf fp
2e60: 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rintf.#endif../*
2e70: 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70 75  .** Render outpu
2e80: 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28 29  t like fprintf()
2e90: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
2ea0: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e  ot be used on an
2eb0: 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 69  ything that.** i
2ec0: 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20 66  ncludes string f
2ed0: 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e 20  ormatting (e.g. 
2ee0: 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21 64  "%s")..*/.#if !d
2ef0: 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e 74  efined(raw_print
2f00: 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77 5f  f).# define raw_
2f10: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2f20: 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63 61  endif../* Indica
2f30: 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  te out-of-memory
2f40: 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73 74   and exit. */.st
2f50: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 5f  atic void shell_
2f60: 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f  out_of_memory(vo
2f70: 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  id){.  raw_print
2f80: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2f90: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
2fa0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
2fc0: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
2fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
2fe0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2ff0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
3000: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
3010: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
3020: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
3030: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
3040: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
3050: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
3060: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
3070: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
3080: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
3090: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
30a0: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
30b0: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
30c0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
30d0: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
30e0: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
30f0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
3100: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
3110: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
3120: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
3130: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
3140: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
3150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3160: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3170: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
3180: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
3190: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
31a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
31b0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
31c0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
31d0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
31e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
31f0: 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  8_printf(iotrace
3200: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71  , "%s", z);.  sq
3210: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d  lite3_free(z);.}
3220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
3230: 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74  utput string zUt
3240: 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74  f to stream pOut
3250: 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73   as w characters
3260: 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74  .  If w is negat
3270: 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67  ive,.** then rig
3280: 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74  ht-justify the t
3290: 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77  ext.  W is the w
32a0: 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68  idth in UTF-8 ch
32b0: 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a  aracters, not.**
32c0: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
32d0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
32e0: 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65  om the %*.*s spe
32f0: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72  cification in pr
3300: 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69  intf.** since wi
3310: 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64  th %*.*s the wid
3320: 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69  th is measured i
3330: 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61  n bytes, not cha
3340: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
3350: 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64  ic void utf8_wid
3360: 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70  th_print(FILE *p
3370: 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73  Out, int w, cons
3380: 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20  t char *zUtf){. 
3390: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
33a0: 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20  .  int aw = w<0 
33b0: 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72  ? -w : w;.  char
33c0: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69   zBuf[1000];.  i
33d0: 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f  f( aw>(int)sizeo
33e0: 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d  f(zBuf)/3 ) aw =
33f0: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75   (int)sizeof(zBu
3400: 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  f)/3;.  for(i=n=
3410: 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29  0; zUtf[i]; i++)
3420: 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b  {.    if( (zUtf[
3430: 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29  i]&0xc0)!=0x80 )
3440: 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  {.      n++;.   
3450: 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a     if( n==aw ){.
3460: 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b          do{ i++;
3470: 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69   }while( (zUtf[i
3480: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b  ]&0xc0)==0x80 );
3490: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
34a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34b0: 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b  }.  if( n>=aw ){
34c0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
34d0: 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  (pOut, "%.*s", i
34e0: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
34f0: 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20   if( w<0 ){.    
3500: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3510: 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c  , "%*s%s", aw-n,
3520: 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65   "", zUtf);.  }e
3530: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
3540: 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a  intf(pOut, "%s%*
3550: 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20  s", zUtf, aw-n, 
3560: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  "");.  }.}.../*.
3570: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66  ** Determines if
3580: 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e   a string is a n
3590: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f  umber of not..*/
35a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
35b0: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
35c0: 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d  *z, int *realnum
35d0: 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  ){.  if( *z=='-'
35e0: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b   || *z=='+' ) z+
35f0: 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69  +;.  if( !IsDigi
3600: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74  t(*z) ){.    ret
3610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b  urn 0;.  }.  z++
3620: 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20  ;.  if( realnum 
3630: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a  ) *realnum = 0;.
3640: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
3650: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
3660: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
3670: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3680: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
3690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
36a0: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
36b0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
36c0: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
36d0: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
36e0: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
36f0: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3700: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3710: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
3720: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
3730: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
3740: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
3750: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
3760: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
3770: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3780: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
3790: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
37a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
37b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
37c0: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
37d0: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
37e0: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
37f0: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
3800: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3810: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3820: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
3830: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
3840: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
3850: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
3860: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
3870: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
3880: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
3890: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38a0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
38b0: 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72  ing in character
38c0: 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54  s.  Multibyte UT
38d0: 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  F8 characters.**
38e0: 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67   count as a sing
38f0: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
3900: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3910: 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  enChar(const cha
3920: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
3930: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
3940: 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30  ){.    if( (0xc0
3950: 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29  &*(z++))!=0x80 )
3960: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
3970: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
3980: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
3990: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
39a0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
39b0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
39c0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
39d0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
39e0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
39f0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3a00: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
3a10: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
3a20: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
3a30: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
3a40: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69  ls..**.** If zLi
3a50: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ne is not NULL t
3a60: 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c  hen it is a mall
3a70: 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75  oced buffer retu
3a80: 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  rned from.** a p
3a90: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
3aa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61  this routine tha
3ab0: 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e  t may be reused.
3ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3ad0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
3ae0: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45  har *zLine, FILE
3af0: 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *in){.  int nLi
3b00: 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20  ne = zLine==0 ? 
3b10: 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e  0 : 100;.  int n
3b20: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
3b30: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
3b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
3b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
3b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
3b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
3b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3ba0: 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
3bb0: 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
3bc0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
3bd0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
3be0: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
3bf0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
3c00: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
3c10: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
3c20: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3c30: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
3c40: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
3c60: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b   zLine[n] ) n++;
3c70: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
3c80: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
3c90: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
3ca0: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
3cb0: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27  zLine[n-1]=='\r'
3cc0: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c   ) n--;.      zL
3cd0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
3ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3cf0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
3d00: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
3d10: 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f  d(WIN32).  /* Fo
3d20: 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  r interactive in
3d30: 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  put on Windows s
3d40: 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74  ystems, translat
3d50: 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69  e the.  ** multi
3d60: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73  -byte characters
3d70: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  et characters in
3d80: 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69  to UTF-8. */.  i
3d90: 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
3da0: 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73  ractive && in==s
3db0: 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  tdin ){.    char
3dc0: 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   *zTrans = sqlit
3dd0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
3de0: 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20  _utf8_v2(zLine, 
3df0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61  0);.    if( zTra
3e00: 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ns ){.      int 
3e10: 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33  nTrans = strlen3
3e20: 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20  0(zTrans)+1;.   
3e30: 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c     if( nTrans>nL
3e40: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ine ){.        z
3e50: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3e60: 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  Line, nTrans);. 
3e70: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
3e80: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
3e90: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
3ea0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
3eb0: 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73 2c  y(zLine, zTrans,
3ec0: 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20   nTrans);.      
3ed0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72  sqlite3_free(zTr
3ee0: 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ans);.    }.  }.
3ef0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
3f00: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
3f10: 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a 20  ined(WIN32) */. 
3f20: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
3f30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
3f40: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
3f50: 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a  f input text..**
3f60: 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68 65  .** If in==0 the
3f70: 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e  n read from stan
3f80: 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20 70  dard input and p
3f90: 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61 63  rompt before eac
3fa0: 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69 73  h line..** If is
3fb0: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20  Continuation is 
3fc0: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f 6e  true, then a con
3fd0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
3fe0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
3ff0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
4000: 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20 74  ation is zero, t
4010: 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  hen the main pro
4020: 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  mpt should be us
4030: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50 72  ed..**.** If zPr
4040: 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ior is not NULL 
4050: 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75 66  then it is a buf
4060: 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  fer from a prior
4070: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a   call to this.**
4080: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 61   routine that ca
4090: 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a 0a  n be reused..**.
40a0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
40b0: 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65   stored in space
40c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
40d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
40e0: 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66 72   either.** be fr
40f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4100: 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65 64  r or else passed
4110: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73 20   back into this 
4120: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65 0a  routine via the.
4130: 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d 65  ** zPrior argume
4140: 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  nt for reuse..*/
4150: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e  .static char *on
4160: 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49 4c  e_input_line(FIL
4170: 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50 72  E *in, char *zPr
4180: 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74 69  ior, int isConti
4190: 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61 72  nuation){.  char
41a0: 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61   *zPrompt;.  cha
41b0: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66  r *zResult;.  if
41c0: 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 7a  ( in!=0 ){.    z
41d0: 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67  Result = local_g
41e0: 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 69  etline(zPrior, i
41f0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
4200: 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f 6e   zPrompt = isCon
4210: 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e 74  tinuation ? cont
4220: 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61 69  inuePrompt : mai
4230: 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48 45  nPrompt;.#if SHE
4240: 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54  LL_USE_LOCAL_GET
4250: 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66 28  LINE.    printf(
4260: 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a  "%s", zPrompt);.
4270: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
4280: 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  t);.    zResult 
4290: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
42a0: 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a  zPrior, stdin);.
42b0: 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28 7a  #else.    free(z
42c0: 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65 73  Prior);.    zRes
42d0: 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61 64  ult = shell_read
42e0: 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 20  line(zPrompt);. 
42f0: 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26     if( zResult &
4300: 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68 65  & *zResult ) she
4310: 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 7a  ll_add_history(z
4320: 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a  Result);.#endif.
4330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
4340: 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
4350: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4360: 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d 61   of a hexadecima
4370: 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e  l digit.  Return
4380: 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75 74   -1 if the input
4390: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78  .** is not a hex
43a0: 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   digit..*/.stati
43b0: 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56 61  c int hexDigitVa
43c0: 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69  lue(char c){.  i
43d0: 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
43e0: 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  '9' ) return c -
43f0: 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27   '0';.  if( c>='
4400: 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72  a' && c<='f' ) r
4410: 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20  eturn c - 'a' + 
4420: 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27  10;.  if( c>='A'
4430: 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74   && c<='F' ) ret
4440: 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30  urn c - 'A' + 10
4450: 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
4460: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
4470: 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74  t zArg as an int
4480: 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73  eger value, poss
4490: 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69 78  ibly with suffix
44a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  es..*/.static sq
44b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 65  lite3_int64 inte
44c0: 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  gerValue(const c
44d0: 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71  har *zArg){.  sq
44e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20  lite3_int64 v = 
44f0: 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
4500: 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72 20  t struct { char 
4510: 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d  *zSuffix; int iM
4520: 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d  ult; } aMult[] =
4530: 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20   {.    { "KiB", 
4540: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1024 },.    { "M
4550: 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d  iB", 1024*1024 }
4560: 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31  ,.    { "GiB", 1
4570: 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c  024*1024*1024 },
4580: 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30  .    { "KB",  10
4590: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22  00 },.    { "MB"
45a0: 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20  ,  1000000 },.  
45b0: 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30    { "GB",  10000
45c0: 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
45d0: 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20  K",   1000 },.  
45e0: 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30    { "M",   10000
45f0: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c  00 },.    { "G",
4600: 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c     1000000000 },
4610: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
4620: 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a   int isNeg = 0;.
4630: 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
4640: 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20  -' ){.    isNeg 
4650: 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b  = 1;.    zArg++;
4660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72  .  }else if( zAr
4670: 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20  g[0]=='+' ){.   
4680: 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69   zArg++;.  }.  i
4690: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
46a0: 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
46b0: 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  ){.    int x;.  
46c0: 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20    zArg += 2;.   
46d0: 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78   while( (x = hex
46e0: 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
46f0: 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  0]))>=0 ){.     
4700: 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b   v = (v<<4) + x;
4710: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  .      zArg++;. 
4720: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4730: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
4740: 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20  (zArg[0]) ){.   
4750: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41     v = v*10 + zA
4760: 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20  rg[0] - '0';.   
4770: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d     zArg++;.    }
4780: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4790: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75 6c  i<ArraySize(aMul
47a0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t); i++){.    if
47b0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
47c0: 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66  p(aMult[i].zSuff
47d0: 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a  ix, zArg)==0 ){.
47e0: 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74        v *= aMult
47f0: 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20  [i].iMult;.     
4800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4810: 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65 67  }.  return isNeg
4820: 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a  ? -v : v;.}../*.
4830: 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c 65  ** A variable le
4840: 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20 77  ngth string to w
4850: 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70 70  hich one can app
4860: 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79 70  end text..*/.typ
4870: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
4880: 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74 3b  lText ShellText;
4890: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65 78  .struct ShellTex
48a0: 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  t {.  char *z;. 
48b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 41   int n;.  int nA
48c0: 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lloc;.};../*.** 
48d0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
48e0: 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54 65  estroy a ShellTe
48f0: 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  xt object.*/.sta
4900: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65 78  tic void initTex
4910: 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29 7b  t(ShellText *p){
4920: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
4930: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73  sizeof(*p));.}.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
4950: 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70  ext(ShellText *p
4960: 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29 3b  ){.  free(p->z);
4970: 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b 0a  .  initText(p);.
4980: 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74  }../* zIn is eit
4990: 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  her a pointer to
49a0: 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74   a NULL-terminat
49b0: 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  ed string in mem
49c0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ory obtained.** 
49d0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f  from malloc(), o
49e0: 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  r a NULL pointer
49f0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69  . The string poi
4a00: 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65  nted to by zAppe
4a10: 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74  nd is.** added t
4a20: 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72  o zIn, and the r
4a30: 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69  esult returned i
4a40: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
4a50: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
4a60: 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77  .** zIn, if it w
4a70: 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20  as not NULL, is 
4a80: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
4a90: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
4aa0: 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f  nt, quote, is no
4ab0: 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20  t '\0', then it 
4ac0: 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  is used as a.** 
4ad0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
4ae0: 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a  for zAppend..*/.
4af0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65  static void appe
4b00: 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  ndText(ShellText
4b10: 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20   *p, char const 
4b20: 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71  *zAppend, char q
4b30: 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  uote){.  int len
4b40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4b50: 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65   nAppend = strle
4b60: 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a 20  n30(zAppend);.. 
4b70: 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 70   len = nAppend+p
4b80: 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  ->n+1;.  if( quo
4b90: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
4ba0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
4bb0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
4bc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
4bd0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
4be0: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
4bf0: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65 6e  ..  if( p->n+len
4c00: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
4c10: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70     p->nAlloc = p
4c20: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65 6e  ->nAlloc*2 + len
4c30: 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a 20   + 20;.    p->z 
4c40: 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  = realloc(p->z, 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
4c60: 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
4c70: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
4c80: 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y();.  }..  if( 
4c90: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61  quote ){.    cha
4ca0: 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70  r *zCsr = p->z+p
4cb0: 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b  ->n;.    *zCsr++
4cc0: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f   = quote;.    fo
4cd0: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a  ; i++){.      *z
4cf0: 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b  Csr++ = zAppend[
4d00: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  i];.      if( zA
4d10: 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20  ppend[i]==quote 
4d20: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74  ) *zCsr++ = quot
4d30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  e;.    }.    *zC
4d40: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
4d50: 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a    p->n = (int)(z
4d60: 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20  Csr - p->z);.   
4d70: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
4d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
4d90: 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41  py(p->z+p->n, zA
4da0: 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b  ppend, nAppend);
4db0: 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70  .    p->n += nAp
4dc0: 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70  pend;.    p->z[p
4dd0: 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  ->n] = '\0';.  }
4de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
4df0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
4e00: 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e 61  f identifier zNa
4e10: 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 71  me needs to be q
4e20: 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a  uoted, either.**
4e30: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74   because it cont
4e40: 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75  ains non-alphanu
4e50: 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73  meric characters
4e60: 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  , or because it 
4e70: 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  is an.** SQLite 
4e80: 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e  keyword.  Be con
4e90: 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68 69  servative in thi
4ea0: 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68 65  s estimate:  Whe
4eb0: 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75 6d  n in doubt assum
4ec0: 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69 6e  e.** that quotin
4ed0: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  g is required..*
4ee0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27 20  *.** Return '"' 
4ef0: 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65  if quoting is re
4f00: 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e 20  quired.  Return 
4f10: 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20  0 if no quoting 
4f20: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
4f30: 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f 74  static char quot
4f40: 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72  eChar(const char
4f50: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4f60: 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68  i;.  if( !isalph
4f70: 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  a((unsigned char
4f80: 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e  )zName[0]) && zN
4f90: 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65  ame[0]!='_' ) re
4fa0: 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28  turn '"';.  for(
4fb0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
4fc0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
4fd0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
4fe0: 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26  char)zName[i]) &
4ff0: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  & zName[i]!='_' 
5000: 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20  ) return '"';.  
5010: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
5020: 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63 6b  e3_keyword_check
5030: 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22 27  (zName, i) ? '"'
5040: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   : 0;.}../*.** C
5050: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
5060: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
5070: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5080: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5090: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
50a0: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
50b0: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
50c0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
50d0: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
50e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
50f0: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5100: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5120: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5130: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
5140: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
5150: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
5160: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
5170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5180: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5190: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
51a0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
51b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
51c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
51d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
51e0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
51f0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5200: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5210: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
5220: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
5230: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
5240: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
5250: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
5260: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
5270: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
52a0: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
52b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
52c0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
52d0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
52e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
52f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5300: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5310: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
5320: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5330: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
5340: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5350: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5360: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
5370: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5380: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5390: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
53a0: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
53b0: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
53c0: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
53d0: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
53e0: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
53f0: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5400: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5410: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
5420: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
5430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5440: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
5450: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
5460: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
5470: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5480: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5490: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
54a0: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
54b0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
54c0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
54d0: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
54e0: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
54f0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5500: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5510: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5520: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5530: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5540: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5550: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5560: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5570: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5580: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5590: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
55a0: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
55b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
55c0: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
55d0: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
55e0: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
55f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5600: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5610: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5620: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5630: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5640: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5660: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5670: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5680: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5690: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
56a0: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
56b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
56d0: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 55  , 0, zName);.  U
56e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
56f0: 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46 61  nVal);.  if( zFa
5700: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5710: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5720: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5730: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5740: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5770: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
5780: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5790: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
57a0: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
57b0: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
57c0: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
57d0: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
57e0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
57f0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5800: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5810: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5820: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5830: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5840: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5850: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5860: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5870: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5880: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5890: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
58a0: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
58b0: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
58c0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
58d0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
58e0: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
58f0: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5900: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5910: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5920: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5930: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5940: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5950: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5960: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5970: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
5980: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
5990: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
59a0: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
59b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
59c0: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
59d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
59e0: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
59f0: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5a00: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5a10: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5a20: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5a30: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5a40: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5a50: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5a60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5a70: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
5a80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5a90: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
5aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
5ab0: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
5ac0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ad0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
5ae0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5af0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
5b00: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b10: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
5b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
5b30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
5b40: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
5b50: 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  x);.  UNUSED_PAR
5b60: 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20  AMETER(nVal);.  
5b70: 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74  if( zIn!=0 && st
5b80: 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41  rncmp(zIn, "CREA
5b90: 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  TE ", 7)==0 ){. 
5ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
5bb0: 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66  nt)(sizeof(aPref
5bc0: 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66  ix)/sizeof(aPref
5bd0: 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  ix[0])); i++){. 
5be0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
5bf0: 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d  len30(aPrefix[i]
5c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
5c10: 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65  ncmp(zIn+7, aPre
5c20: 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26  fix[i], n)==0 &&
5c30: 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29   zIn[n+7]==' ' )
5c40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
5c50: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  z = 0;.        c
5c60: 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a  har *zFake = 0;.
5c70: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
5c80: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
5c90: 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20 71   char cQuote = q
5ca0: 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61  uoteChar(zSchema
5cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5cc0: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
5cd0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
5ce0: 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29 7b  ma,"temp")!=0 ){
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d00: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d10: 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73  ("%.*s \"%w\".%s
5d20: 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63  ", n+7, zIn, zSc
5d30: 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a  hema, zIn+n+8);.
5d40: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d70: 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20 6e  ("%.*s %s.%s", n
5d80: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
5d90: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
5da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5db0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
5dc0: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ame.         && 
5dd0: 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27  aPrefix[i][0]=='
5de0: 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  V'.         && (
5df0: 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b  zFake = shellFak
5e00: 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68  eSchema(db, zSch
5e10: 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 0a  ema, zName))!=0.
5e20: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
5e30: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
5e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5e50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5e60: 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c  ("%s\n/* %s */",
5e70: 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20 20   zIn, zFake);.  
5e80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5e90: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73             z = s
5ea0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5eb0: 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a  %z\n/* %s */", z
5ec0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
5ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5ee0: 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20 20  free(zFake);.   
5ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5f00: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
5f10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f20: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
5f30: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
5f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5f50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
5f60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5f70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f80: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
5f90: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
5fa0: 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   The source code
5fb0: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e   for several run
5fc0: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
5fd0: 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73  xtensions is ins
5fe0: 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62  erted.** below b
5ff0: 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b  y the ../tool/mk
6000: 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70  shellc.tcl scrip
6010: 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65  t.  Before proce
6020: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75  ssing that inclu
6030: 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20  ded.** code, we 
6040: 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65  need to override
6050: 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20   some macros to 
6060: 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65  make the include
6070: 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a  d program code.*
6080: 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74  * work here in t
6090: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69  he middle of thi
60a0: 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61  s regular progra
60b0: 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  m..*/.#define SQ
60c0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
60d0: 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c  NIT1.#define SQL
60e0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
60f0: 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58 29  IT2(X) (void)(X)
6100: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
6110: 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65 64  IN32) && defined
6120: 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55  (_MSC_VER).INCLU
6130: 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  DE test_windiren
6140: 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73 74  t.h.INCLUDE test
6150: 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64 65  _windirent.c.#de
6160: 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45  fine dirent DIRE
6170: 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44  NT.#endif.INCLUD
6180: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68  E ../ext/misc/sh
6190: 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45  athree.c.INCLUDE
61a0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c   ../ext/misc/fil
61b0: 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e  eio.c.INCLUDE ..
61c0: 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65  /ext/misc/comple
61d0: 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  tion.c.INCLUDE .
61e0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65 6e  ./ext/misc/appen
61f0: 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53 51  dvfs.c.#ifdef SQ
6200: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6210: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6220: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6230: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6240: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
6250: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
6260: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
6270: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
6280: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6290: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
62b0: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
62c0: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
62d0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
62e0: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
62f0: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6300: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6310: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6320: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6330: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6350: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
6360: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
6370: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63a0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
63b0: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
63c0: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
63e0: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
63f0: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6400: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6410: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6420: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6430: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
6450: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
6460: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
6470: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
6480: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
6490: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64a0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
64b0: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
64c0: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
64d0: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
64e0: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
64f0: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6500: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6510: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6520: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6530: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6540: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
6550: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
6560: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6570: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6580: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
6590: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65a0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
65b0: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
65c0: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
65d0: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
65e0: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
65f0: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6600: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6610: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6620: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6630: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6640: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
6650: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
6660: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
6670: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
6680: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
6690: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66a0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
66b0: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
66c0: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
66d0: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
66e0: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
66f0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6700: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6710: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6720: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6730: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6740: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
6750: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
6760: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
6770: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
6780: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
6790: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67a0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
67b0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
67c0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
67d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
67e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
67f0: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6800: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6810: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6820: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6830: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6840: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
6850: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
6860: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
6870: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
6880: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
6890: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68a0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
68b0: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
68c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
68d0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
68e0: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
68f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6900: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6910: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6930: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6940: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
6950: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
6960: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
6970: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
6980: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
6990: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69a0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
69b0: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
69c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
69d0: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
69e0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
69f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a00: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a10: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a20: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a30: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a40: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6a50: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6a60: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 73 74   mode */.  u8 st
6a70: 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20  atsOn;          
6a80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73    /* True to dis
6a90: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
6aa0: 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69  s before each fi
6ab0: 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 73  nalize */.  u8 s
6ac0: 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20 20  canstatsOn;     
6ad0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69     /* True to di
6ae0: 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
6af0: 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e   before each fin
6b00: 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6f 70  alize */.  u8 op
6b10: 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
6b20: 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f    /* SHELL_OPEN_
6b30: 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45 4e 44 56  NORMAL, _APPENDV
6b40: 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49 4c 45 20  FS, or _ZIPFILE 
6b50: 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67 4f 70 65  */.  u8 doXdgOpe
6b60: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  n;          /* I
6b70: 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f 70 65 6e  nvoke start/open
6b80: 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20 6f 75 74  /xdg-open in out
6b90: 70 75 74 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20  put_reset() */. 
6ba0: 20 75 38 20 6e 45 71 70 4c 65 76 65 6c 3b 20 20   u8 nEqpLevel;  
6bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68          /* Depth
6bc0: 20 6f 66 20 74 68 65 20 45 51 50 20 6f 75 74 70   of the EQP outp
6bd0: 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 75 6e  ut graph */.  un
6be0: 73 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73  signed mEqpLines
6bf0: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6c00: 76 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20  veritical lines 
6c10: 69 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75  in the EQP outpu
6c20: 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74  t graph */.  int
6c30: 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20   outCount;      
6c40: 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f      /* Revert to
6c50: 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61   stdout when rea
6c60: 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20  ching zero */.  
6c70: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6c80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6c90: 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70   of records disp
6ca0: 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  layed so far */.
6cb0: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6cd0: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6ce0: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6cf0: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6d00: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6d10: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6d20: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d40: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6d50: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6d70: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6d80: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6d90: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6da0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6db0: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6dd0: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6de0: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6df0: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6e00: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6e10: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6e20: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6e30: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6e40: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6e50: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6e60: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6e70: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6e80: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6e90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ea0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
6eb0: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
6ec0: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
6ed0: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
6ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6ef0: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
6f00: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
6f10: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
6f20: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
6f30: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20  flags */.  char 
6f40: 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20  *zDestTable;    
6f50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73    /* Name of des
6f60: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77  tination table w
6f70: 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  hen MODE_Insert 
6f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6f90: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
6fa0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 74 68  emporary file th
6fb0: 61 74 20 6d 69 67 68 74 20 6e 65 65 64 20 64 65  at might need de
6fc0: 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  leting */.  char
6fd0: 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20   zTestcase[30]; 
6fe0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75     /* Name of cu
6ff0: 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65 20  rrent test case 
7000: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
7010: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43  arator[20]; /* C
7020: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
7030: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73 65  character for se
7040: 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20  veral modes */. 
7050: 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61 74   char rowSeparat
7060: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73  or[20]; /* Row s
7070: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
7080: 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69  er for MODE_Asci
7090: 69 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53  i */.  char colS
70a0: 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a  epPrior[20];  /*
70b0: 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65   Saved column se
70c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61  parator */.  cha
70d0: 72 20 72 6f 77 53 65 70 50 72 69 6f 72 5b 32 30  r rowSepPrior[20
70e0: 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20 72 6f 77  ];  /* Saved row
70f0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
7100: 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30  int colWidth[100
7110: 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73  ];     /* Reques
7120: 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63  ted width of eac
7130: 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e  h column when in
7140: 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20   column mode*/. 
7150: 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68   int actualWidth
7160: 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61  [100];  /* Actua
7170: 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20  l width of each 
7180: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
7190: 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20   nullValue[20]; 
71a0: 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74     /* The text t
71b0: 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e  o print when a N
71c0: 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
71d0: 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rom.            
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
71f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7200: 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46    char outfile[F
7210: 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a  ILENAME_MAX]; /*
7220: 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f   Filename for *o
7230: 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ut */.  const ch
7240: 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b  ar *zDbFilename;
7250: 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
7260: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7270: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65   */.  char *zFre
7280: 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20  eOnClose;       
7290: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f    /* Filename to
72a0: 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69   free when closi
72b0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
72c0: 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20  ar *zVfs;       
72d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
72e0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73  FS to use */.  s
72f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
7300: 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  mt;   /* Current
7310: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e   statement if an
7320: 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c  y. */.  FILE *pL
7330: 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  og;            /
7340: 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70  * Write log outp
7350: 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ut here */.  int
7360: 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20   *aiIndent;     
7370: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7380: 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20  indents used in 
7390: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a  MODE_Explain */.
73a0: 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20    int nIndent;  
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
73c0: 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64 65   of array aiInde
73d0: 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt[] */.  int iI
73e0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  ndent;          
73f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
7400: 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64  rent op in aiInd
7410: 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72  ent[] */.  EQPGr
7420: 61 70 68 20 73 47 72 61 70 68 3b 20 20 20 20 20  aph sGraph;     
7430: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
7440: 20 66 6f 72 20 74 68 65 20 67 72 61 70 68 69 63   for the graphic
7450: 61 6c 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  al EXPLAIN QUERY
7460: 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66   PLAN */.#if def
7470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7480: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e  LE_SESSION).  in
7490: 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20  t nSession;     
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
74b0: 72 20 6f 66 20 61 63 74 69 76 65 20 73 65 73 73  r of active sess
74c0: 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65  ions */.  OpenSe
74d0: 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34  ssion aSession[4
74e0: 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ];  /* Array of 
74f0: 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69  sessions.  [0] i
7500: 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23  s in focus. */.#
7510: 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74 49 6e  endif.  ExpertIn
7520: 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20 20 20  fo expert;      
7530: 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20 70 72    /* Valid if pr
7540: 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77  evious command w
7550: 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50 54 2e  as ".expert OPT.
7560: 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41  .." */.};.../* A
7570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7580: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 75 74  r ShellState.aut
7590: 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  oEQP.*/.#define 
75a0: 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20 20 20  AUTOEQP_off     
75b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0           /* 
75c0: 41 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49  Automatic EXPLAI
75d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 73 20  N QUERY PLAN is 
75e0: 6f 66 66 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41  off */.#define A
75f0: 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20  UTOEQP_on       
7600: 31 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1           /* A
7610: 75 74 6f 6d 61 74 69 63 20 45 51 50 20 69 73 20  utomatic EQP is 
7620: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55  on */.#define AU
7630: 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 20 32  TOEQP_trigger  2
7640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7650: 20 61 6e 64 20 61 6c 73 6f 20 73 68 6f 77 20 70   and also show p
7660: 6c 61 6e 73 20 66 6f 72 20 74 72 69 67 67 65 72  lans for trigger
7670: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  s */.#define AUT
7680: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 20  OEQP_full     3 
7690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f            /* Sho
76a0: 77 20 66 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a  w full EXPLAIN *
76b0: 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /../* Allowed va
76c0: 6c 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74  lues for ShellSt
76d0: 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a  ate.openMode.*/.
76e0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
76f0: 45 4e 5f 55 4e 53 50 45 43 20 20 20 20 20 20 30  EN_UNSPEC      0
7700: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e        /* No open
7710: 2d 6d 6f 64 65 20 73 70 65 63 69 66 69 65 64 20  -mode specified 
7720: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7730: 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20  _OPEN_NORMAL    
7740: 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d    1      /* Norm
7750: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
7760: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c   */.#define SHEL
7770: 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
7780: 20 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73 65     2      /* Use
7790: 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64   appendvfs */.#d
77a0: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
77b0: 5f 5a 49 50 46 49 4c 45 20 20 20 20 20 33 20 20  _ZIPFILE     3  
77c0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a      /* Use the z
77d0: 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74  ipfile virtual t
77e0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
77f0: 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f  SHELL_OPEN_READO
7800: 4e 4c 59 20 20 20 20 34 20 20 20 20 20 20 2f 2a  NLY    4      /*
7810: 20 4f 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64   Open a normal d
7820: 61 74 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c  atabase read-onl
7830: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  y */.#define SHE
7840: 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c  LL_OPEN_DESERIAL
7850: 49 5a 45 20 35 20 20 20 20 20 20 2f 2a 20 4f 70  IZE 5      /* Op
7860: 65 6e 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  en using sqlite3
7870: 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 2a  _deserialize() *
7880: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  /../*.** These a
7890: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73  re the allowed s
78a0: 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a  hellFlgs values.
78b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
78c0: 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20  _Pagecache      
78d0: 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68  0x00000001 /* Th
78e0: 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70  e --pagecache op
78f0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
7900: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f  #define SHFLG_Lo
7910: 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30  okaside      0x0
7920: 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61  0000002 /* Looka
7930: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
7940: 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  sed */.#define S
7950: 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20  HFLG_Backslash  
7960: 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f      0x00000004 /
7970: 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73  * The --backslas
7980: 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  h option is used
7990: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
79a0: 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20  G_PreserveRowid 
79b0: 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e   0x00000008 /* .
79c0: 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72  dump preserves r
79d0: 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23  owid values */.#
79e0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77  define SHFLG_New
79f0: 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30  lines       0x00
7a00: 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20  000010 /* .dump 
7a10: 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a  --newline flag *
7a20: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7a30: 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30  CountChanges   0
7a40: 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68  x00000020 /* .ch
7a50: 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f  anges setting */
7a60: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45  .#define SHFLG_E
7a70: 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78  cho           0x
7a80: 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68  00000040 /* .ech
7a90: 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74  o or --echo sett
7aa0: 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ing */../*.** Ma
7ab0: 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67  cros for testing
7ac0: 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65   and setting she
7ad0: 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  llFlgs.*/.#defin
7ae0: 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50  e ShellHasFlag(P
7af0: 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68  ,X)    (((P)->sh
7b00: 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d  ellFlgs & (X))!=
7b10: 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  0).#define Shell
7b20: 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20  SetFlag(P,X)    
7b30: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c  ((P)->shellFlgs|
7b40: 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68  =(X)).#define Sh
7b50: 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58  ellClearFlag(P,X
7b60: 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c  )  ((P)->shellFl
7b70: 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a  gs&=(~(X)))../*.
7b80: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
7b90: 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a   allowed modes..
7ba0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7bb0: 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f  Line     0  /* O
7bc0: 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69  ne column per li
7bd0: 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20  ne.  Blank line 
7be0: 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20  between records 
7bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7c00: 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f  Column   1  /* O
7c10: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7c20: 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d  ne in neat colum
7c30: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ns */.#define MO
7c40: 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f  DE_List     2  /
7c50: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
7c60: 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70   line with a sep
7c70: 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e  arator */.#defin
7c80: 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20  e MODE_Semi     
7c90: 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f  3  /* Same as MO
7ca0: 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65  DE_List but appe
7cb0: 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c  nd ";" to each l
7cc0: 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ine */.#define M
7cd0: 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20  ODE_Html     4  
7ce0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58  /* Generate an X
7cf0: 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64  HTML table */.#d
7d00: 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72  efine MODE_Inser
7d10: 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61  t   5  /* Genera
7d20: 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20  te SQL "insert" 
7d30: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64  statements */.#d
7d40: 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65  efine MODE_Quote
7d50: 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20      6  /* Quote 
7d60: 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51  values as for SQ
7d70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  L */.#define MOD
7d80: 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a  E_Tcl      7  /*
7d90: 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43   Generate ANSI-C
7da0: 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65   or TCL quoted e
7db0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  lements */.#defi
7dc0: 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20  ne MODE_Csv     
7dd0: 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72   8  /* Quote str
7de0: 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72  ings, numbers ar
7df0: 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69  e plain */.#defi
7e00: 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  ne MODE_Explain 
7e10: 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45   9  /* Like MODE
7e20: 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20  _Column, but do 
7e30: 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74  not truncate dat
7e40: 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  a */.#define MOD
7e50: 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a  E_Ascii   10  /*
7e60: 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20   Use ASCII unit 
7e70: 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72  and record separ
7e80: 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45  ators (0x1F/0x1E
7e90: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  ) */.#define MOD
7ea0: 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a  E_Pretty  11  /*
7eb0: 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63   Pretty-print sc
7ec0: 68 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65  hemas */.#define
7ed0: 20 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32   MODE_EQP     12
7ee0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58    /* Converts EX
7ef0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
7f00: 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67   output into a g
7f10: 72 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20  raph */..static 
7f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65  const char *mode
7f30: 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c  Descr[] = {.  "l
7f40: 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22  ine",.  "column"
7f50: 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73  ,.  "list",.  "s
7f60: 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a  emi",.  "html",.
7f70: 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71    "insert",.  "q
7f80: 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a  uote",.  "tcl",.
7f90: 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c    "csv",.  "expl
7fa0: 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c  ain",.  "ascii",
7fb0: 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74 22  .  "prettyprint"
7fc0: 2c 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a  ,.  "eqp".};../*
7fd0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7fe0: 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e  e column/row/lin
7ff0: 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65  e separators use
8000: 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  d by the various
8010: 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72  .** import/expor
8020: 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66  t modes..*/.#def
8030: 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20  ine SEP_Column  
8040: 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45    "|".#define SE
8050: 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22  P_Row       "\n"
8060: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62  .#define SEP_Tab
8070: 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66         "\t".#def
8080: 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20  ine SEP_Space   
8090: 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45    " ".#define SE
80a0: 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a  P_Comma     ",".
80b0: 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66  #define SEP_CrLf
80c0: 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65        "\r\n".#de
80d0: 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20  fine SEP_Unit   
80e0: 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e     "\x1F".#defin
80f0: 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20  e SEP_Record    
8100: 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20  "\x1E"../*.** A 
8110: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
8120: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69   sqlite3_log() i
8130: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
8140: 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f  tic void shellLo
8150: 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  g(void *pArg, in
8160: 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73  t iErrCode, cons
8170: 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20  t char *zMsg){. 
8180: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
8190: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
81a0: 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f  rg;.  if( p->pLo
81b0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
81c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
81d0: 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e  pLog, "(%d) %s\n
81e0: 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73  ", iErrCode, zMs
81f0: 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e  g);.  fflush(p->
8200: 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pLog);.}../*.** 
8210: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73  SQL function:  s
8220: 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a  hell_putsnl(X).*
8230: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74  *.** Write the t
8240: 65 78 74 20 58 20 74 6f 20 74 68 65 20 73 63 72  ext X to the scr
8250: 65 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72  een (or whatever
8260: 20 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e 67   output is being
8270: 20 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64   directed).** ad
8280: 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61  ding a newline a
8290: 74 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74  t the end, and t
82a0: 68 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f  hen return X..*/
82b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
82c0: 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71  llPutsFunc(.  sq
82d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
82e0: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  Ctx,.  int nVal,
82f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8300: 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68   **apVal.){.  Sh
8310: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8320: 68 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74  hellState*)sqlit
8330: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
8340: 78 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c  x);.  (void)nVal
8350: 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
8360: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
8370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8380: 78 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20  xt(apVal[0]));. 
8390: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
83a0: 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61  value(pCtx, apVa
83b0: 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l[0]);.}../*.** 
83c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20  SQL function:   
83d0: 65 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20  edit(VALUE).**  
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
83f0: 64 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52  dit(VALUE,EDITOR
8400: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74  ).**.** These st
8410: 65 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  eps:.**.**     (
8420: 31 29 20 57 72 69 74 65 20 56 41 4c 55 45 20 69  1) Write VALUE i
8430: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20  nto a temporary 
8440: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29  file..**     (2)
8450: 20 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49   Run program EDI
8460: 54 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  TOR on that temp
8470: 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20  orary file..**  
8480: 20 20 20 28 33 29 20 52 65 61 64 20 74 68 65 20     (3) Read the 
8490: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62  temporary file b
84a0: 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ack and return i
84b0: 74 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ts content as th
84c0: 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20  e result..**    
84d0: 20 28 34 29 20 44 65 6c 65 74 65 20 74 68 65 20   (4) Delete the 
84e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a  temporary file.*
84f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54  *.** If the EDIT
8500: 4f 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  OR argument is o
8510: 6d 69 74 74 65 64 2c 20 75 73 65 20 74 68 65 20  mitted, use the 
8520: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53  value in the VIS
8530: 55 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65  UAL.** environme
8540: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66  nt variable.  If
8550: 20 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20   still there is 
8560: 6e 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75  no EDITOR, throu
8570: 67 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  gh an error..**.
8580: 2a 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e  ** Also throw an
8590: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 45 44   error if the ED
85a0: 49 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74  ITOR program ret
85b0: 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  urns a non-zero 
85c0: 65 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  exit code..*/.#i
85d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
85e0: 41 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69  AVE_SYSTEM.stati
85f0: 63 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28  c void editFunc(
8600: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8610: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
8620: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8630: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8640: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
8650: 2a 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72  *zEditor;.  char
8660: 20 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b   *zTempFile = 0;
8670: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8680: 20 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30    char *zCmd = 0
8690: 3b 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20  ;.  int bBin;.  
86a0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61  int rc;.  int ha
86b0: 73 43 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c  sCRNL = 0;.  FIL
86c0: 45 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69  E *f = 0;.  sqli
86d0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
86e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
86f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8700: 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20   *p = 0;..  if( 
8710: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
8720: 45 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20  Editor = (const 
8730: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
8740: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
8750: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8760: 7a 45 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76  zEditor = getenv
8770: 28 22 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a  ("VISUAL");.  }.
8780: 20 20 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30    if( zEditor==0
8790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
87a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
87b0: 74 65 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72  text, "no editor
87c0: 20 66 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31   for edit()", -1
87d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
87e0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
87f0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8800: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
8810: 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
8820: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
8830: 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70  ntext, "NULL inp
8840: 75 74 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d  ut to edit()", -
8850: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
8860: 20 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74    }.  db = sqlit
8870: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
8880: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
8890: 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a   zTempFile = 0;.
88a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
88b0: 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51  ontrol(db, 0, SQ
88c0: 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
88d0: 49 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46  ILENAME, &zTempF
88e0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d  ile);.  if( zTem
88f0: 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
8900: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
8910: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8920: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
8930: 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
8940: 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c   zTempFile = sql
8950: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65  ite3_mprintf("te
8960: 6d 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20  mp%llx", r);.   
8970: 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d   if( zTempFile==
8980: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8990: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
89a0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
89b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
89c0: 20 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d    }.  }.  bBin =
89d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
89e0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
89f0: 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20  LITE_BLOB;.  /* 
8a00: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  When writing the
8a10: 20 66 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74   file to be edit
8a20: 65 64 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c  ed, do \n to \r\
8a30: 6e 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e  n conversions on
8a40: 20 73 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68   systems.  ** th
8a50: 61 74 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e  at want \r\n lin
8a60: 65 20 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66  e endings */.  f
8a70: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
8a80: 6c 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20  le, bBin ? "wb" 
8a90: 3a 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d  : "w");.  if( f=
8aa0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8ab0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8ac0: 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20  ontext, "edit() 
8ad0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70  cannot open temp
8ae0: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8af0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8b00: 65 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20  end;.  }.  sz = 
8b10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8b20: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
8b30: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
8b40: 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74  x = fwrite(sqlit
8b50: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
8b60: 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66  gv[0]), 1, sz, f
8b70: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
8b90: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
8ba0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8bb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a  argv[0]);.    /*
8bc0: 20 52 65 6d 65 6d 62 65 72 20 77 68 65 74 68 65   Remember whethe
8bd0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76 61 6c  r or not the val
8be0: 75 65 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  ue originally co
8bf0: 6e 74 61 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a  ntained \r\n */.
8c00: 20 20 20 20 69 66 28 20 7a 20 26 26 20 73 74 72      if( z && str
8c10: 73 74 72 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30  str(z,"\r\n")!=0
8c20: 20 29 20 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a   ) hasCRNL = 1;.
8c30: 20 20 20 20 78 20 3d 20 66 77 72 69 74 65 28 73      x = fwrite(s
8c40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8c50: 74 28 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73  t(argv[0]), 1, s
8c60: 7a 2c 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  z, f);.  }.  fcl
8c70: 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b  ose(f);.  f = 0;
8c80: 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a  .  if( x!=sz ){.
8c90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8ca0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8cb0: 2c 20 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20  , "edit() could 
8cc0: 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 77 68  not write the wh
8cd0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
8ce0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8cf0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43  nc_end;.  }.  zC
8d00: 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
8d10: 69 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22  intf("%s \"%s\""
8d20: 2c 20 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70  , zEditor, zTemp
8d30: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d  File);.  if( zCm
8d40: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
8d50: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8d60: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8d70: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8d80: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72  unc_end;.  }.  r
8d90: 63 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29  c = system(zCmd)
8da0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8db0: 28 7a 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63  (zCmd);.  if( rc
8dc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8dd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8de0: 74 65 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65  text, "EDITOR re
8df0: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22  turned non-zero"
8e00: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
8e10: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
8e20: 20 7d 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a   }.  f = fopen(z
8e30: 54 65 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b  TempFile, "rb");
8e40: 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20  .  if( f==0 ){. 
8e50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8e60: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8e70: 0a 20 20 20 20 20 20 22 65 64 69 74 28 29 20 63  .      "edit() c
8e80: 61 6e 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d  annot reopen tem
8e90: 70 20 66 69 6c 65 20 61 66 74 65 72 20 65 64 69  p file after edi
8ea0: 74 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  t", -1);.    got
8eb0: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8ec0: 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20  .  }.  fseek(f, 
8ed0: 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  0, SEEK_END);.  
8ee0: 73 7a 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20  sz = ftell(f);. 
8ef0: 20 72 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20   rewind(f);.  p 
8f00: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8f10: 36 34 28 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29  64( sz+(bBin==0)
8f20: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
8f30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8f40: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8f50: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
8f60: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
8f70: 64 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 66 72 65  d;.  }.  x = fre
8f80: 61 64 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  ad(p, 1, sz, f);
8f90: 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20  .  fclose(f);.  
8fa0: 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d  f = 0;.  if( x!=
8fb0: 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sz ){.    sqlite
8fc0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8fd0: 6f 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e  ontext, "could n
8fe0: 6f 74 20 72 65 61 64 20 62 61 63 6b 20 74 68 65  ot read back the
8ff0: 20 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31   whole file", -1
9000: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
9010: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
9020: 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20   if( bBin ){.   
9030: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9040: 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20  blob64(context, 
9050: 70 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66  p, sz, sqlite3_f
9060: 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ree);.  }else{. 
9070: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
9080: 20 69 2c 20 6a 3b 0a 20 20 20 20 69 66 28 20 68   i, j;.    if( h
9090: 61 73 43 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20  asCRNL ){.      
90a0: 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
90b0: 61 6c 20 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e  al contains \r\n
90c0: 20 74 68 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76   then do no conv
90d0: 65 72 73 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  ersions back to 
90e0: 5c 6e 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20  \n */.      j = 
90f0: 73 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sz;.    }else{. 
9100: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
9110: 69 6c 65 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  ile did not orig
9120: 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c  inally contain \
9130: 72 5c 6e 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  r\n then convert
9140: 20 61 6e 79 20 6e 65 77 0a 20 20 20 20 20 20 2a   any new.      *
9150: 2a 20 5c 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f  * \r\n back into
9160: 20 5c 6e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72   \n */.      for
9170: 28 69 3d 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b  (i=j=0; i<sz; i+
9180: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9190: 70 5b 69 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b  p[i]=='\r' && p[
91a0: 69 2b 31 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b  i+1]=='\n' ) i++
91b0: 3b 0a 20 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d  ;.        p[j++]
91c0: 20 3d 20 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = p[i];.      }
91d0: 0a 20 20 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20  .      sz = j;. 
91e0: 20 20 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a       p[sz] = 0;.
91f0: 20 20 20 20 7d 20 0a 20 20 20 20 73 71 6c 69 74      } .    sqlit
9200: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34  e3_result_text64
9210: 28 63 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74  (context, (const
9220: 20 63 68 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20   char*)p, sz,.  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9250: 66 72 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  free, SQLITE_UTF
9260: 38 29 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b  8);.  }.  p = 0;
9270: 0a 0a 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a  ..edit_func_end:
9280: 0a 20 20 69 66 28 20 66 20 29 20 66 63 6c 6f 73  .  if( f ) fclos
9290: 65 28 66 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  e(f);.  unlink(z
92a0: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
92b0: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 46  ite3_free(zTempF
92c0: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
92d0: 66 72 65 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  free(p);.}.#endi
92e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41  f /* SQLITE_NOHA
92f0: 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a  VE_SYSTEM */../*
9300: 0a 2a 2a 20 53 61 76 65 20 6f 72 20 72 65 73 74  .** Save or rest
9310: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
9320: 6f 75 74 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73  output mode.*/.s
9330: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
9340: 74 4d 6f 64 65 50 75 73 68 28 53 68 65 6c 6c 53  tModePush(ShellS
9350: 74 61 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d  tate *p){.  p->m
9360: 6f 64 65 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f  odePrior = p->mo
9370: 64 65 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e  de;.  memcpy(p->
9380: 63 6f 6c 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e  colSepPrior, p->
9390: 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 73 69  colSeparator, si
93a0: 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
93b0: 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79  ator));.  memcpy
93c0: 28 70 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c  (p->rowSepPrior,
93d0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
93e0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  , sizeof(p->rowS
93f0: 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74  eparator));.}.st
9400: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9410: 4d 6f 64 65 50 6f 70 28 53 68 65 6c 6c 53 74 61  ModePop(ShellSta
9420: 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64  te *p){.  p->mod
9430: 65 20 3d 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72  e = p->modePrior
9440: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f  ;.  memcpy(p->co
9450: 6c 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63  lSeparator, p->c
9460: 6f 6c 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65  olSepPrior, size
9470: 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
9480: 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  or));.  memcpy(p
9490: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
94a0: 70 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20  p->rowSepPrior, 
94b0: 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
94c0: 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  arator));.}../*.
94d0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
94e0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
94f0: 68 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62  hex-encoded blob
9500: 20 28 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a   (eg. X'1234' ).
9510: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
9520: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46  utput_hex_blob(F
9530: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
9540: 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  void *pBlob, int
9550: 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69   nBlob){.  int i
9560: 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20  ;.  char *zBlob 
9570: 3d 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b  = (char *)pBlob;
9580: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75  .  raw_printf(ou
9590: 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69  t,"X'");.  for(i
95a0: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
95b0: 29 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75  ){ raw_printf(ou
95c0: 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69  t,"%02x",zBlob[i
95d0: 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77  ]&0xff); }.  raw
95e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  _printf(out,"'")
95f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
9600: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
9610: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68   not found anywh
9620: 65 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74  ere in z[].  Ret
9630: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
9640: 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
9650: 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73  .**.** Try to us
9660: 65 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73  e zA and zB firs
9670: 74 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74  t.  If both of t
9680: 68 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  hose are already
9690: 20 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a   found in z[].**
96a0: 20 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f   then make up so
96b0: 6d 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74  me string and st
96c0: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 62 75  ore it in the bu
96d0: 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
96e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
96f0: 2a 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a  *unused_string(.
9700: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75      /* Result mu
9730: 73 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e  st not appear an
9740: 79 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20  ywhere in z */. 
9750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
9760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c   const char *zB,
9770: 20 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20     /* Try these 
9780: 66 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20  first */.  char 
9790: 2a 7a 42 75 66 20 20 20 20 20 20 20 20 20 20 20  *zBuf           
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97b0: 53 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  Space to store a
97c0: 20 67 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e   generated strin
97d0: 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  g */.){.  unsign
97e0: 65 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20  ed i = 0;.  if( 
97f0: 73 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30  strstr(z, zA)==0
9800: 20 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20   ) return zA;.  
9810: 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42  if( strstr(z, zB
9820: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42  )==0 ) return zB
9830: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ;.  do{.    sqli
9840: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c  te3_snprintf(20,
9850: 7a 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a  zBuf,"(%s%u)", z
9860: 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c  A, i++);.  }whil
9870: 65 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66  e( strstr(z,zBuf
9880: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
9890: 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zBuf;.}../*.** 
98a0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
98b0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
98c0: 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67  ted string using
98d0: 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e   SQL quoting con
98e0: 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ventions..**.** 
98f0: 53 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74  See also: output
9900: 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f  _quoted_escaped_
9910: 73 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74  string().*/.stat
9920: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71  ic void output_q
9930: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c  uoted_string(FIL
9940: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
9950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
9960: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74  .  char c;.  set
9970: 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20  BinaryMode(out, 
9980: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  1);.  for(i=0; (
9990: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
99a0: 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\''; i++){}.
99b0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
99c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
99d0: 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d  t,"'%s'",z);.  }
99e0: 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
99f0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
9a00: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
9a10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9a20: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
9a30: 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d   c!='\''; i++){}
9a40: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
9a50: 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  '' ) i++;.      
9a60: 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20  if( i ){.       
9a70: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
9a80: 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b  , "%.*s", i, z);
9a90: 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b  .        z += i;
9aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9ab0: 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
9ac0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
9ad0: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
9ae0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9b00: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
9b10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9b20: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
9b30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9b40: 75 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20  ut, "'");.  }.  
9b50: 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c  setTextMode(out,
9b60: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75   1);.}../*.** Ou
9b70: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9b80: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
9b90: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
9ba0: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
9bb0: 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74  ntions..** Addit
9bc0: 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70  ionallly , escap
9bd0: 65 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22  e the "\n" and "
9be0: 5c 72 22 20 63 68 61 72 61 63 74 65 72 73 20 73  \r" characters s
9bf0: 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e  o that they do n
9c00: 6f 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70  ot.** get corrup
9c10: 74 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69  ted by end-of-li
9c20: 6e 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66  ne translation f
9c30: 61 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d  acilities in som
9c40: 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73  e operating.** s
9c50: 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
9c60: 69 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75  is is like outpu
9c70: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
9c80: 29 20 62 75 74 20 77 69 74 68 20 74 68 65 20 61  ) but with the a
9c90: 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c  ddition of the \
9ca0: 72 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65  r\n.** escape me
9cb0: 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74  chanism..*/.stat
9cc0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71  ic void output_q
9cd0: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
9ce0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
9cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9d00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
9d10: 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f  c;.  setBinaryMo
9d20: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f  de(out, 1);.  fo
9d30: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  r(i=0; (c = z[i]
9d40: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20  )!=0 && c!='\'' 
9d50: 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21  && c!='\n' && c!
9d60: 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\r'; i++){}.  
9d70: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
9d80: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9d90: 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c  "'%s'",z);.  }el
9da0: 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  se{.    const ch
9db0: 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20  ar *zNL = 0;.   
9dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52   const char *zCR
9dd0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e   = 0;.    int nN
9de0: 4c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  L = 0;.    int n
9df0: 43 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  CR = 0;.    char
9e00: 20 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66   zBuf1[20], zBuf
9e10: 32 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69  2[20];.    for(i
9e20: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
9e30: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
9e40: 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20  '\n' ) nNL++;.  
9e50: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
9e60: 72 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20  r' ) nCR++;.    
9e70: 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b  }.    if( nNL ){
9e80: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
9e90: 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28  f(out, "replace(
9ea0: 22 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20  ");.      zNL = 
9eb0: 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c  unused_string(z,
9ec0: 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c   "\\n", "\\012",
9ed0: 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20   zBuf1);.    }. 
9ee0: 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20     if( nCR ){.  
9ef0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9f00: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
9f10: 0a 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75  .      zCR = unu
9f20: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
9f30: 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42  \r", "\\015", zB
9f40: 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf2);.    }.    
9f50: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9f60: 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  "'");.    while(
9f70: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   *z ){.      for
9f80: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
9f90: 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26  !=0 && c!='\n' &
9fa0: 26 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d  & c!='\r' && c!=
9fb0: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  '\''; i++){}.   
9fc0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29     if( c=='\'' )
9fd0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   i++;.      if( 
9fe0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  i ){.        utf
9ff0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
a000: 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20  .*s", i, z);.   
a010: 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20       z += i;.   
a020: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
a030: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
a040: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a050: 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20  , "'");.        
a060: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a070: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
a090: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
a0a0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
a0b0: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
a0c0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a0d0: 74 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20  t, "%s", zNL);. 
a0e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
a100: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a110: 25 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d  %s", zCR);.    }
a120: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
a130: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69  out, "'");.    i
a140: 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20  f( nCR ){.      
a150: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a160: 22 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29 29  ",'%s',char(13))
a170: 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20  ", zCR);.    }. 
a180: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a190: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a1a0: 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28  ut, ",'%s',char(
a1b0: 31 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20  10))", zNL);.   
a1c0: 20 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74   }.  }.  setText
a1d0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a  Mode(out, 1);.}.
a1e0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
a1f0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
a200: 73 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72  s a quoted accor
a210: 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c  ding to C or TCL
a220: 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a   quoting rules..
a230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
a240: 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46  utput_c_string(F
a250: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
a260: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69  char *z){.  unsi
a270: 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70  gned int c;.  fp
a280: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20  utc('"', out);. 
a290: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a   while( (c = *(z
a2a0: 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  ++))!=0 ){.    i
a2b0: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
a2c0: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
a2d0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  );.      fputc(c
a2e0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a2f0: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
a300: 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27        fputc('\\'
a310: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a320: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20  utc('"', out);. 
a330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a340: 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\t' ){.      fp
a350: 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a  utc('\\', out);.
a360: 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27 2c        fputc('t',
a370: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
a380: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
a390: 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27        fputc('\\'
a3a0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a3b0: 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20  utc('n', out);. 
a3c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a3d0: 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\r' ){.      fp
a3e0: 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a  utc('\\', out);.
a3f0: 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27 2c        fputc('r',
a400: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
a410: 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63 26   if( !isprint(c&
a420: 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72  0xff) ){.      r
a430: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a440: 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29  \\%03o", c&0xff)
a450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a460: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
a480: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d  utc('"', out);.}
a490: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
a4a0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
a4b0: 77 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20  with characters 
a4c0: 74 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c  that are special
a4d0: 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61   to.** HTML esca
a4e0: 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ped..*/.static v
a4f0: 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f  oid output_html_
a500: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
a510: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
a520: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
a530: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
a540: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
a550: 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b     for(i=0;   z[
a560: 69 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  i].            &
a570: 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20  & z[i]!='<'.    
a580: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a590: 3d 27 26 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='&'.           
a5a0: 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20   && z[i]!='>'.  
a5b0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
a5c0: 5d 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20  ]!='\"'.        
a5d0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27      && z[i]!='\'
a5e0: 27 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b  ';.        i++){
a5f0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  }.    if( i>0 ){
a600: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
a610: 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c  tf(out,"%.*s",i,
a620: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
a630: 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20  ( z[i]=='<' ){. 
a640: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a650: 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20  out,"&lt;");.   
a660: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
a670: 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='&' ){.      ra
a680: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61  w_printf(out,"&a
a690: 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mp;");.    }else
a6a0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29   if( z[i]=='>' )
a6b0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a6c0: 74 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a  tf(out,"&gt;");.
a6d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
a6e0: 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20  i]=='\"' ){.    
a6f0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a700: 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20  ,"&quot;");.    
a710: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
a720: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61  '\'' ){.      ra
a730: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23  w_printf(out,"&#
a740: 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  39;");.    }else
a750: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
a760: 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20     }.    z += i 
a770: 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  + 1;.  }.}../*.*
a780: 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e  * If a field con
a790: 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63  tains any charac
a7a0: 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
a7b0: 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c  y a 1 in the fol
a7c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c  lowing.** array,
a7d0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67   then the string
a7e0: 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20   must be quoted 
a7f0: 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74  for CSV..*/.stat
a800: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65  ic const char ne
a810: 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b  edCsvQuote[] = {
a820: 0a 20 20 31 2c 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 20 20 31 2c 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 0a 20 20 31 2c 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 20  1, 1, 1, 1, 1,  
a870: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a880: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c  1, 1, 1,.  1, 0,
a890: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
a8a0: 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  1,   0, 0, 0, 0,
a8b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
a8c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a8d0: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
a8e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a8f0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
a900: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
a910: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a920: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
a930: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
a940: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a950: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
a960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a970: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
a980: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
a990: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a9a0: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
a9b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
a9c0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
a9d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
a9e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a9f0: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
aa00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
aa10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa20: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
aa30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa40: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
aa50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
aa60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aa70: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
aa80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aa90: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
aaa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
aab0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aac0: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
aad0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
aae0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aaf0: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
ab00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ab10: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
ab20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
ab30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ab40: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
ab50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ab60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  .};../*.** Outpu
ab70: 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  t a single term 
ab80: 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c  of CSV.  Actuall
ab90: 79 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  y, p->colSeparat
aba0: 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  or is used for.*
abb0: 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c  * the separator,
abc0: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
abd0: 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61  y not be a comma
abe0: 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20  .  p->nullValue 
abf0: 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76  is.** the null v
ac00: 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61  alue.  Strings a
ac10: 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63  re quoted if nec
ac20: 65 73 73 61 72 79 2e 20 20 54 68 65 20 73 65 70  essary.  The sep
ac30: 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c  arator.** is onl
ac40: 79 20 69 73 73 75 65 64 20 69 66 20 62 53 65 70  y issued if bSep
ac50: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
ac60: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
ac70: 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  csv(ShellState *
ac80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
ac90: 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46  , int bSep){.  F
aca0: 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75  ILE *out = p->ou
acb0: 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  t;.  if( z==0 ){
acc0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
acd0: 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c  (out,"%s",p->nul
ace0: 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65  lValue);.  }else
acf0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ad00: 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c   int nSep = strl
ad10: 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72  en30(p->colSepar
ad20: 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ator);.    for(i
ad30: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ad40: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73        if( needCs
ad50: 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65  vQuote[((unsigne
ad60: 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20  d char*)z)[i]]. 
ad70: 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d          || (z[i]
ad80: 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  ==p->colSeparato
ad90: 72 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20  r[0] &&.        
ada0: 20 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c       (nSep==1 ||
adb0: 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f   memcmp(z, p->co
adc0: 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70  lSeparator, nSep
add0: 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20  )==0)) ){.      
ade0: 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    i = 0;.       
adf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ae00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
ae10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
ae20: 20 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69   *zQuoted = sqli
ae30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
ae40: 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  w\"", z);.      
ae50: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
ae60: 20 22 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b   "%s", zQuoted);
ae70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ae80: 72 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20  ree(zQuoted);.  
ae90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
aea0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
aeb0: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  "%s", z);.    }.
aec0: 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29    }.  if( bSep )
aed0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
aee0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
aef0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
af00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
af10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
af20: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 70   when the user p
af30: 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f  resses Ctrl-C.*/
af40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74  .static void int
af50: 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69  errupt_handler(i
af60: 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  nt NotUsed){.  U
af70: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
af80: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e  NotUsed);.  seen
af90: 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69  Interrupt++;.  i
afa0: 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  f( seenInterrupt
afb0: 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20  >2 ) exit(1);.  
afc0: 69 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73  if( globalDb ) s
afd0: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
afe0: 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23  (globalDb);.}..#
aff0: 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e  if (defined(_WIN
b000: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
b010: 49 4e 33 32 29 29 20 26 26 20 21 64 65 66 69 6e  IN32)) && !defin
b020: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f  ed(_WIN32_WCE)./
b030: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b040: 65 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f  e runs for conso
b050: 6c 65 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20  le events (e.g. 
b060: 43 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32  Ctrl-C) on Win32
b070: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
b080: 57 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74  WINAPI ConsoleCt
b090: 72 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f  rlHandler(.  DWO
b0a0: 52 44 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a  RD dwCtrlType /*
b0b0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c   One of the CTRL
b0c0: 5f 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e  _*_EVENT constan
b0d0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64  ts */.){.  if( d
b0e0: 77 43 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f  wCtrlType==CTRL_
b0f0: 43 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69  C_EVENT ){.    i
b100: 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72  nterrupt_handler
b110: 28 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (0);.    return 
b120: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TRUE;.  }.  retu
b130: 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64  rn FALSE;.}.#end
b140: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
b150: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
b160: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ATION./*.** When
b170: 20 74 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20   the ".auth ON" 
b180: 69 73 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c  is set, the foll
b190: 6f 77 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72  owing authorizer
b1a0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20   callback is.** 
b1b0: 69 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77  invoked.  It alw
b1c0: 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
b1d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
b1e0: 20 69 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a   int shellAuth(.
b1f0: 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
b200: 61 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20  ata,.  int op,. 
b210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31   const char *zA1
b220: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b230: 7a 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA2,.  const cha
b240: 72 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20  r *zA3,.  const 
b250: 63 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53  char *zA4.){.  S
b260: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
b270: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69  ShellState*)pCli
b280: 65 6e 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69  entData;.  stati
b290: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
b2a0: 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a  Action[] = { 0,.
b2b0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44       "CREATE_IND
b2c0: 45 58 22 2c 20 20 20 20 20 20 20 20 20 22 43 52  EX",         "CR
b2d0: 45 41 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20  EATE_TABLE",    
b2e0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d       "CREATE_TEM
b2f0: 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22  P_INDEX",.     "
b300: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
b310: 45 22 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54  E",    "CREATE_T
b320: 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22  EMP_TRIGGER",  "
b330: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
b340: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
b350: 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
b360: 22 43 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20  "CREATE_VIEW",  
b370: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 22          "DELETE"
b380: 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44  ,.     "DROP_IND
b390: 45 58 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  EX",           "
b3a0: 44 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  DROP_TABLE",    
b3b0: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d         "DROP_TEM
b3c0: 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22  P_INDEX",.     "
b3d0: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22  DROP_TEMP_TABLE"
b3e0: 2c 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d  ,      "DROP_TEM
b3f0: 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 22  P_TRIGGER",    "
b400: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c  DROP_TEMP_VIEW",
b410: 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47  .     "DROP_TRIG
b420: 47 45 52 22 2c 20 20 20 20 20 20 20 20 20 22 44  GER",         "D
b430: 52 4f 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20  ROP_VIEW",      
b440: 20 20 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a        "INSERT",.
b450: 20 20 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20       "PRAGMA",  
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45               "RE
b470: 41 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  AD",            
b480: 20 20 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20       "SELECT",. 
b490: 20 20 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e      "TRANSACTION
b4a0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 55 50 44  ",          "UPD
b4b0: 41 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  ATE",           
b4c0: 20 20 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20      "ATTACH",.  
b4d0: 20 20 20 22 44 45 54 41 43 48 22 2c 20 20 20 20     "DETACH",    
b4e0: 20 20 20 20 20 20 20 20 20 20 20 22 41 4c 54 45             "ALTE
b4f0: 52 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  R_TABLE",       
b500: 20 20 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20     "REINDEX",.  
b510: 20 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20     "ANALYZE",   
b520: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
b530: 54 45 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20  TE_VTABLE",     
b540: 20 20 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22     "DROP_VTABLE"
b550: 2c 0a 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e  ,.     "FUNCTION
b560: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
b570: 53 41 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20  SAVEPOINT",     
b580: 20 20 20 20 20 20 20 22 52 45 43 55 52 53 49 56         "RECURSIV
b590: 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  E".  };.  int i;
b5a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
b5b0: 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20  z[4];.  az[0] = 
b5c0: 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a  zA1;.  az[1] = z
b5d0: 41 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41  A2;.  az[2] = zA
b5e0: 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34  3;.  az[3] = zA4
b5f0: 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
b600: 70 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69  p->out, "authori
b610: 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69  zer: %s", azActi
b620: 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69  on[op]);.  for(i
b630: 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =0; i<4; i++){. 
b640: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
b650: 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20  >out, " ");.    
b660: 69 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20  if( az[i] ){.   
b670: 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
b680: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d  ng(p->out, az[i]
b690: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b6a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
b6b0: 2d 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a  ->out, "NULL");.
b6c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f      }.  }.  raw_
b6d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b6e0: 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  \n");.  return S
b6f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
b700: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  if../*.** Print 
b710: 61 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65  a schema stateme
b720: 6e 74 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44  nt.  Part of MOD
b730: 45 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f  E_Semi and MODE_
b740: 50 72 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a  Pretty output..*
b750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b760: 65 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20  e converts some 
b770: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b780: 74 65 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64  tements for shad
b790: 6f 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20  ow tables.** in 
b7a0: 46 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52  FTS3/4/5 into CR
b7b0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
b7c0: 54 20 45 58 49 53 54 53 20 73 74 61 74 65 6d 65  T EXISTS stateme
b7d0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
b7e0: 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  oid printSchemaL
b7f0: 69 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ine(FILE *out, c
b800: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f  onst char *z, co
b810: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29  nst char *zTail)
b820: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  {.  if( sqlite3_
b830: 73 74 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20  strglob("CREATE 
b840: 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a  TABLE ['\"]*", z
b850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
b860: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52  _printf(out, "CR
b870: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
b880: 54 20 45 58 49 53 54 53 20 25 73 25 73 22 2c 20  T EXISTS %s%s", 
b890: 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  z+13, zTail);.  
b8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f  }else{.    utf8_
b8b0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
b8c0: 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20  s", z, zTail);. 
b8d0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b8e0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
b8f0: 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61  N(FILE *out, cha
b900: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e  r *z, int n, con
b910: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b  st char *zTail){
b920: 0a 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d  .  char c = z[n]
b930: 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20  ;.  z[n] = 0;.  
b940: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
b950: 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a  out, z, zTail);.
b960: 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f    z[n] = c;.}../
b970: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b980: 20 69 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68   if string z[] h
b990: 61 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 77  as nothing but w
b9a0: 68 69 74 65 73 70 61 63 65 20 61 6e 64 20 63 6f  hitespace and co
b9b0: 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  mments to the.**
b9c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 72 73   end of the firs
b9d0: 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  t line..*/.stati
b9e0: 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f  c int wsToEol(co
b9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
ba00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ba10: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
ba20: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27    if( z[i]=='\n'
ba30: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
ba40: 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 69   if( IsSpace(z[i
ba50: 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
ba60: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27     if( z[i]=='-'
ba70: 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20   && z[i+1]=='-' 
ba80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
ba90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
baa0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
bab0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
bac0: 72 79 20 74 6f 20 74 68 65 20 45 58 50 4c 41 49  ry to the EXPLAI
bad0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
bae0: 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  a.*/.static void
baf0: 20 65 71 70 5f 61 70 70 65 6e 64 28 53 68 65 6c   eqp_append(Shel
bb00: 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69  lState *p, int i
bb10: 45 71 70 49 64 2c 20 69 6e 74 20 70 32 2c 20 63  EqpId, int p2, c
bb20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
bb30: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
bb40: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54   *pNew;.  int nT
bb50: 65 78 74 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ext = strlen30(z
bb60: 54 65 78 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Text);.  if( p->
bb70: 61 75 74 6f 45 51 50 74 65 73 74 20 29 7b 0a 20  autoEQPtest ){. 
bb80: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
bb90: 2d 3e 6f 75 74 2c 20 22 25 64 2c 25 64 2c 25 73  ->out, "%d,%d,%s
bba0: 5c 6e 22 2c 20 69 45 71 70 49 64 2c 20 70 32 2c  \n", iEqpId, p2,
bbb0: 20 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70   zText);.  }.  p
bbc0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
bbd0: 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
bbe0: 70 4e 65 77 29 20 2b 20 6e 54 65 78 74 20 29 3b  pNew) + nText );
bbf0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
bc00: 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
bc10: 6d 6f 72 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e  mory();.  pNew->
bc20: 69 45 71 70 49 64 20 3d 20 69 45 71 70 49 64 3b  iEqpId = iEqpId;
bc30: 0a 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74  .  pNew->iParent
bc40: 49 64 20 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70  Id = p2;.  memcp
bc50: 79 28 70 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a  y(pNew->zText, z
bc60: 54 65 78 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a  Text, nText+1);.
bc70: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
bc80: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 73 47 72 61  0;.  if( p->sGra
bc90: 70 68 2e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  ph.pLast ){.    
bca0: 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 2d  p->sGraph.pLast-
bcb0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
bcc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73   }else{.    p->s
bcd0: 47 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65  Graph.pRow = pNe
bce0: 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61  w;.  }.  p->sGra
bcf0: 70 68 2e 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b  ph.pLast = pNew;
bd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
bd10: 6e 64 20 72 65 73 65 74 20 74 68 65 20 45 58 50  nd reset the EXP
bd20: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
bd30: 64 61 74 61 20 74 68 61 74 20 68 61 73 20 62 65  data that has be
bd40: 65 6e 20 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20  en collected.** 
bd50: 69 6e 20 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f  in p->sGraph..*/
bd60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70  .static void eqp
bd70: 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74  _reset(ShellStat
bd80: 65 20 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70  e *p){.  EQPGrap
bd90: 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65  hRow *pRow, *pNe
bda0: 78 74 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d  xt;.  for(pRow =
bdb0: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b   p->sGraph.pRow;
bdc0: 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e   pRow; pRow = pN
bdd0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
bde0: 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20  = pRow->pNext;. 
bdf0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be00: 70 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  pRow);.  }.  mem
be10: 73 65 74 28 26 70 2d 3e 73 47 72 61 70 68 2c 20  set(&p->sGraph, 
be20: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72  0, sizeof(p->sGr
be30: 61 70 68 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  aph));.}../* Ret
be40: 75 72 6e 20 74 68 65 20 6e 65 78 74 20 45 58 50  urn the next EXP
be50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
be60: 6c 69 6e 65 20 77 69 74 68 20 69 45 71 70 49 64  line with iEqpId
be70: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 66 74   that occurs aft
be80: 65 72 0a 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72  er.** pOld, or r
be90: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
bea0: 73 75 63 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c  such line if pOl
beb0: 64 20 69 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61  d is NULL.*/.sta
bec0: 74 69 63 20 45 51 50 47 72 61 70 68 52 6f 77 20  tic EQPGraphRow 
bed0: 2a 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68  *eqp_next_row(Sh
bee0: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
bef0: 20 69 45 71 70 49 64 2c 20 45 51 50 47 72 61 70   iEqpId, EQPGrap
bf00: 68 52 6f 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45  hRow *pOld){.  E
bf10: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77  QPGraphRow *pRow
bf20: 20 3d 20 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e   = pOld ? pOld->
bf30: 70 4e 65 78 74 20 3a 20 70 2d 3e 73 47 72 61 70  pNext : p->sGrap
bf40: 68 2e 70 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28  h.pRow;.  while(
bf50: 20 70 52 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69   pRow && pRow->i
bf60: 50 61 72 65 6e 74 49 64 21 3d 69 45 71 70 49 64  ParentId!=iEqpId
bf70: 20 29 20 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e   ) pRow = pRow->
bf80: 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  pNext;.  return 
bf90: 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64  pRow;.}../* Rend
bfa0: 65 72 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  er a single leve
bfb0: 6c 20 6f 66 20 74 68 65 20 67 72 61 70 68 20 74  l of the graph t
bfc0: 68 61 74 20 68 61 73 20 69 45 71 70 49 64 20 61  hat has iEqpId a
bfd0: 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 43  s its parent.  C
bfe0: 61 6c 6c 65 64 0a 2a 2a 20 72 65 63 75 72 73 69  alled.** recursi
bff0: 76 65 6c 79 20 74 6f 20 72 65 6e 64 65 72 20 73  vely to render s
c000: 75 62 6c 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61  ublevels..*/.sta
c010: 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e  tic void eqp_ren
c020: 64 65 72 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53  der_level(ShellS
c030: 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71  tate *p, int iEq
c040: 70 49 64 29 7b 0a 20 20 45 51 50 47 72 61 70 68  pId){.  EQPGraph
c050: 52 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78  Row *pRow, *pNex
c060: 74 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  t;.  int n = str
c070: 6c 65 6e 33 30 28 70 2d 3e 73 47 72 61 70 68 2e  len30(p->sGraph.
c080: 7a 50 72 65 66 69 78 29 3b 0a 20 20 63 68 61 72  zPrefix);.  char
c090: 20 2a 7a 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20   *z;.  for(pRow 
c0a0: 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70  = eqp_next_row(p
c0b0: 2c 20 69 45 71 70 49 64 2c 20 30 29 3b 20 70 52  , iEqpId, 0); pR
c0c0: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
c0d0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 65  ){.    pNext = e
c0e0: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c0f0: 45 71 70 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20  EqpId, pRow);.  
c100: 20 20 7a 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78    z = pRow->zTex
c110: 74 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  t;.    utf8_prin
c120: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73  tf(p->out, "%s%s
c130: 25 73 5c 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68  %s\n", p->sGraph
c140: 2e 7a 50 72 65 66 69 78 2c 20 70 4e 65 78 74 20  .zPrefix, pNext 
c150: 3f 20 22 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c  ? "|--" : "`--",
c160: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28   z);.    if( n<(
c170: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47  int)sizeof(p->sG
c180: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 2d 37 20  raph.zPrefix)-7 
c190: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
c1a0: 26 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  &p->sGraph.zPref
c1b0: 69 78 5b 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22  ix[n], pNext ? "
c1c0: 7c 20 20 22 20 3a 20 22 20 20 20 22 2c 20 34 29  |  " : "   ", 4)
c1d0: 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64  ;.      eqp_rend
c1e0: 65 72 5f 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77  er_level(p, pRow
c1f0: 2d 3e 69 45 71 70 49 64 29 3b 0a 20 20 20 20 20  ->iEqpId);.     
c200: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c210: 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ix[n] = 0;.    }
c220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
c230: 73 70 6c 61 79 20 61 6e 64 20 72 65 73 65 74 20  splay and reset 
c240: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
c250: 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73  Y PLAN data.*/.s
c260: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72  tatic void eqp_r
c270: 65 6e 64 65 72 28 53 68 65 6c 6c 53 74 61 74 65  ender(ShellState
c280: 20 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68   *p){.  EQPGraph
c290: 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73  Row *pRow = p->s
c2a0: 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66  Graph.pRow;.  if
c2b0: 28 20 70 52 6f 77 20 29 7b 0a 20 20 20 20 69 66  ( pRow ){.    if
c2c0: 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d  ( pRow->zText[0]
c2d0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
c2e0: 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d  f( pRow->pNext==
c2f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70  0 ){.        eqp
c300: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20  _reset(p);.     
c310: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
c320: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
c330: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c340: 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74  \n", pRow->zText
c350: 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  +3);.      p->sG
c360: 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77  raph.pRow = pRow
c370: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
c380: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77  qlite3_free(pRow
c390: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c3a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c3b0: 70 2d 3e 6f 75 74 2c 20 22 51 55 45 52 59 20 50  p->out, "QUERY P
c3c0: 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  LAN\n");.    }. 
c3d0: 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72     p->sGraph.zPr
c3e0: 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  efix[0] = 0;.   
c3f0: 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65   eqp_render_leve
c400: 6c 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 71 70  l(p, 0);.    eqp
c410: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d  _reset(p);.  }.}
c420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
c430: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
c440: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
c450: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
c460: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
c470: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
c480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
c490: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  ll_callback(.  v
c4a0: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
c4b0: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a   nArg,        /*
c4c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
c4d0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63  t columns */.  c
c4e0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
c4f0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
c500: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
c510: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
c520: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
c530: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  mes */.  int *ai
c540: 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c  Type      /* Col
c550: 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a  umn types */.){.
c560: 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c    int i;.  Shell
c570: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
c580: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20  lState*)pArg;.. 
c590: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c5a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
c5b0: 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a  ch( p->cMode ){.
c5c0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
c5d0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
c5e0: 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  w = 5;.      if(
c5f0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
c600: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
c610: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c620: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
c630: 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  = strlen30(azCol
c640: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
c650: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66   "");.        if
c660: 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65  ( len>w ) w = le
c670: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
c680: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20   if( p->cnt++>0 
c690: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
c6a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
c6b0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
c6c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c6d0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
c6e0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c6f0: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25  ->out,"%*s = %s%
c700: 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  s", w, azCol[i],
c710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c720: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
c730: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
c740: 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  lue, p->rowSepar
c750: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
c760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c770: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
c780: 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73  Explain:.    cas
c790: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
c7a0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
c7b0: 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e  nst int aExplain
c7c0: 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31  Widths[] = {4, 1
c7d0: 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20  3, 4, 4, 4, 13, 
c7e0: 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f  2, 13};.      co
c7f0: 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74  nst int *colWidt
c800: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f  h;.      int sho
c810: 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  wHdr;.      char
c820: 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20   *rowSep;.      
c830: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
c840: 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  DE_Column ){.   
c850: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
c860: 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  p->colWidth;.   
c870: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70       showHdr = p
c880: 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  ->showHeader;.  
c890: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70        rowSep = p
c8a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a  ->rowSeparator;.
c8b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c8c0: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
c8d0: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a  aExplainWidths;.
c8e0: 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20          showHdr 
c8f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77  = 1;.        row
c900: 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20  Sep = SEP_Row;. 
c910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c920: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a   p->cnt++==0 ){.
c930: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
c940: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
c950: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20           int w, 
c960: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  n;.          if(
c970: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
c980: 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  colWidth) ){.   
c990: 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c           w = col
c9a0: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
c9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9c0: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
c9d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c9e0: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
ca00: 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c  strlenChar(azCol
ca10: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
ca20: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
ca30: 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d    if( w<10 ) w =
ca40: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
ca50: 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   n = strlenChar(
ca60: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
ca70: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
ca80: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
ca90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
caa0: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
cab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cac0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
cad0: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
cae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
caf0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
cb00: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
cb10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
cb20: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
cb30: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
cb40: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
cb50: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20   w, azCol[i]);. 
cb60: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
cb70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cb80: 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f  %s", i==nArg-1 ?
cb90: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
cba0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
cbc0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
cbd0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
cbe0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77             int w
cc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
cc10: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
cc20: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
cc30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc40: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
cc50: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
cc60: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 20        if( w<0 ) 
cc70: 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20  w = -w;.        
cc80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc90: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
cca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
ccc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ccd0: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20  %-*.*s%s",w,w,. 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
cda0: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
cdb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cdc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cdd0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
cde0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cdf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
ce00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
ce10: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66  nt w;.        if
ce20: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
ce30: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
ce40: 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20  .           w = 
ce50: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
ce60: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
ce70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
ce80: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
ce90: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d         if( p->cM
cea0: 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
ceb0: 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26  n && azArg[i] &&
cec0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
ced0: 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20  g[i])>w ){.     
cee0: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
cef0: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  har(azArg[i]);. 
cf00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf10: 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e   if( i==1 && p->
cf20: 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70  aiIndent && p->p
cf30: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
cf40: 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74    if( p->iIndent
cf50: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20  <p->nIndent ){. 
cf60: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
cf70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cf80: 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65  %*.s", p->aiInde
cf90: 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20  nt[p->iIndent], 
cfa0: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "");.          }
cfb0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49  .          p->iI
cfc0: 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ndent++;.       
cfd0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
cfe0: 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f  width_print(p->o
cff0: 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20  ut, w, azArg[i] 
d000: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
d010: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
d020: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d030: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
d040: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
d050: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
d060: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d070: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d080: 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20  DE_Semi: {   /* 
d090: 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c  .schema and .ful
d0a0: 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a  lschema output *
d0b0: 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68  /.      printSch
d0c0: 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
d0d0: 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29  azArg[0], ";\n")
d0e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d0f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d100: 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a  DE_Pretty: {  /*
d110: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
d120: 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d  llschema with --
d130: 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  indent */.      
d140: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
d150: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt j;.      int 
d160: 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nParen = 0;.    
d170: 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b    char cEnd = 0;
d180: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
d190: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d       int nLine =
d1a0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
d1b0: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
d1c0: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d     if( azArg[0]=
d1d0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d1e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
d1f0: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56 49  rlike("CREATE VI
d200: 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  EW%", azArg[0], 
d210: 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  0)==0.       || 
d220: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
d230: 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c 20  "CREATE TRIG%", 
d240: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
d250: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d260: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d270: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a  out, "%s;\n", az
d280: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
d290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d2a0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
d2b0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
d2c0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
d2d0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   j = 0;.      fo
d2e0: 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a  r(i=0; IsSpace(z
d2f0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
d300: 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b     for(; (c = z[
d310: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
d320: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
d330: 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e(c) ){.        
d340: 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c    if( z[j-1]=='\
d350: 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c  r' ) z[j-1] = '\
d360: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n';.          if
d370: 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  ( IsSpace(z[j-1]
d380: 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27  ) || z[j-1]=='('
d390: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d3a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
d3b0: 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27  c=='(' || c==')'
d3c0: 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70  ) && j>0 && IsSp
d3d0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20  ace(z[j-1]) ){. 
d3e0: 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20           j--;.  
d3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d400: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  z[j++] = c;.    
d410: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
d420: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
d430: 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20  z[j-1]) ){ j--; 
d440: 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30  }.      z[j] = 0
d450: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  ;.      if( strl
d460: 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20  en30(z)>=79 ){. 
d470: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30         for(i=j=0
d480: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
d490: 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20   i++){  /* Copy 
d4a0: 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69  changes from z[i
d4b0: 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a  ] back to z[j] *
d4c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
d4d0: 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20  c==cEnd ){.     
d4e0: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b         cEnd = 0;
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d500: 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63   if( c=='"' || c
d510: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27  =='\'' || c=='`'
d520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d530: 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20  cEnd = c;.      
d540: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d550: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
d560: 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a      cEnd = ']';.
d570: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
d580: 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b  if( c=='-' && z[
d590: 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  i+1]=='-' ){.   
d5a0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
d5b0: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
d5c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27  }else if( c=='('
d5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d5e0: 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  nParen++;.      
d5f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d600: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
d610: 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20      nParen--;.  
d620: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c            if( nL
d630: 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d  ine>0 && nParen=
d640: 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20  =0 && j>0 ){.   
d650: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
d660: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f  SchemaLineN(p->o
d670: 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b  ut, z, j, "\n");
d680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
d690: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d6a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
d6b0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
d6c0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
d6d0: 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26  if( nParen==1 &&
d6e0: 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20   cEnd==0.       
d6f0: 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c      && (c=='(' |
d700: 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d  | c=='\n' || (c=
d710: 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c  =',' && !wsToEol
d720: 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20  (z+i+1))).      
d730: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
d740: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
d750: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20   j--;.          
d760: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d770: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
d780: 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20   "\n  ");.      
d790: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
d7a0: 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b           nLine++
d7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
d7c0: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69  ile( IsSpace(z[i
d7d0: 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20  +1]) ){ i++; }. 
d7e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d7f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
d800: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
d810: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
d820: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  Line(p->out, z, 
d830: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  ";\n");.      sq
d840: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
d850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d860: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d870: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
d880: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
d890: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
d8a0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d8b0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
d8d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
d8e0: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  s%s",azCol[i],. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e   i==nArg-1 ? p->
d910: 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70  rowSeparator : p
d920: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
d930: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d940: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
d950: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
d960: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d970: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
d980: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
d990: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
d9a0: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
d9b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20  ->nullValue;.   
d9c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d9d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
d9e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d9f0: 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20  <nArg-1 ){.     
da00: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
da10: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
da20: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
da30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
da40: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
da50: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
da60: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
da70: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
da80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
da90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
daa0: 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b  ase MODE_Html: {
dab0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
dac0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
dad0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
dae0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
daf0: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
db00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
db10: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
db20: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
db30: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
db40: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
db50: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
db60: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
db70: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
db80: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
db90: 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TH>\n");.      
dba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
dbb0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
dbc0: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
dbd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
dbe0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
dbf0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dc00: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
dc10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dc20: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
dc30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dc40: 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20  ->out,"<TD>");. 
dc50: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
dc60: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
dc70: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
dc80: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
dc90: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72  alue);.        r
dca0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
dcb0: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
dcc0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
dcd0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
dce0: 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  TR>\n");.      b
dcf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dd00: 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b  case MODE_Tcl: {
dd10: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
dd20: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
dd30: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
dd40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
dd50: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
dd60: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
dd70: 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c  ing(p->out,azCol
dd80: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
dd90: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
dda0: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
ddb0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ddc0: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ddd0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
dde0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
ddf0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
de00: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
de10: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
de20: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
de30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
de40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
de50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
de60: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
de70: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
de80: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
de90: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
dea0: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
deb0: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
dec0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
ded0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
dee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
def0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
df00: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
df10: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
df20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
df30: 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a  ase MODE_Csv: {.
df40: 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
df50: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
df60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
df70: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
df80: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
df90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
dfa0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
dfb0: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
dfc0: 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f   azCol[i] ? azCo
dfd0: 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72  l[i] : "", i<nAr
dfe0: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
dff0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e000: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e010: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e020: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e030: 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a    if( nArg>0 ){.
e040: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e050: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e060: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
e070: 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  csv(p, azArg[i],
e080: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
e090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
e0a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e0b0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e0c0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e0d0: 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74 4d  }.      setTextM
e0e0: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
e0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e100: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e110: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
e120: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
e130: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66  break;.      utf
e140: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e150: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22  "INSERT INTO %s"
e160: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
e170: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
e180: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e190: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e1a0: 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20  ->out,"(");.    
e1b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e1c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e1d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
e1e0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e1f0: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
e200: 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72 28    if( quoteChar(
e210: 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20  azCol[i]) ){.   
e220: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
e230: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
e240: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43  tf("\"%w\"", azC
e250: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
e260: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e270: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
e280: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
e290: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
e2a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
e2c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e2d0: 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  %s", azCol[i]);.
e2e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e2f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e300: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e310: 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
e320: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
e330: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e340: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e350: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e360: 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20  >out, i>0 ? "," 
e370: 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20  : " VALUES(");. 
e380: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
e390: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
e3a0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
e3b0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
e3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e3d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3e0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
e3f0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
e400: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
e410: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
e420: 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65 6c          if( Shel
e430: 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
e440: 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20  G_Newlines) ){. 
e450: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
e460: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
e470: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e490: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e4a0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
e4b0: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
e4c0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e4d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e4e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
e4f0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
e500: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
e510: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
e520: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e530: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
e540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e550: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
e560: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
e570: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
e580: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
e590: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
e5a0: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
e5b0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
e5c0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
e5d0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
e5e0: 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  4 ur;.          
e5f0: 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c 73 69  memcpy(&ur,&r,si
e600: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20  zeof(r));.      
e610: 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66      if( ur==0x7f
e620: 66 30 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c  f0000000000000LL
e630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e640: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e650: 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20 20 20  t, "1e999");.   
e660: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e670: 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30 30 30   ur==0xfff000000
e680: 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20  0000000LL ){.   
e690: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e6a0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65  ntf(p->out, "-1e
e6b0: 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20  999");.         
e6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e6d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e6e0: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
e6f0: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
e700: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e710: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
e720: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e730: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
e740: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
e750: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
e760: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
e770: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
e780: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
e790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
e7a0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
e7b0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
e7c0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
e7d0: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
e7e0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
e7f0: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
e800: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
e810: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
e820: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
e830: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
e840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
e850: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e860: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
e870: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e880: 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67  if( ShellHasFlag
e890: 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  (p, SHFLG_Newlin
e8a0: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  es) ){.         
e8b0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
e8c0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
e8d0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
e8e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e8f0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
e900: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
e910: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
e920: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e930: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
e940: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c  intf(p->out,");\
e950: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
e960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e970: 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20   MODE_Quote: {. 
e980: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e990: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e9a0: 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26   if( p->cnt==0 &
e9b0: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
e9c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
e9d0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e9f0: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
ea00: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
ea10: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
ea20: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
ea30: 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  >out, azCol[i]);
ea40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ea50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
ea60: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
ea70: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74    }.      p->cnt
ea80: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
ea90: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
eaa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30  .        if( i>0
eab0: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
eac0: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
ead0: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
eae0: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
eaf0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
eb00: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
eb10: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
eb20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c  intf(p->out,"NUL
eb30: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  L");.        }el
eb40: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
eb50: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
eb60: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
eb70: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
eb80: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
eb90: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
eba0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
ebb0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ebc0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  i]==SQLITE_INTEG
ebd0: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
ebe0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ebf0: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ec00: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ec10: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ec20: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ec30: 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
ec40: 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b       char z[50];
ec50: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
ec60: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
ec70: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70  lumn_double(p->p
ec80: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
ec90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
eca0: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
ecb0: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
ecc0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ecd0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
ece0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ecf0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ed00: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
ed10: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
ed20: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
ed30: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
ed40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
ed50: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
ed60: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
ed70: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
ed80: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
ed90: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
eda0: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
edb0: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
edc0: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
edd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
ede0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
edf0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
ee00: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ee10: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ee20: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ee30: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  e{.          out
ee40: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ee50: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ee60: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
ee70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
ee80: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ee90: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
eea0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
eeb0: 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a  e MODE_Ascii: {.
eec0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
eed0: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
eee0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
eef0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ef00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ef10: 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66     if( i>0 ) utf
ef20: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ef30: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ef40: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
ef50: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ef60: 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c  ->out,"%s",azCol
ef70: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
ef80: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   "");.        }.
ef90: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
efa0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
efb0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
efc0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
efd0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
efe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
eff0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f010: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
f020: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f030: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
f040: 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
f050: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f060: 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  s",azArg[i] ? az
f070: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
f080: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Value);.      }.
f090: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f0a0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
f0b0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
f0c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f0d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
f0e0: 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20 20  DE_EQP: {.      
f0f0: 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20 61 74  eqp_append(p, at
f100: 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74  oi(azArg[0]), at
f110: 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a  oi(azArg[1]), az
f120: 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62  Arg[3]);.      b
f130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f150: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
f160: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
f170: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
f180: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
f190: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
f1a0: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
f1b0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
f1c0: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
f1d0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
f1e0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
f1f0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
f200: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
f210: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
f220: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
f230: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
f240: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
f250: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
f260: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
f270: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
f280: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
f290: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
f2a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
f2b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  rom sqlite3_exec
f2c0: 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73 20  () that appends 
f2d0: 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e  all.** output on
f2e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
f2f0: 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74  ShellText object
f300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f310: 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
f320: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
f330: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
f340: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
f350: 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78  *az){.  ShellTex
f360: 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78  t *p = (ShellTex
f370: 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  t*)pArg;.  int i
f380: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
f390: 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20  ETER(az);.  if( 
f3a0: 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
f3b0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20  n 0;.  if( p->n 
f3c0: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
f3d0: 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  "|", 0);.  for(i
f3e0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f3f0: 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61 70  {.    if( i ) ap
f400: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c  pendText(p, ",",
f410: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41   0);.    if( azA
f420: 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65  rg[i] ) appendTe
f430: 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  xt(p, azArg[i], 
f440: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
f450: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
f460: 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72  erate an appropr
f470: 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74 61  iate SELFTEST ta
f480: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
f490: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
f4a0: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53  tic void createS
f4b0: 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68 65  elftestTable(She
f4c0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63  llState *p){.  c
f4d0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
f4e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
f4f0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56  (p->db,.    "SAV
f500: 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f  EPOINT selftest_
f510: 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52  init;\n".    "CR
f520: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
f530: 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65 73  T EXISTS selftes
f540: 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f  t(\n".    "  tno
f550: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
f560: 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65   KEY,\n"   /* Te
f570: 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  st number */.   
f580: 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20   "  op TEXT,\n" 
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20    /* Operator:  
f5b0: 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20  memo run */.    
f5c0: 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20  "  cmd TEXT,\n" 
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74   /* Command text
f5f0: 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54   */.    "  ans T
f600: 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20  EXT\n"          
f610: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69           /* Desi
f620: 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20  red answer */.  
f630: 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41    ");".    "CREA
f640: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f  TE TEMP TABLE [_
f650: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63  shell$self](op,c
f660: 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20  md,ans);\n".    
f670: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
f680: 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64  hell$self](rowid
f690: 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20  ,op,cmd)\n".    
f6a0: 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73  "  VALUES(coales
f6b0: 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28  ce((SELECT (max(
f6c0: 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f  tno)+100)/10 FRO
f6d0: 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c  M selftest),10),
f6e0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
f6f0: 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20    'memo','Tests 
f700: 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69  generated by --i
f710: 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  nit');\n".    "I
f720: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
f730: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
f740: 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
f750: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  \n".    "    'SE
f760: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
f770: 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79 70  ery(''SELECT typ
f780: 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
f790: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
f7c0: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
f7d0: 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c   BY 2'',224))',\
f7e0: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
f7f0: 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45  sha3_query('SELE
f800: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
f810: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69        "FROM sqli
f840: 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20  te_master ORDER 
f850: 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a  BY 2',224));\n".
f860: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
f870: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
f880: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
f890: 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20  'run',".    "   
f8a0: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
f8b0: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
f8c0: 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a   * FROM \"' ||".
f8d0: 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72 69      "        pri
f8e0: 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c  ntf('%w',name) |
f8f0: 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  | '\" NOT INDEXE
f900: 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  D'',224))',\n". 
f910: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
f920: 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27 53  _query(printf('S
f930: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
f940: 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  w\" NOT INDEXED'
f950: 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a  ,name),224))\n".
f960: 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22      "  FROM (\n"
f970: 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
f980: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
f990: 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20  e_master\n".    
f9a0: 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70 65  "     WHERE type
f9b0: 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20  ='table'\n".    
f9c0: 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65  "       AND name
f9d0: 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a  <>'selftest'\n".
f9e0: 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
f9f0: 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67  coalesce(rootpag
fa00: 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20  e,0)>0\n".    " 
fa10: 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45   )\n".    " ORDE
fa20: 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20  R BY name;\n".  
fa30: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fa40: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
fa50: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27 72      "  VALUES('r
fa60: 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65  un','PRAGMA inte
fa70: 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b  grity_check','ok
fa80: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
fa90: 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74  RT INTO selftest
faa0: 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29  (tno,op,cmd,ans)
fab0: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
fac0: 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c  rowid*10,op,cmd,
fad0: 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c  ans FROM [_shell
fae0: 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22  $self];\n".    "
faf0: 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  DROP TABLE [_she
fb00: 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c  ll$self];".    ,
fb10: 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20  0,0,&zErrMsg);. 
fb20: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
fb30: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
fb40: 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53  stderr, "SELFTES
fb50: 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  T initialization
fb60: 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c   failure: %s\n",
fb70: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
fb80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
fb90: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
fba0: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
fbb0: 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73  "RELEASE selftes
fbc0: 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a  t_init",0,0,0);.
fbd0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
fbe0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
fbf0: 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ble field of the
fc00: 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75   ShellState stru
fc10: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20  cture to.** the 
fc20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
fc30: 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65  e given.  Escape
fc40: 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61   any quote chara
fc50: 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cters in the.** 
fc60: 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  table name..*/.s
fc70: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74  tatic void set_t
fc80: 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53  able_name(ShellS
fc90: 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
fca0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
fcb0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20  nt i, n;.  char 
fcc0: 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a  cQuote;.  char *
fcd0: 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65  z;..  if( p->zDe
fce0: 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  stTable ){.    f
fcf0: 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c  ree(p->zDestTabl
fd00: 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74  e);.    p->zDest
fd10: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Table = 0;.  }. 
fd20: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
fd30: 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65  return;.  cQuote
fd40: 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61   = quoteChar(zNa
fd50: 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  me);.  n = strle
fd60: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  n30(zName);.  if
fd70: 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20  ( cQuote ) n += 
fd80: 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44  n+2;.  z = p->zD
fd90: 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f  estTable = mallo
fda0: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
fdb0: 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  z==0 ) shell_out
fdc0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
fdd0: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75  n = 0;.  if( cQu
fde0: 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
fdf0: 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Quote;.  for(i=0
fe00: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
fe10: 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a  {.    z[n++] = z
fe20: 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Name[i];.    if(
fe30: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74   zName[i]==cQuot
fe40: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
fe50: 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ote;.  }.  if( c
fe60: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
fe70: 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20   cQuote;.  z[n] 
fe80: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  = 0;.}.../*.** E
fe90: 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73  xecute a query s
fea0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
feb0: 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20  ll generate SQL 
fec0: 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a  output.  Print.*
fed0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  * the result col
fee0: 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61  umns, comma-sepa
fef0: 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65  rated, on a line
ff00: 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a   and then add a.
ff10: 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  ** semicolon ter
ff20: 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65  minator to the e
ff30: 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e  nd of that line.
ff40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
ff50: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ff60: 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f  is 1 and that co
ff70: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65  lumn contains te
ff80: 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20  xt "--".** then 
ff90: 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f  write the semico
ffa0: 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74  lon on a separat
ffb0: 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61  e line.  That wa
ffc0: 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20  y, if a.** "--" 
ffd0: 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61  comment occurs a
ffe0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
fff0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
10000 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74  comment.** won't
10010 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d   consume the sem
10020 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f  icolon terminato
10030 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10040 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
10050 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74  query(.  ShellSt
10060 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
10070 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65    /* Query conte
10080 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
10090 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20  ar *zSelect,    
100a0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
100b0 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20  ment to extract 
100c0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  content */.  con
100d0 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52  st char *zFirstR
100e0 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62  ow    /* Print b
100f0 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c  efore first row,
10100 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
10110 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
10120 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e  t *pSelect;.  in
10130 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73  t rc;.  int nRes
10140 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
10150 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
10170 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
10180 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53  zSelect, -1, &pS
10190 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
101a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
101b0 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  | !pSelect ){.  
101c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
101d0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
101e0 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
101f0 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
10200 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10210 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10220 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10230 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10240 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10260 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10270 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
10280 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73  );.  nResult = s
10290 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
102a0 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  unt(pSelect);.  
102b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
102c0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
102d0 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20   zFirstRow ){.  
102e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
102f0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46  p->out, "%s", zF
10300 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  irstRow);.      
10310 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20  zFirstRow = 0;. 
10320 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f     }.    z = (co
10330 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
10340 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10350 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75  elect, 0);.    u
10360 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10370 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
10380 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73   for(i=1; i<nRes
10390 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
103a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
103b0 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69  out, ",%s", sqli
103c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
103d0 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20  pSelect, i));.  
103e0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30    }.    if( z==0
103f0 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77   ) z = "";.    w
10400 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a  hile( z[0] && (z
10410 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d  [0]!='-' || z[1]
10420 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20  !='-') ) z++;.  
10430 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20    if( z[0] ){.  
10440 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10450 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b  ->out, "\n;\n");
10460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10470 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10480 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  out, ";\n");.   
10490 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
104a0 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
104b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
104c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
104d0 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72  Select);.  if( r
104e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
104f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10500 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
10510 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
10520 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10540 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
10550 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
10560 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10570 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10580 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
10590 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
105a0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64  locate space and
105b0 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e   save off curren
105c0 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a  t error string..
105d0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
105e0 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20  save_err_msg(.  
105f0 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20  sqlite3 *db     
10600 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10610 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29  se to query */.)
10620 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20  {.  int nErrMsg 
10630 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c  = 1+strlen30(sql
10640 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
10650 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
10660 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
10670 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20  oc64(nErrMsg);. 
10680 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
10690 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d      memcpy(zErrM
106a0 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  sg, sqlite3_errm
106b0 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29  sg(db), nErrMsg)
106c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
106d0 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65  ErrMsg;.}..#ifde
106e0 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
106f0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73  * Attempt to dis
10700 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f  play I/O stats o
10710 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70  n Linux using /p
10720 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74  roc/PID/io.*/.st
10730 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
10740 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49  yLinuxIoStats(FI
10750 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45  LE *out){.  FILE
10760 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32   *in;.  char z[2
10770 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
10780 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
10790 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f  ), z, "/proc/%d/
107a0 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  io", getpid());.
107b0 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20    in = fopen(z, 
107c0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
107d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
107e0 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73  hile( fgets(z, s
107f0 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30  izeof(z), in)!=0
10800 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
10810 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
10820 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10830 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
10840 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
10850 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b  c;.    } aTrans[
10860 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72  ] = {.      { "r
10870 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
10880 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
10890 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61   received by rea
108a0 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  d():" },.      {
108b0 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "wchar: ",     
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
108d0 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74  tes sent to writ
108e0 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  e():"    },.    
108f0 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20    { "syscr: ",  
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63  "Read() system c
10920 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20  alls:"      },. 
10930 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22       { "syscw: "
10940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10950 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74     "Write() syst
10960 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d  em calls:"     }
10970 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f  ,.      { "read_
10980 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
10990 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61        "Bytes rea
109a0 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22  d from storage:"
109b0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72    },.      { "wr
109c0 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ite_bytes: ",   
109d0 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
109e0 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61  written to stora
109f0 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ge:" },.      { 
10a00 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65  "cancelled_write
10a10 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e  _bytes: ",  "Can
10a20 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74  celled write byt
10a30 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d  es:"    },.    }
10a40 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
10a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
10a60 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69  ySize(aTrans); i
10a70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
10a80 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61   = strlen30(aTra
10a90 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b  ns[i].zPattern);
10aa0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
10ab0 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61  mp(aTrans[i].zPa
10ac0 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20  ttern, z, n)==0 
10ad0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
10ae0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
10af0 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69  6s %s", aTrans[i
10b00 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b  ].zDesc, &z[n]);
10b10 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10b30 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  }.  fclose(in);.
10b40 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10b50 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65  Display a single
10b60 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20   line of status 
10b70 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c  using 64-bit val
10b80 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
10b90 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c  oid displayStatL
10ba0 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ine(.  ShellStat
10bb0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
10bc0 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f   /* The shell co
10bd0 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20  ntext */.  char 
10be0 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20  *zLabel,        
10bf0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
10c00 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20  r this one line 
10c10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d  */.  char *zForm
10c20 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  at,            /
10c30 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  * Format for the
10c40 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
10c50 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20   iStatusCtrl,   
10c60 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
10c70 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61  status to displa
10c80 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65  y */.  int bRese
10c90 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10ca0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
10cb0 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
10cc0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
10cd0 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  4 iCur = -1;.  s
10ce0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69  qlite3_int64 iHi
10cf0 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  wtr = -1;.  int 
10d00 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63  i, nPercent;.  c
10d10 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a  har zLine[200];.
10d20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
10d30 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20  64(iStatusCtrl, 
10d40 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
10d50 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69  bReset);.  for(i
10d60 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20  =0, nPercent=0; 
10d70 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29  zFormat[i]; i++)
10d80 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61  {.    if( zForma
10d90 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72  t[i]=='%' ) nPer
10da0 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  cent++;.  }.  if
10db0 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a  ( nPercent>1 ){.
10dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10dd0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
10de0 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
10df0 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  at, iCur, iHiwtr
10e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10e10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
10e20 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20  (sizeof(zLine), 
10e30 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  zLine, zFormat, 
10e40 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72  iHiwtr);.  }.  r
10e50 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
10e60 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
10e70 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a  zLabel, zLine);.
10e80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
10e90 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a   memory stats..*
10ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
10eb0 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71  play_stats(.  sq
10ec0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10ee0 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
10ef0 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
10f00 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
10f10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
10f20 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ellState */.  in
10f30 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
10f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10f50 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
10f60 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tats */.){.  int
10f70 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69   iCur;.  int iHi
10f80 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  wtr;.  FILE *out
10f90 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20  ;.  if( pArg==0 
10fa0 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20  || pArg->out==0 
10fb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75  ) return 0;.  ou
10fc0 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a  t = pArg->out;..
10fd0 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d    if( pArg->pStm
10fe0 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74  t && (pArg->stat
10ff0 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20  sOn & 2) ){.    
11000 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a  int nCol, i, x;.
11010 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
11020 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e   *pStmt = pArg->
11030 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
11040 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c  z[100];.    nCol
11050 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
11060 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
11070 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
11080 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22  ut, "%-36s %d\n"
11090 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  , "Number of out
110a0 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e  put columns:", n
110b0 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Col);.    for(i=
110c0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
110d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
110e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
110f0 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25  ),z,"Column %d %
11100 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b  nname:", i, &x);
11110 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11120 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11130 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11140 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
11150 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20  mt,i));.#ifndef 
11160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
11170 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74  TYPE.      sqlit
11180 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11190 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74  z+x, "declared t
111a0 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74  ype:");.      ut
111b0 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
111c0 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20  %-36s %s\n", z, 
111d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
111e0 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69  ecltype(pStmt, i
111f0 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ));.#endif.#ifde
11200 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11210 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
11220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11230 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11240 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22  "database name:"
11250 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11260 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11270 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11280 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
11290 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  se_name(pStmt,i)
112a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112b0 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
112c0 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22  x, "table name:"
112d0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
112e0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
112f0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11300 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
11310 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
11320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11330 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11340 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b  "origin name:");
11350 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11360 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11370 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11380 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
11390 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23  ame(pStmt,i));.#
113a0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
113b0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
113c0 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79  ne(pArg, "Memory
113d0 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25   Used:",.     "%
113e0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62  lld (max %lld) b
113f0 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
11400 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
11410 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
11420 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11430 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75  g, "Number of Ou
11440 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61  tstanding Alloca
11450 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25  tions:",.     "%
11460 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
11470 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11480 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65  ALLOC_COUNT, bRe
11490 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67  set);.  if( pArg
114a0 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48  ->shellFlgs & SH
114b0 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b  FLG_Pagecache ){
114c0 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
114d0 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
114e0 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67  er of Pcache Pag
114f0 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  es Used:",.     
11500 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11510 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54  d) pages", SQLIT
11520 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11530 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29  HE_USED, bReset)
11540 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53  ;.  }.  displayS
11550 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
11560 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
11570 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22  Overflow Bytes:"
11580 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
11590 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20  x %lld) bytes", 
115a0 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
115b0 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57  GECACHE_OVERFLOW
115c0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
115d0 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
115e0 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f  g, "Largest Allo
115f0 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22  cation:",.     "
11600 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
11610 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
11620 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  C_SIZE, bReset);
11630 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11640 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
11650 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74  t Pcache Allocat
11660 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ion:",.     "%ll
11670 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
11680 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
11690 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  E_SIZE, bReset);
116a0 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d  .#ifdef YYTRACKM
116b0 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64  AXSTACKDEPTH.  d
116c0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
116d0 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61  Arg, "Deepest Pa
116e0 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20  rser Stack:",.  
116f0 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11700 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ld)", SQLITE_STA
11710 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b  TUS_PARSER_STACK
11720 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69  , bReset);.#endi
11730 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  f..  if( db ){. 
11740 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
11750 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c  llFlgs & SHFLG_L
11760 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20  ookaside ){.    
11770 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
11780 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
11790 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
117a0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
117b0 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
117c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
117d0 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
117e0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
117f0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
11800 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
11820 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73  okaside Slots Us
11830 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
11840 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
11850 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11860 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
11870 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
11880 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11890 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
118a0 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20  ASIDE_HIT,.     
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
118d0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
118e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
118f0 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73  g->out, "Success
11900 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74  ful lookaside at
11910 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64  tempts:       %d
11920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11930 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
11940 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11950 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11960 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
11970 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20  E_MISS_SIZE,.   
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
119a0 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
119b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
119c0 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
119d0 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
119e0 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20  e to size:      
119f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11a00 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
11a10 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
11a20 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
11a30 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
11a40 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20  IDE_MISS_FULL,. 
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
11a70 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11a80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
11a90 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
11aa0 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
11ab0 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
11ac0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
11ad0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
11ae0 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
11af0 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
11b00 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11b10 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11b20 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
11b30 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
11b40 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11b50 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11b60 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65  ->out, "Pager He
11b70 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
11b90 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
11ba0 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
11bb0 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11bc0 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
11bd0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11be0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
11bf0 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
11c00 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11c10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11c20 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11c30 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20  che hits:       
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11c50 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11c60 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11c70 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11c80 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11c90 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11ca0 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c  CHE_MISS, &iCur,
11cb0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11cc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11cd0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11ce0 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11d00 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11d10 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11d20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11d30 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11d40 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11d50 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
11d60 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
11d70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11d80 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
11d90 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20  ache writes:    
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
11db0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
11dc0 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11dd0 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
11de0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11df0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
11e00 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75  ACHE_SPILL, &iCu
11e10 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
11e20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11e30 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
11e40 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20  cache spills:   
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
11e70 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
11e80 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
11e90 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11ea0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11eb0 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43  SCHEMA_USED, &iC
11ec0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
11ed0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
11ee0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11ef0 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
11f00 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
11f10 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
11f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
11f30 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
11f40 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
11f50 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11f60 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11f70 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
11f80 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
11f90 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
11fa0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11fb0 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74  >out, "Statement
11fc0 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20   Heap/Lookaside 
11fd0 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62  Usage:      %d b
11fe0 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
11ff0 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a       iCur);.  }.
12000 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
12010 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  mt ){.    iCur =
12020 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12030 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12040 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12050 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
12060 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  P,.             
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72    bReset);.    r
12090 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
120a0 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53  out, "Fullscan S
120b0 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
120c0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
120d0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
120e0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
120f0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
12100 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
12110 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65  STATUS_SORT, bRe
12120 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12130 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12140 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73  "Sort Operations
12150 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12160 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12170 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12180 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12190 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
121a0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
121b0 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73  S_AUTOINDEX,bRes
121c0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
121d0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
121e0 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74  Autoindex Insert
121f0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12200 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12210 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12220 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12230 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12240 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12250 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74  _VM_STEP, bReset
12260 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12270 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69  f(pArg->out, "Vi
12280 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74  rtual Machine St
12290 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  eps:            
122a0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
122b0 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
122c0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
122d0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
122e0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
122f0 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65 74  EPREPARE, bReset
12300 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12310 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65  f(pArg->out, "Re
12320 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f  prepare operatio
12330 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
12340 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12350 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12360 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12370 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12380 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
12390 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  UN, bReset);.   
123a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
123b0 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
123c0 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20  f times run:    
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
123e0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
123f0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12400 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12410 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12420 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44  MTSTATUS_MEMUSED
12430 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
12440 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12450 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65  out, "Memory use
12460 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73 74  d by prepared st
12470 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22  mt:        %d\n"
12480 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69  , iCur);.  }..#i
12490 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20  fdef __linux__. 
124a0 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53   displayLinuxIoS
124b0 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b  tats(pArg->out);
124c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
124d0 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73   not remove this
124e0 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c   machine readabl
124f0 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61  e comment: extra
12500 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65  -stats-output-he
12510 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  re */..  return 
12520 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  0;.}../*.** Disp
12530 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a  lay scan stats..
12540 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
12550 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73  isplay_scanstats
12560 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12590 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68  to query */.  Sh
125a0 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20  ellState *pArg  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
125d0 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66  lState */.){.#if
125e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
125f0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
12600 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  US.  UNUSED_PARA
12610 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
12620 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41  SED_PARAMETER(pA
12630 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  rg);.#else.  int
12640 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20   i, k, n, mx;.  
12650 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12660 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
12670 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d  scanstats ------
12680 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30  --\n");.  mx = 0
12690 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d  ;.  for(k=0; k<=
126a0 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f  mx; k++){.    do
126b0 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20  uble rEstLoop = 
126c0 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  1.0;.    for(i=n
126d0 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  =0; 1; i++){.   
126e0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
126f0 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74  *p = pArg->pStmt
12700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12710 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69  int64 nLoop, nVi
12720 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  sit;.      doubl
12730 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e  e rEst;.      in
12740 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f  t iSid;.      co
12750 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  nst char *zExpla
12760 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  in;.      if( sq
12770 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12780 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12790 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f  TE_SCANSTAT_NLOO
127a0 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70  P, (void*)&nLoop
127b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
127c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
127d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
127e0 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
127f0 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12800 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a  SELECTID, (void*
12810 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69  )&iSid);.      i
12820 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20  f( iSid>mx ) mx 
12830 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66  = iSid;.      if
12840 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74  ( iSid!=k ) cont
12850 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
12860 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
12870 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62  rEstLoop = (doub
12880 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  le)nLoop;.      
12890 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f    if( k>0 ) raw_
128a0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
128b0 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71  , "-------- subq
128c0 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c  uery %d -------\
128d0 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  n", k);.      }.
128e0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
128f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
12900 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
12910 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
12920 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e  VISIT, (void*)&n
12930 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Visit);.      sq
12940 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12950 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12960 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c  TE_SCANSTAT_EST,
12970 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a   (void*)&rEst);.
12980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12990 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
129a0 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
129b0 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f  TAT_EXPLAIN, (vo
129c0 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a  id*)&zExplain);.
129d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
129e0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
129f0 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e  op %2d: %s\n", n
12a00 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  , zExplain);.   
12a10 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72     rEstLoop *= r
12a20 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  Est;.      raw_p
12a30 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12a40 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
12a50 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c       nLoop=%-8ll
12a60 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  d nRow=%-8lld es
12a70 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  tRow=%-8lld estR
12a80 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c  ow/Loop=%-8g\n",
12a90 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70  .          nLoop
12aa0 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74  , nVisit, (sqlit
12ab0 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f  e3_int64)(rEstLo
12ac0 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20  op+0.5), rEst.  
12ad0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
12ae0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
12af0 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b10 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69  -----\n");.#endi
12b20 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  f.}../*.** Param
12b30 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69  eter azArray poi
12b40 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65  nts to a zero-te
12b50 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f  rminated array o
12b60 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a  f strings. zStr.
12b70 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  ** points to a s
12b80 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ingle nul-termin
12b90 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74  ated string. Ret
12ba0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
12bb0 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c  zStr.** is equal
12bc0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  , according to s
12bd0 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20  trcmp(), to any 
12be0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 69  of the strings i
12bf0 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20  n the array..** 
12c00 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
12c10 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
12c20 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72  c int str_in_arr
12c30 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ay(const char *z
12c40 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Str, const char 
12c50 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e  **azArray){.  in
12c60 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12c70 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29  azArray[i]; i++)
12c80 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72  {.    if( 0==str
12c90 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61  cmp(zStr, azArra
12ca0 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31  y[i]) ) return 1
12cb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
12cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f  ;.}../*.** If co
12cd0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
12ce0 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f   pSql appears to
12cf0 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73   be an EXPLAIN s
12d00 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61  tatement, alloca
12d10 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  te.** and popula
12d20 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  te the ShellStat
12d30 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e.aiIndent[] arr
12d40 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ay with the numb
12d50 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20  er of.** spaces 
12d60 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75  each opcode shou
12d70 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
12d80 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70  efore it is outp
12d90 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ut..**.** The in
12da0 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72  denting rules ar
12db0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46  e:.**.**     * F
12dc0 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20  or each "Next", 
12dd0 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20  "Prev", "VNext" 
12de0 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74 72  or "VPrev" instr
12df0 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a  uction, indent.*
12e00 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f  *       all opco
12e10 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  des that occur b
12e20 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75  etween the p2 ju
12e30 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  mp destination a
12e40 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a  nd the opcode.**
12e50 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62 79         itself by
12e60 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a   2 spaces..**.**
12e70 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20       * For each 
12e80 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a  "Goto", if the j
12e90 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
12ea0 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  is earlier in th
12eb0 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20  e program.**    
12ec0 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f     and ends on o
12ed0 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20  ne of:.**       
12ee0 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74     Yield  SeekGt
12ef0 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74    SeekLt  RowSet
12f00 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20  Read  Rewind.** 
12f10 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65 20        or if the 
12f20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  P1 parameter is 
12f30 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a  one instead of z
12f40 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ero,.**       th
12f50 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70  en indent all op
12f60 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68  codes between th
12f70 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75  e earlier instru
12f80 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61  ction.**       a
12f90 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73  nd "Goto" by 2 s
12fa0 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
12fb0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
12fc0 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c  ta_prepare(Shell
12fd0 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65  State *p, sqlite
12fe0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20  3_stmt *pSql){. 
12ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
13000 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13010 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20   /* The text of 
13020 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
13030 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
13040 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
13050 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
13060 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20  o check if this 
13070 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f  is an EXPLAIN */
13080 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20  .  int *abYield 
13090 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
130a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70     /* True if op
130b0 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20   is an OP_Yield 
130c0 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
130d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
130e0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
130f0 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49  d size of p->aiI
13100 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64  ndent[], abYield
13110 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20   */.  int iOp;  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
13140 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70  f operation in p
13150 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a  ->aiIndent[] */.
13160 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
13170 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78  zNext[] = { "Nex
13180 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72  t", "Prev", "VPr
13190 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53  ev", "VNext", "S
131a0 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b  orterNext", 0 };
131b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
131c0 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69  zYield[] = { "Yi
131d0 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20  eld", "SeekLT", 
131e0 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65  "SeekGT", "RowSe
131f0 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20 20  tRead",.        
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30 20      "Rewind", 0 
13220 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13230 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47  *azGoto[] = { "G
13240 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a  oto", 0 };..  /*
13250 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f   Try to figure o
13260 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72 65  ut if this is re
13270 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e 20  ally an EXPLAIN 
13280 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68  statement. If th
13290 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62  is.  ** cannot b
132a0 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74 75  e verified, retu
132b0 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20  rn early.  */.  
132c0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
132d0 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d  mn_count(pSql)!=
132e0 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64  8 ){.    p->cMod
132f0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
13300 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
13310 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
13320 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  l(pSql);.  if( z
13330 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Sql==0 ) return;
13340 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a  .  for(z=zSql; *
13350 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  z==' ' || *z=='\
13360 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c  t' || *z=='\n' |
13370 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a  | *z=='\f' || *z
13380 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20  =='\r'; z++);.  
13390 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
133a0 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e  icmp(z, "explain
133b0 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 7) ){.    p->
133c0 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
133d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
133e0 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53  ..  for(iOp=0; S
133f0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
13400 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20 69  e3_step(pSql); i
13410 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  Op++){.    int i
13420 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72 20  ;.    int iAddr 
13430 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
13440 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  _int(pSql, 0);. 
13450 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13460 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Op = (const char
13470 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
13480 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
13490 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20 74  .    /* Set p2 t
134a0 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20 6f  o the P2 field o
134b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70  f the current op
134c0 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73 75  code. Then, assu
134d0 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ming that.    **
134e0 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72 75   p2 is an instru
134f0 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 73  ction address, s
13500 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f 70  et variable p2op
13510 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
13520 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73   that.    ** ins
13530 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
13540 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
13550 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d 61  . p2 and p2op ma
13560 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 69  y be different i
13570 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
13580 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  rent instruction
13590 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73 75   is part of a su
135a0 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72 61  b-program genera
135b0 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a  ted by an.    **
135c0 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72 20   SQL trigger or 
135d0 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f  foreign key.  */
135e0 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73 71  .    int p2 = sq
135f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13600 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69  (pSql, 3);.    i
13610 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b 20  nt p2op = (p2 + 
13620 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20  (iOp-iAddr));.. 
13630 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 70     /* Grow the p
13640 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61 79  ->aiIndent array
13650 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   as required */.
13660 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c      if( iOp>=nAl
13670 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  loc ){.      if(
13680 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20   iOp==0 ){.     
13690 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65 72     /* Do further
136a0 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68 61   verfication tha
136b0 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61 69  t this is explai
136c0 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72 74  n output.  Abort
136d0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   if.        ** i
136e0 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20  t is not */.    
136f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13700 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f   char *explainCo
13710 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ls[] = {.       
13720 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63      "addr", "opc
13730 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22  ode", "p1", "p2"
13740 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70  , "p3", "p4", "p
13750 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b  5", "comment" };
13760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b  .        int jj;
13770 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
13780 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28  0; jj<ArraySize(
13790 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a  explainCols); jj
137a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
137b0 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65  f( strcmp(sqlite
137c0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
137d0 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f  ql,jj),explainCo
137e0 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  ls[jj])!=0 ){.  
137f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f            p->cMo
13800 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13810 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13820 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 20  3_reset(pSql);. 
13830 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13840 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
13850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13860 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d  .      nAlloc +=
13870 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   100;.      p->a
13880 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29  iIndent = (int*)
13890 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
138a0 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e  4(p->aiIndent, n
138b0 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74  Alloc*sizeof(int
138c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
138d0 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73  >aiIndent==0 ) s
138e0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
138f0 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62 59 69  ry();.      abYi
13900 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  eld = (int*)sqli
13910 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62  te3_realloc64(ab
13920 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69  Yield, nAlloc*si
13930 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
13940 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d 3d 30    if( abYield==0
13950 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
13960 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
13970 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d      abYield[iOp]
13980 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28   = str_in_array(
13990 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20  zOp, azYield);. 
139a0 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69     p->aiIndent[i
139b0 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Op] = 0;.    p->
139c0 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b  nIndent = iOp+1;
139d0 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  ..    if( str_in
139e0 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65  _array(zOp, azNe
139f0 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  xt) ){.      for
13a00 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
13a10 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
13a20 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
13a30 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61      if( str_in_a
13a40 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f  rray(zOp, azGoto
13a50 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e  ) && p2op<p->nIn
13a60 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61 62  dent.     && (ab
13a70 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73  Yield[p2op] || s
13a80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
13a90 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20 20  t(pSql, 2)).    
13aa0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
13ab0 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
13ac0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
13ad0 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 2;.    }.  }.
13ae0 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20  .  p->iIndent = 
13af0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
13b00 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71  e(abYield);.  sq
13b10 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
13b20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
13b30 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63   the array alloc
13b40 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f  ated by explain_
13b50 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a  data_prepare()..
13b60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
13b70 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65  xplain_data_dele
13b80 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  te(ShellState *p
13b90 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
13ba0 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a  e(p->aiIndent);.
13bb0 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20    p->aiIndent = 
13bc0 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20  0;.  p->nIndent 
13bd0 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e  = 0;.  p->iInden
13be0 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
13bf0 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73 74  Disable and rest
13c00 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65 20  ore .wheretrace 
13c10 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63 65  and .selecttrace
13c20 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69   settings..*/.#i
13c30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13c40 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13c50 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13c60 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65 78  _SELECTTRACE).ex
13c70 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
13c80 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74 61  SelectTrace;.sta
13c90 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65 6c  tic int savedSel
13ca0 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
13cb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13cc0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
13cd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
13ce0 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
13cf0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
13d00 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73 74  e3WhereTrace;.st
13d10 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57 68  atic int savedWh
13d20 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ereTrace;.#endif
13d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
13d40 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
13d50 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
13d60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13d70 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13d80 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13d90 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
13da0 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
13db0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13dc0 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33  Trace;.  sqlite3
13dd0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30 3b  SelectTrace = 0;
13de0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
13df0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
13e00 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
13e10 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
13e20 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57 68  TRACE).  savedWh
13e30 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69 74  ereTrace = sqlit
13e40 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20  e3WhereTrace;.  
13e50 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
13e60 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  e = 0;.#endif.}.
13e70 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 74  static void rest
13e80 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ore_debug_trace_
13e90 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66  modes(void){.#if
13ea0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13eb0 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
13ec0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
13ed0 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73  SELECTTRACE).  s
13ee0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
13ef0 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74 54  e = savedSelectT
13f00 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
13f10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13f20 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
13f30 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
13f40 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 71  WHERETRACE).  sq
13f50 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13f60 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63  = savedWhereTrac
13f70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  e;.#endif.}../*.
13f80 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72 65  ** Run a prepare
13f90 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73  d statement.*/.s
13fa0 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f  tatic void exec_
13fb0 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20  prepared_stmt(. 
13fc0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
13fd0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14000 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
14010 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14020 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tmt             
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20   /* Statment to 
14050 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  run */.){.  int 
14060 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72  rc;..  /* perfor
14070 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  m the first step
14080 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c  .  this will tel
14090 6c 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20  l us if we.  ** 
140a0 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65  have a result se
140b0 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77  t or not and how
140c0 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a   wide it is..  *
140d0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
140e0 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
140f0 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
14100 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f  result set... */
14110 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
14120 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f  W == rc ){.    /
14130 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
14140 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
14150 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
14160 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e  d type */.    in
14170 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
14180 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
14190 74 6d 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a  tmt);.    void *
141a0 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
141b0 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a  malloc64(3*nCol*
141c0 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61  sizeof(const cha
141d0 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66  r*) + 1);.    if
141e0 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20  ( !pData ){.    
141f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14200 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
14210 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43        char **azC
14220 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70  ols = (char **)p
14230 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61  Data;      /* Na
14240 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  mes of result co
14250 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
14260 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26  har **azVals = &
14270 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20  azCols[nCol];   
14280 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
14290 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54  /.      int *aiT
142a0 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61  ypes = (int *)&a
142b0 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20  zVals[nCol]; /* 
142c0 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a  Result types */.
142d0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a        int i, x;.
142e0 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a        assert(siz
142f0 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65  eof(int) <= size
14300 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20  of(char *));.   
14310 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70     /* save off p
14320 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61  trs to column na
14330 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  mes */.      for
14340 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
14350 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f  +){.        azCo
14360 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
14370 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
14380 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
14390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b       }.      do{
143a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72  .        /* extr
143b0 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
143c0 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
143d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
143e0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
143f0 20 20 20 20 20 20 20 20 61 69 54 79 70 65 73 5b          aiTypes[
14400 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33  i] = x = sqlite3
14410 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
14420 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
14430 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f    if( x==SQLITE_
14440 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20  BLOB && pArg && 
14450 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
14460 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  E_Insert ){.    
14470 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69          azVals[i
14480 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ] = "";.        
14490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
144a0 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
144b0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
144c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
144d0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
144e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
144f0 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
14500 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
14510 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
14520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14530 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
14540 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a         break; /*
14550 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20   from for */.   
14560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14570 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f   } /* end for */
14580 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ..        /* if 
14590 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
145a0 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
145b0 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
145c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
145d0 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20  OW == rc ){.    
145e0 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68        /* call th
145f0 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
14600 61 63 6b 20 77 69 74 68 20 74 68 65 20 72 65 73  ack with the res
14610 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a  ult row data */.
14620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
14630 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72  ell_callback(pAr
14640 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c  g, nCol, azVals,
14650 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73   azCols, aiTypes
14660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
14680 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  RT;.          }e
14690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
146a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
146b0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
146c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
146d0 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20  .      } while( 
146e0 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
146f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14700 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
14710 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
14720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14730 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
14740 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14750 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
14760 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65  ocess SQL if the
14770 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20   previous shell 
14780 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22  command.** was "
14790 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73  .expert". It pas
147a0 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74  ses the SQL in t
147b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
147c0 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  nt directly to.*
147d0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70  * the sqlite3exp
147e0 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ert object..**.*
147f0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
14800 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14810 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
14820 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
14830 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
14840 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
14850 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
14860 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14870 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
14880 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
14890 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
148a0 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
148b0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
148c0 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
148d0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
148e0 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
148f0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
14900 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
14910 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c   expertHandleSQL
14920 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
14930 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74  pState, .  const
14940 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
14950 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
14960 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
14970 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
14980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
14990 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
149a0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
149b0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73  sqlite3_expert_s
149c0 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72  ql(pState->exper
149d0 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c  t.pExpert, zSql,
149e0 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
149f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14a00 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72  is called either
14a10 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65   to silently cle
14a20 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74  an up the object
14a30 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
14a40 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d  he ".expert" com
14a50 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c  mand (if bCancel
14a60 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65  ==1), or to gene
14a70 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72  rate a .** repor
14a80 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68  t from it and th
14a90 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28  en clean it up (
14aa0 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a  if bCancel==0)..
14ab0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
14ac0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
14ad0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
14ae0 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
14af0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
14b00 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
14b10 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
14b20 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
14b30 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14b40 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
14b50 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
14b60 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
14b70 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
14b80 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
14b90 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14ba0 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
14bb0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
14bc0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
14bd0 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73   int expertFinis
14be0 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  h(.  ShellState 
14bf0 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62  *pState,.  int b
14c00 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a  Cancel,.  char *
14c10 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
14c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14c30 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
14c40 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  *p = pState->exp
14c50 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61  ert.pExpert;.  a
14c60 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
14c70 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c  sert( bCancel ||
14c80 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a   pzErr==0 || *pz
14c90 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
14ca0 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20  bCancel==0 ){.  
14cb0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
14cc0 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69  tate->out;.    i
14cd0 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53  nt bVerbose = pS
14ce0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
14cf0 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d  rbose;..    rc =
14d00 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
14d10 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72  analyze(p, pzErr
14d20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d40 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73    int nQuery = s
14d50 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
14d60 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e  unt(p);.      in
14d70 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  t i;..      if( 
14d80 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
14d90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14da0 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  zCand = sqlite3_
14db0 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
14dc0 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  0,EXPERT_REPORT_
14dd0 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20  CANDIDATES);.   
14de0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
14df0 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61  out, "-- Candida
14e00 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tes ------------
14e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e20 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  -\n");.        r
14e30 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
14e40 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20  %s\n", zCand);. 
14e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
14e60 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20  (i=0; i<nQuery; 
14e70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
14e80 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
14e90 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
14ea0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
14eb0 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b  ERT_REPORT_SQL);
14ec0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
14ed0 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69  har *zIdx = sqli
14ee0 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
14ef0 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
14f00 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a  EPORT_INDEXES);.
14f10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14f20 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74  ar *zEQP = sqlit
14f30 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
14f40 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
14f50 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20  PORT_PLAN);.    
14f60 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20      if( zIdx==0 
14f70 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65  ) zIdx = "(no ne
14f80 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20  w indexes)\n";. 
14f90 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
14fa0 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
14fb0 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
14fc0 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d   "-- Query %d --
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
14ff0 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ",i+1);.        
15000 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
15010 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c  , "%s\n\n", zSql
15020 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15030 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15040 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64  out, "%s\n", zId
15050 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  x);.        raw_
15060 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
15070 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20  n", zEQP);.     
15080 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
15090 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65  qlite3_expert_de
150a0 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61  stroy(p);.  pSta
150b0 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
150c0 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  rt = 0;.  return
150d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
150e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
150f0 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f  ".expert" dot co
15100 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
15110 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f   int expertDotCo
15120 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
15130 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
15140 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
15150 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
15160 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
15170 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
15180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
15190 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
151a0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
151b0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
151c0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
151d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
151e0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
151f0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
15200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15210 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
15220 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
15230 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20  ;.  int iSample 
15240 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
15250 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15260 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d  Expert==0 );.  m
15270 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65  emset(&pState->e
15280 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  xpert, 0, sizeof
15290 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a  (ExpertInfo));..
152a0 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
152b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
152c0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rg; i++){.    ch
152d0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
152e0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
152f0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
15300 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
15310 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  +;.    n = strle
15320 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
15330 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63  n>=2 && 0==strnc
15340 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22  mp(z, "-verbose"
15350 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53  , n) ){.      pS
15360 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
15370 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
15380 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
15390 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
153a0 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e  (z, "-sample", n
153b0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
153c0 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  ==(nArg-1) ){.  
153d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
153e0 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e  (stderr, "option
153f0 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
15400 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29  ument: %s\n", z)
15410 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
15420 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
15430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15440 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74    iSample = (int
15450 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
15460 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20  Arg[++i]);.     
15470 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30     if( iSample<0
15480 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20   || iSample>100 
15490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
154a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
154b0 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61  "value out of ra
154c0 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  nge: %s\n", azAr
154d0 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
154e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
154f0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
15500 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15510 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
15520 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
15530 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
15540 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
15550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15560 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
15570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15580 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65  OK ){.    pState
15590 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
155a0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
155b0 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62  t_new(pState->db
155c0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
155d0 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
155e0 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20  .pExpert==0 ){. 
155f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15600 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33  stderr, "sqlite3
15610 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c  _expert_new: %s\
15620 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
15630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15640 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
15650 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70       sqlite3_exp
15660 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20  ert_config(.    
15670 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
15680 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58  pert.pExpert, EX
15690 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50  PERT_CONFIG_SAMP
156a0 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20  LE, iSample.    
156b0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
156c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
156d0 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
156e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
156f0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
15700 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61  ** Execute a sta
15710 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66  tement or set of
15720 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72   statements.  Pr
15730 69 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c  int.** any resul
15740 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64  t rows/columns d
15750 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
15760 63 75 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20  current mode.** 
15770 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70 70  set via the supp
15780 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  lied callback..*
15790 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72  *.** This is ver
157a0 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  y similar to SQL
157b0 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73  ite's built-in s
157c0 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a  qlite3_exec().**
157d0 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74   function except
157e0 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67   it takes a slig
157f0 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63  htly different c
15800 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63  allback.** and c
15810 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67  allback data arg
15820 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
15830 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28   int shell_exec(
15840 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15850 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15870 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
15880 53 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  State */.  const
15890 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
158c0 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20  e evaluated */. 
158d0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
15900 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20  ror msg written 
15910 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
15920 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
15930 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20   = NULL;     /* 
15940 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  Statement to exe
15950 63 75 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  cute. */.  int r
15960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15980 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
15990 6e 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20  nt rc2;.  const 
159a0 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b  char *zLeftover;
159b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69            /* Tai
159c0 6c 20 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64  l of unprocessed
159d0 20 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65   SQL */.  sqlite
159e0 33 20 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62  3 *db = pArg->db
159f0 3b 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73  ;..  if( pzErrMs
15a00 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  g ){.    *pzErrM
15a10 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  sg = NULL;.  }..
15a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15a30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15a40 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70  .  if( pArg->exp
15a50 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
15a60 20 20 20 72 63 20 3d 20 65 78 70 65 72 74 48 61     rc = expertHa
15a70 6e 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53  ndleSQL(pArg, zS
15a80 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, pzErrMsg);. 
15a90 20 20 20 72 65 74 75 72 6e 20 65 78 70 65 72 74     return expert
15aa0 46 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63  Finish(pArg, (rc
15ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a  !=SQLITE_OK), pz
15ac0 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e  ErrMsg);.  }.#en
15ad0 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53  dif..  while( zS
15ae0 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45  ql[0] && (SQLITE
15af0 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20  _OK == rc) ){.  
15b00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
15b10 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20  har *zStmtSql;. 
15b20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15b30 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
15b40 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
15b50 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20   &zLeftover);.  
15b60 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20    if( SQLITE_OK 
15b70 21 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  != rc ){.      i
15b80 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
15b90 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
15ba0 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
15bb0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
15bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
15bd0 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  ( !pStmt ){.    
15be0 20 20 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70      /* this happ
15bf0 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e  ens for a commen
15c00 74 20 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65  t or white-space
15c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   */.        zSql
15c20 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
15c30 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
15c40 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
15c50 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zSql++;.        
15c60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15c70 7d 0a 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c  }.      zStmtSql
15c80 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
15c90 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
15ca0 20 7a 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a   zStmtSql==0 ) z
15cb0 53 74 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20  StmtSql = "";.  
15cc0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
15cd0 63 65 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20  ce(zStmtSql[0]) 
15ce0 29 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20  ) zStmtSql++;.. 
15cf0 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66       /* save off
15d00 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
15d10 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  atment handle an
15d20 64 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e  d reset row coun
15d30 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
15d40 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
15d50 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  Arg->pStmt = pSt
15d60 6d 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67  mt;.        pArg
15d70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
15d80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68   }..      /* ech
15d90 6f 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  o the sql statem
15da0 65 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a  ent if echo on *
15db0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15dc0 20 26 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67   && ShellHasFlag
15dd0 28 70 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68  (pArg, SHFLG_Ech
15de0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  o) ){.        ut
15df0 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  f8_printf(pArg->
15e00 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74  out, "%s\n", zSt
15e10 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c  mtSql ? zStmtSql
15e20 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20   : zSql);.      
15e30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77  }..      /* Show
15e40 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
15e50 52 59 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20  RY PLAN if .eqp 
15e60 69 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  is on */.      i
15e70 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
15e80 3e 61 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69  >autoEQP && sqli
15e90 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
15ea0 4c 41 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c  LAIN%",zStmtSql,
15eb0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
15ec0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15ed0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20  Explain;.       
15ee0 20 63 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20   char *zEQP;.   
15ef0 20 20 20 20 20 69 6e 74 20 74 72 69 67 67 65 72       int trigger
15f00 45 51 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  EQP = 0;.       
15f10 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74   disable_debug_t
15f20 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20  race_modes();.  
15f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
15f40 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
15f50 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
15f60 47 45 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72  GER_EQP, -1, &tr
15f70 69 67 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20  iggerEQP);.     
15f80 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
15f90 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72  oEQP>=AUTOEQP_tr
15fa0 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
15fb0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
15fc0 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
15fd0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
15fe0 5f 45 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _EQP, 1, 0);.   
15ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
16000 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
16010 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51  rintf("EXPLAIN Q
16020 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a  UERY PLAN %s", z
16030 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
16040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
16050 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
16060 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
16070 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
16080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
160a0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
160b0 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c  p(pExplain)==SQL
160c0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
160d0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
160e0 72 20 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63  r *zEQPLine = (c
160f0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
16100 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
16110 45 78 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20  Explain,3);.    
16120 20 20 20 20 20 20 20 20 69 6e 74 20 69 45 71 70          int iEqp
16130 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Id = sqlite3_col
16140 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
16150 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
16160 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 20    int iParentId 
16170 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16180 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31  _int(pExplain, 1
16190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
161a0 66 28 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d  f( zEQPLine[0]==
161b0 27 2d 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72  '-' ) eqp_render
161c0 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
161d0 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70      eqp_append(p
161e0 41 72 67 2c 20 69 45 71 70 49 64 2c 20 69 50 61  Arg, iEqpId, iPa
161f0 72 65 6e 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65  rentId, zEQPLine
16200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16210 20 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e           eqp_ren
16220 64 65 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20  der(pArg);.     
16230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
16240 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
16250 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  xplain);.       
16260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
16270 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QP);.        if(
16280 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
16290 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a  AUTOEQP_full ){.
162a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73            /* Als
162b0 6f 20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20  o do an EXPLAIN 
162c0 66 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c 22 20  for ".eqp full" 
162d0 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  mode */.        
162e0 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33    zEQP = sqlite3
162f0 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
16300 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29  N %s", zStmtSql)
16310 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16320 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
16330 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
16340 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
16350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
16360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16370 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
16380 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
16390 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
163a0 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
163b0 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70  _prepare(pArg, p
163c0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
163d0 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61        exec_prepa
163e0 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70  red_stmt(pArg, p
163f0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
16400 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
16410 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b  ta_delete(pArg);
16420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16440 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
16450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16460 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b  ite3_free(zEQP);
16470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16480 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
16490 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72  oEQP>=AUTOEQP_tr
164a0 69 67 67 65 72 20 26 26 20 74 72 69 67 67 65 72  igger && trigger
164b0 45 51 50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQP==0 ){.      
164c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
164d0 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45  onfig(db, SQLITE
164e0 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
164f0 52 5f 45 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20  R_EQP, 0, 0);.  
16500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 72 65          /* Repre
16510 70 61 72 65 20 70 53 74 6d 74 20 62 65 66 6f 72  pare pStmt befor
16520 65 20 72 65 61 63 74 69 76 69 6e 67 20 74 72 61  e reactiving tra
16530 63 65 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20  ce modes */.    
16540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
16550 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
16560 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16570 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
16580 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
16590 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
165a0 69 66 28 20 70 41 72 67 20 29 20 70 41 72 67 2d  if( pArg ) pArg-
165b0 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
165c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165d0 20 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f    restore_debug_
165e0 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20  trace_modes();. 
165f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
16600 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
16610 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16620 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20  pArg->mode;.    
16630 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
16640 74 6f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  toExplain ){.   
16650 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16660 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
16670 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20  pStmt)==8.      
16680 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
16690 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e  strlike("EXPLAIN
166a0 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
166b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
166c0 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
166d0 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
166e0 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
166f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16700 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
16710 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34  _count(pStmt)==4
16720 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
16730 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
16740 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
16750 41 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30  AN%", zStmtSql,0
16760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
16770 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
16780 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20  = MODE_EQP;.    
16790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
167a0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  }..        /* If
167b0 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75   the shell is cu
167c0 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70  rrently in ".exp
167d0 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68  lain" mode, gath
167e0 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20  er the extra.   
167f0 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71       ** data req
16800 75 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64  uired to add ind
16810 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ents to the outp
16820 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ut.*/.        if
16830 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d  ( pArg->cMode==M
16840 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
16850 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
16860 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
16870 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  rg, pStmt);.    
16880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
16890 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
168a0 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
168b0 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  tmt);.      expl
168c0 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
168d0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70  pArg);.      eqp
168e0 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a  _render(pArg);..
168f0 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
16900 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
16910 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
16920 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
16930 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
16940 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
16950 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
16960 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16970 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
16980 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
16990 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
169a0 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
169b0 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
169c0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
169d0 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
169e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
169f0 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
16a00 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
16a10 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
16a20 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
16a30 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
16a40 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
16a50 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
16a60 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
16a70 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16a80 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
16a90 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
16aa0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
16ab0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
16ac0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
16ad0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
16ae0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
16af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
16b10 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
16b20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
16b30 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
16b40 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
16b50 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
16b60 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
16b70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
16b80 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
16b90 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
16ba0 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
16bb0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
16bc0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
16bd0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
16be0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
16bf0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
16c00 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
16c10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16c20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
16c30 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
16c40 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
16c50 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
16c60 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
16c70 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
16c80 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
16c90 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
16ca0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
16cb0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
16cc0 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
16cd0 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
16ce0 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
16cf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
16d00 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
16d10 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
16d20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
16d30 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
16d40 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
16d50 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
16d60 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
16d70 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
16d80 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
16d90 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
16da0 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
16db0 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
16dc0 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
16dd0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
16de0 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
16df0 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
16e00 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
16e10 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
16e20 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
16e30 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
16e40 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
16e50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
16e60 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
16e70 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
16e80 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
16e90 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
16ea0 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
16eb0 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
16ec0 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
16ed0 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
16ee0 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
16ef0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
16f00 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
16f10 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
16f20 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
16f30 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
16f40 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
16f50 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
16f60 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
16f70 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
16f80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
16f90 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
16fa0 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
16fb0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
16fc0 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
16fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
16fe0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
16ff0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
17000 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
17010 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
17020 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
17030 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
17040 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
17050 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
17060 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
17070 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
17080 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
17090 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
170a0 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
170b0 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
170c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
170d0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
170e0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
170f0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
17100 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
17110 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
17120 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
17130 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
17140 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
17150 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
17160 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
17170 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
17180 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
17190 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
171a0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
171b0 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
171c0 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
171d0 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
171e0 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
171f0 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
17200 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
17210 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17220 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
17230 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
17240 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
17250 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17260 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
17270 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
17280 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
17290 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
172a0 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
172b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
172c0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
172d0 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
172f0 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
17300 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
17310 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
17320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
17330 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
17340 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
17350 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17360 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
17370 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17380 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
17390 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
173a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
173b0 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
173c0 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
173d0 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
173e0 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
173f0 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
17400 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
17410 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
17420 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
17430 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
17440 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
17450 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
17460 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
17470 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
17480 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
17490 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
174a0 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
174b0 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
174c0 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
174d0 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
174e0 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
174f0 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
17500 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
17510 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
17520 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
17530 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
17540 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
17550 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
17560 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
17570 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
17580 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
17590 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
175a0 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
175b0 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
175c0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
175d0 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
175e0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
175f0 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
17600 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
17610 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
17620 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
17630 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
17640 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
17650 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
17660 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
17670 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
17680 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
17690 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
176a0 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
176b0 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
176c0 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
176d0 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
176e0 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
176f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
17700 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
17710 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
17720 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
17750 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
17760 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
17770 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
17780 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
17790 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
177a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
177b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
177c0 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
177d0 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
177e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
177f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
17800 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
17810 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
17820 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17830 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
17840 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
17850 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
17860 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
17870 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
17880 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
17890 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
178a0 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
178b0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
178c0 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
178d0 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
178e0 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
178f0 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
17900 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
17910 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
17920 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
17930 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
17940 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
17950 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
17960 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
17970 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
17980 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17990 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
179a0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
179b0 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
179c0 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
179d0 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
179e0 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
179f0 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
17a00 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
17a10 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
17a20 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
17a30 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
17a40 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
17a50 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
17a60 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
17a70 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
17a80 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
17a90 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
17aa0 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
17ab0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17ac0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
17ad0 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
17ae0 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
17af0 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
17b00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17b10 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
17b20 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
17b30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17b40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17b50 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
17b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
17b70 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
17b80 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
17b90 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
17ba0 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
17bb0 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
17bc0 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
17bd0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
17be0 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
17bf0 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
17c00 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
17c10 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
17c20 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
17c30 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
17c40 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
17c50 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
17c60 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17c70 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
17c80 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
17c90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17ca0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
17cb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
17cc0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
17cd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
17ce0 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
17cf0 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
17d00 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
17d10 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
17d20 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
17d30 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
17d40 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
17d50 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
17d60 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
17d70 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
17d80 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
17d90 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
17da0 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
17db0 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
17dc0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
17dd0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
17de0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
17df0 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
17e00 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
17e10 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
17e20 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
17e30 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
17e40 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
17e50 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
17e60 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
17e70 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
17e80 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
17e90 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
17ea0 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
17eb0 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
17ec0 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
17ed0 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
17ee0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
17ef0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17f00 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
17f10 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
17f20 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
17f30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
17f40 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
17f50 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
17f60 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
17f70 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
17f80 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
17f90 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
17fa0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
17fb0 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
17fc0 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
17fd0 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
17fe0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
17ff0 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
18000 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
18010 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
18020 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
18030 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
18040 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
18050 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
18060 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
18070 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
18080 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
18090 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
180a0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
180b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
180c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
180d0 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
180e0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
180f0 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
18100 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
18110 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
18120 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
18130 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18140 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
18150 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
18160 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
18170 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
18180 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
18190 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
181a0 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
181b0 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
181c0 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
181d0 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
181e0 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
181f0 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
18200 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
18210 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
18220 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
18230 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
18240 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
18250 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
18260 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
18270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
18280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
18290 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
182a0 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
182b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
182c0 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
182d0 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
182e0 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
182f0 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
18300 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
18310 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
18320 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
18330 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
18340 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
18350 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
18360 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
18370 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
18380 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
18390 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
183a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
183b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
183c0 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
183d0 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
183e0 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
183f0 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
18400 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
18410 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
18420 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
18430 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
18440 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
18450 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
18460 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
18470 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
18480 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
18490 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
184a0 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
184b0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
184c0 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
184d0 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
184e0 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
184f0 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
18500 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
18510 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
18520 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
18530 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
18540 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
18550 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
18560 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
18570 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18580 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
18590 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
185a0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
185b0 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
185c0 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
185d0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
185e0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
185f0 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
18600 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
18610 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
18620 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
18630 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
18640 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
18650 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
18660 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
18670 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
18680 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
18690 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
186a0 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
186b0 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
186c0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
186d0 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
186e0 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
186f0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18700 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
18710 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
18720 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
18730 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
18740 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
18750 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
18760 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18770 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
18780 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
18790 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
187a0 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
187b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
187c0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
187d0 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
187e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
187f0 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
18800 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
18810 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
18820 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
18830 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
18840 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
18850 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
18860 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
18870 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
18880 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
18890 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
188a0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
188b0 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
188c0 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
188d0 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
188e0 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
188f0 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
18900 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
18910 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
18920 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
18930 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18940 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
18950 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
18960 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
18970 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
18980 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
18990 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
189a0 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
189b0 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
189c0 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
189d0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
189e0 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
189f0 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
18a00 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
18a10 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
18a20 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
18a30 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
18a40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
18a50 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
18a60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18a70 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
18a80 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
18a90 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
18aa0 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
18ab0 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
18ac0 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
18ad0 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
18ae0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
18af0 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
18b00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
18b10 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
18b20 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
18b30 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
18b40 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
18b50 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
18b60 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
18b70 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
18b80 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
18b90 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18ba0 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
18bb0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
18bc0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
18bd0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
18be0 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
18bf0 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
18c00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18c10 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
18c20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
18c30 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
18c40 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
18c50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18c60 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
18c70 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
18c80 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
18c90 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
18ca0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
18cb0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
18cc0 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
18cd0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
18ce0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
18cf0 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
18d00 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
18d10 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
18d20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
18d30 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
18d40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
18d50 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
18d60 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
18d70 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
18d80 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
18d90 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
18da0 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
18db0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18dc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18dd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
18de0 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
18df0 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
18e00 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
18e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
18e30 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
18e40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
18e50 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
18e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18e70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
18e80 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65   of help message
18e90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c  s..**.** The hel
18ea0 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  p text for each 
18eb0 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61  individual comma
18ec0 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  nd begins with a
18ed0 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74   line that start
18ee0 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20  s.** with ".".  
18ef0 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73  Subsequent lines
18f00 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61   are supplimenta
18f10 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18f20 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
18f30 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
18f40 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68  paces between th
18f50 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d  e end of the com
18f60 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mand and the.** 
18f70 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73  start of the des
18f80 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74  cription of what
18f90 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f   that command do
18fa0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
18fb0 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c  nst char *(azHel
18fc0 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66  p[]) = {.#if def
18fd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
18fe0 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e  _ZLIB) && !defin
18ff0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
19000 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22  IRTUALTABLE).  "
19010 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20  .archive ...    
19020 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20           Manage 
19030 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20  SQL archives",. 
19040 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e   "   Each comman
19050 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  d must have exac
19060 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
19070 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73  ollowing options
19080 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20  :",.  "     -c, 
19090 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20  --create        
190a0 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
190b0 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20  new archive",.  
190c0 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61  "     -u, --upda
190d0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
190e0 20 55 70 64 61 74 65 20 6f 72 20 61 64 64 20 66   Update or add f
190f0 69 6c 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74  iles to an exist
19100 69 6e 67 20 61 72 63 68 69 76 65 22 2c 0a 20 20  ing archive",.  
19110 22 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74  "     -t, --list
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f   List contents o
19140 66 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  f archive",.  " 
19150 20 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63      -x, --extrac
19160 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  t              E
19170 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
19180 6d 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  m archive",.  " 
19190 20 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d    Optional argum
191a0 65 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ents:",.  "     
191b0 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20  -v, --verbose   
191c0 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74             Print
191d0 20 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61   each filename a
191e0 73 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65  s it is processe
191f0 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46  d",.  "     -f F
19200 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45  ILE, --file FILE
19210 20 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f         Operate o
19220 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28  n archive FILE (
19230 64 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65  default is curre
19240 6e 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20  nt db)",.  "    
19250 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65   -a FILE, --appe
19260 6e 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72  nd FILE     Oper
19270 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e  ate on FILE open
19280 65 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e  ed using the apn
19290 64 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20  dvfs VFS",.  "  
192a0 20 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72     -C DIR, --dir
192b0 65 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68  ectory DIR    Ch
192c0 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
192d0 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78  y DIR to read/ex
192e0 74 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20  tract files",.  
192f0 22 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72  "     -n, --dryr
19300 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
19310 20 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68   Show the SQL th
19320 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63  at would have oc
19330 63 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45  curred",.  "   E
19340 78 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20  xamples:",.  "  
19350 20 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69     .ar -cf archi
19360 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20  ve.sar foo bar  
19370 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65  # Create archive
19380 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20  .sar from files 
19390 66 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20  foo and bar",.  
193a0 22 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72  "     .ar -tf ar
193b0 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20  chive.sar       
193c0 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72     # List member
193d0 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72  s of archive.sar
193e0 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d  ",.  "     .ar -
193f0 78 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  xvf archive.sar 
19400 20 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73          # Verbos
19410 65 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65  ely extract file
19420 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73  s from archive.s
19430 61 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61  ar",.  "   See a
19440 6c 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  lso:",.  "      
19450 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
19460 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72  g/cli.html#sqlar
19470 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74  _archive_support
19480 22 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ",.#endif.#ifnde
19490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
194a0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e  THORIZATION.  ".
194b0 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20  auth ON|OFF     
194c0 20 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74          Show aut
194d0 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
194e0 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62  s",.#endif.  ".b
194f0 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20  ackup ?DB? FILE 
19500 20 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42         Backup DB
19510 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
19520 5c 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  \") to FILE",.  
19530 22 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64  "       --append
19540 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
19550 74 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a  the appendvfs",.
19560 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20    ".bail on|off 
19570 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70              Stop
19580 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61   after hitting a
19590 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c  n error.  Defaul
195a0 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62 69 6e 61  t OFF",.  ".bina
195b0 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ry on|off       
195c0 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20      Turn binary 
195d0 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66  output on or off
195e0 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c  .  Default OFF",
195f0 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52  .  ".cd DIRECTOR
19600 59 20 20 20 20 20 20 20 20 20 20 20 20 43 68 61  Y            Cha
19610 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20  nge the working 
19620 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52  directory to DIR
19630 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e 63 68 61  ECTORY",.  ".cha
19640 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  nges on|off     
19650 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72       Show number
19660 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64   of rows changed
19670 20 62 79 20 53 51 4c 22 2c 0a 20 20 22 2e 63 68   by SQL",.  ".ch
19680 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20  eck GLOB        
19690 20 20 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75        Fail if ou
196a0 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74  tput since .test
196b0 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  case does not ma
196c0 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20  tch",.  ".clone 
196d0 4e 45 57 44 42 20 20 20 20 20 20 20 20 20 20 20  NEWDB           
196e0 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74    Clone data int
196f0 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65  o NEWDB from the
19700 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
19710 73 65 22 2c 0a 20 20 22 2e 64 61 74 61 62 61 73  se",.  ".databas
19720 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
19730 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20   List names and 
19740 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65  files of attache
19750 64 20 64 61 74 61 62 61 73 65 73 22 2c 0a 20 20  d databases",.  
19760 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20  ".dbconfig ?op? 
19770 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73 74 20 6f  ?val?     List o
19780 72 20 63 68 61 6e 67 65 20 73 71 6c 69 74 65 33  r change sqlite3
19790 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74  _db_config() opt
197a0 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62 69 6e 66  ions",.  ".dbinf
197b0 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20 20 20  o ?DB?          
197c0 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20 69     Show status i
197d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
197e0 20 74 68 65 20 64 61 74 61 62 61 73 65 22 2c 0a   the database",.
197f0 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f    ".dump ?TABLE?
19800 20 2e 2e 2e 20 20 20 20 20 20 20 20 52 65 6e 64   ...        Rend
19810 65 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  er all database 
19820 63 6f 6e 74 65 6e 74 20 61 73 20 53 51 4c 22 2c  content as SQL",
19830 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 73 3a 22  .  "   Options:"
19840 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70 72 65 73  ,.  "     --pres
19850 65 72 76 65 2d 72 6f 77 69 64 73 20 20 20 20 20  erve-rowids     
19860 20 49 6e 63 6c 75 64 65 20 52 4f 57 49 44 20 76   Include ROWID v
19870 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6f 75 74  alues in the out
19880 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d  put",.  "     --
19890 6e 65 77 6c 69 6e 65 73 20 20 20 20 20 20 20 20  newlines        
198a0 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e 65 73 63       Allow unesc
198b0 61 70 65 64 20 6e 65 77 6c 69 6e 65 20 63 68 61  aped newline cha
198c0 72 61 63 74 65 72 73 20 69 6e 20 6f 75 74 70 75  racters in outpu
198d0 74 22 2c 0a 20 20 22 20 20 20 54 41 42 4c 45 20  t",.  "   TABLE 
198e0 69 73 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20  is LIKE pattern 
198f0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73 20 74  for the tables t
19900 6f 20 64 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68  o dump",.  ".ech
19910 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  o on|off        
19920 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e       Turn comman
19930 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66  d echo on or off
19940 22 2c 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66  ",.  ".eqp on|of
19950 66 7c 66 75 6c 6c 20 20 20 20 20 20 20 20 20 45  f|full         E
19960 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
19970 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41   automatic EXPLA
19980 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a  IN QUERY PLAN",.
19990 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20    ".excel       
199a0 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73 70              Disp
199b0 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f  lay the output o
199c0 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69  f next command i
199d0 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22  n a spreadsheet"
199e0 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45  ,.  ".exit ?CODE
199f0 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ?             Ex
19a00 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20  it this program 
19a10 77 69 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65  with return-code
19a20 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65   CODE",.  ".expe
19a30 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
19a40 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c      EXPERIMENTAL
19a50 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78 65  . Suggest indexe
19a60 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64 20  s for specified 
19a70 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63  queries",./* Bec
19a80 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64  ause explain mod
19a90 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d  e comes on autom
19aa0 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68  atically now, th
19ab0 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64  e ".explain" mod
19ac0 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20  e.** is removed 
19ad0 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63  from the help sc
19ae0 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69  reen.  It is sti
19af0 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  ll supported for
19b00 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72   legacy, however
19b10 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20   */./*".explain 
19b20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20  ?on|off|auto?   
19b30 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74  Turn EXPLAIN out
19b40 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f  put mode on or o
19b50 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74  ff or to automat
19b60 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73  ic",*/.  ".fulls
19b70 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
19b80 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61     Show schema a
19b90 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nd the content o
19ba0 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61  f sqlite_stat ta
19bb0 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65  bles",.  ".heade
19bc0 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
19bd0 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20     Turn display 
19be0 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  of headers on or
19bf0 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20   off",.  ".help 
19c00 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f  ?-all? ?PATTERN?
19c10 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78     Show help tex
19c20 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a  t for PATTERN",.
19c30 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20    ".import FILE 
19c40 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f  TABLE       Impo
19c50 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
19c60 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23  E into TABLE",.#
19c70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19c80 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a  IT_TEST_CONTROL.
19c90 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44    ".imposter IND
19ca0 45 58 20 54 41 42 4c 45 20 20 20 20 43 72 65 61  EX TABLE    Crea
19cb0 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  te imposter tabl
19cc0 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78  e TABLE on index
19cd0 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a   INDEX",.#endif.
19ce0 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42    ".indexes ?TAB
19cf0 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77  LE?         Show
19d00 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65   names of indexe
19d10 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  s",.  "         
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 49 66 20 54 41 42 4c 45 20 69 73 20 73 70    If TABLE is sp
19d40 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
19d50 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c  ow indexes for",
19d60 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19d80 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54  ables matching T
19d90 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c  ABLE using the L
19da0 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a  IKE operator.",.
19db0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19dc0 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22  ABLE_IOTRACE.  "
19dd0 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20  .iotrace FILE   
19de0 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
19df0 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
19e00 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c  ogging to FILE",
19e10 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69  .#endif.  ".limi
19e20 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20  t ?LIMIT? ?VAL? 
19e30 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63      Display or c
19e40 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
19e50 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d  of an SQLITE_LIM
19e60 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50  IT",.  ".lint OP
19e70 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20  TIONS           
19e80 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61   Report potentia
19e90 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e  l schema issues.
19ea0 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f  ",.  "     Optio
19eb0 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
19ec0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20   fkey-indexes   
19ed0 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66    Find missing f
19ee0 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78  oreign key index
19ef0 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es",.#ifndef SQL
19f00 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
19f10 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64  TENSION.  ".load
19f20 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20   FILE ?ENTRY?   
19f30 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
19f40 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a  nsion library",.
19f50 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46  #endif.  ".log F
19f60 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
19f70 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20     Turn logging 
19f80 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45  on or off.  FILE
19f90 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73   can be stderr/s
19fa0 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65  tdout",.  ".mode
19fb0 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
19fc0 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
19fd0 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45  ode",.  "   MODE
19fe0 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20   is one of:",.  
19ff0 22 20 20 20 20 20 61 73 63 69 69 20 20 20 20 43  "     ascii    C
1a000 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69  olumns/rows deli
1a010 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61 6e  mited by 0x1F an
1a020 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20  d 0x1E",.  "    
1a030 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
1a040 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
1a050 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d  ",.  "     colum
1a060 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64  n   Left-aligned
1a070 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20   columns.  (See 
1a080 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20  .width)",.  "   
1a090 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
1a0a0 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20  <table> code",. 
1a0b0 20 22 20 20 20 20 20 69 6e 73 65 72 74 20 20 20   "     insert   
1a0c0 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65  SQL insert state
1a0d0 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22  ments for TABLE"
1a0e0 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20  ,.  "     line  
1a0f0 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
1a100 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20   line",.  "     
1a110 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20  list     Values 
1a120 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c  delimited by \"|
1a130 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f  \"",.  "     quo
1a140 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e 73  te    Escape ans
1a150 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22  wers as for SQL"
1a160 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73 20 20  ,.  "     tabs  
1a170 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
1a180 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20   values",.  "   
1a190 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
1a1a0 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20  ist elements",. 
1a1b0 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
1a1c0 49 4e 47 20 20 20 20 20 20 20 20 55 73 65 20 53  ING        Use S
1a1d0 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
1a1e0 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a  f NULL values",.
1a1f0 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c    ".once (-e|-x|
1a200 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70  FILE)       Outp
1a210 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ut for the next 
1a220 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79  SQL command only
1a230 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
1a240 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e     If FILE begin
1a250 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20  s with '|' then 
1a260 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c  open as a pipe",
1a270 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f  .  "     Other o
1a280 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1a290 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65      -e    Invoke
1a2a0 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64 69   system text edi
1a2b0 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20  tor",.  "       
1a2c0 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20  -x    Open in a 
1a2d0 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20  spreadsheet",.  
1a2e0 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
1a2f0 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20   ?FILE?   Close 
1a300 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
1a310 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c  e and reopen FIL
1a320 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69  E",.  "     Opti
1a330 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1a340 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20    --append      
1a350 20 20 55 73 65 20 61 70 70 65 6e 64 76 66 73 20    Use appendvfs 
1a360 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61 62 61  to append databa
1a370 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
1a380 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1a390 20 20 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65     --deserialize
1a3a0 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d 65 6d     Load into mem
1a3b0 6f 72 79 20 75 73 65 69 6e 67 20 73 71 6c 69 74  ory useing sqlit
1a3c0 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29  e3_deserialize()
1a3d0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1a3e0 6e 65 77 20 20 20 20 20 20 20 20 20 20 20 49 6e  new           In
1a3f0 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f  itialize FILE to
1a400 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61   an empty databa
1a410 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  se",.  "        
1a420 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 20 20  --readonly      
1a430 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e  Open FILE readon
1a440 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  ly",.  "        
1a450 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20 20 20  --zip           
1a460 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61 72  FILE is a ZIP ar
1a470 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74 70  chive",.  ".outp
1a480 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20  ut ?FILE?       
1a490 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
1a4a0 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75  to FILE or stdou
1a4b0 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d 69  t if FILE is omi
1a4c0 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20 49  tted",.  "     I
1a4d0 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69  f FILE begins wi
1a4e0 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e  th '|' then open
1a4f0 20 69 74 20 61 73 20 61 20 70 69 70 65 2e 22 2c   it as a pipe.",
1a500 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e  .  ".print STRIN
1a510 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50 72 69  G...         Pri
1a520 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
1a530 47 22 2c 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d  G",.  ".prompt M
1a540 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20 20  AIN CONTINUE    
1a550 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e  Replace the stan
1a560 64 61 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a 20  dard prompts",. 
1a570 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
1a580 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
1a590 74 68 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a 20  this program",. 
1a5a0 20 22 2e 72 65 61 64 20 46 49 4c 45 20 20 20 20   ".read FILE    
1a5b0 20 20 20 20 20 20 20 20 20 20 20 52 65 61 64 20             Read 
1a5c0 69 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c 45 22  input from FILE"
1a5d0 2c 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44  ,.  ".restore ?D
1a5e0 42 3f 20 46 49 4c 45 20 20 20 20 20 20 20 52 65  B? FILE       Re
1a5f0 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  store content of
1a600 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
1a610 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45  ain\") from FILE
1a620 22 2c 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45  ",.  ".save FILE
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
1a640 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  rite in-memory d
1a650 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c  atabase into FIL
1a660 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61 74  E",.  ".scanstat
1a670 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  s on|off        
1a680 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  Turn sqlite3_stm
1a690 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d  t_scanstatus() m
1a6a0 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66  etrics on or off
1a6b0 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50  ",.  ".schema ?P
1a6c0 41 54 54 45 52 4e 3f 20 20 20 20 20 20 20 20 53  ATTERN?        S
1a6d0 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73  how the CREATE s
1a6e0 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69  tatements matchi
1a6f0 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22  ng PATTERN",.  "
1a700 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a       Options:",.
1a710 20 20 22 20 20 20 20 20 20 20 20 20 2d 2d 69 6e    "         --in
1a720 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  dent            
1a730 54 72 79 20 74 6f 20 70 72 65 74 74 79 2d 70 72  Try to pretty-pr
1a740 69 6e 74 20 74 68 65 20 73 63 68 65 6d 61 22 2c  int the schema",
1a750 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f  .  ".selftest ?O
1a760 50 54 49 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e  PTIONS?      Run
1a770 20 74 65 73 74 73 20 64 65 66 69 6e 65 64 20 69   tests defined i
1a780 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74  n the SELFTEST t
1a790 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f 70  able",.  "    Op
1a7a0 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1a7b0 20 20 20 2d 2d 69 6e 69 74 20 20 20 20 20 20 20     --init       
1a7c0 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61          Create a
1a7d0 20 6e 65 77 20 53 45 4c 46 54 45 53 54 20 74 61   new SELFTEST ta
1a7e0 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ble",.  "       
1a7f0 2d 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -v              
1a800 20 20 20 20 20 56 65 72 62 6f 73 65 20 6f 75 74       Verbose out
1a810 70 75 74 22 2c 0a 20 20 22 2e 73 65 70 61 72 61  put",.  ".separa
1a820 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20  tor COL ?ROW?   
1a830 20 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c    Change the col
1a840 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73 65 70 61  umn and row sepa
1a850 72 61 74 6f 72 73 22 2c 0a 23 69 66 20 64 65 66  rators",.#if def
1a860 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1a870 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e  LE_SESSION).  ".
1a880 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43  session ?NAME? C
1a890 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f  MD ...  Create o
1a8a0 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f  r control sessio
1a8b0 6e 73 22 2c 0a 20 20 22 20 20 20 53 75 62 63 6f  ns",.  "   Subco
1a8c0 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20  mmands:",.  "   
1a8d0 20 20 61 74 74 61 63 68 20 54 41 42 4c 45 20 20    attach TABLE  
1a8e0 20 20 20 20 20 20 20 20 20 20 20 41 74 74 61 63             Attac
1a8f0 68 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20  h TABLE",.  "   
1a900 20 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45    changeset FILE
1a910 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
1a920 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74   a changeset int
1a930 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20  o FILE",.  "    
1a940 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20   close          
1a950 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20            Close 
1a960 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20  one session",.  
1a970 22 20 20 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f  "     enable ?BO
1a980 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53  OLEAN?         S
1a990 65 74 20 6f 72 20 71 75 65 72 79 20 74 68 65 20  et or query the 
1a9a0 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a 20 20 22  enable bit",.  "
1a9b0 20 20 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42       filter GLOB
1a9c0 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65  ...           Re
1a9d0 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63  ject tables matc
1a9e0 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22  hing GLOBs",.  "
1a9f0 20 20 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42       indirect ?B
1aa00 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61  OOLEAN?       Ma
1aa10 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65 20  rk or query the 
1aa20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73 22  indirect status"
1aa30 2c 0a 20 20 22 20 20 20 20 20 69 73 65 6d 70 74  ,.  "     isempt
1aa40 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
1aa50 20 20 20 51 75 65 72 79 20 77 68 65 74 68 65 72     Query whether
1aa60 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
1aa70 65 6d 70 74 79 22 2c 0a 20 20 22 20 20 20 20 20  empty",.  "     
1aa80 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1aa90 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 75           List cu
1aaa0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73  rrently open ses
1aab0 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22  sion names",.  "
1aac0 20 20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d       open DB NAM
1aad0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70  E             Op
1aae0 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
1aaf0 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20 20 20 20   on DB",.  "    
1ab00 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 20 20   patchset FILE  
1ab10 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1ab20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20  a patchset into 
1ab30 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 49 66 20  FILE",.  "   If 
1ab40 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65  ?NAME? is omitte
1ab50 64 2c 20 74 68 65 20 66 69 72 73 74 20 64 65 66  d, the first def
1ab60 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20  ined session is 
1ab70 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20  used.",.#endif. 
1ab80 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20   ".sha3sum ...  
1ab90 20 20 20 20 20 20 20 20 20 20 20 43 6f 6d 70 75             Compu
1aba0 74 65 20 61 20 53 48 41 33 20 68 61 73 68 20 6f  te a SHA3 hash o
1abb0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  f database conte
1abc0 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69  nt",.  "    Opti
1abd0 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1abe0 2d 2d 73 63 68 65 6d 61 20 20 20 20 20 20 20 20  --schema        
1abf0 20 20 20 20 20 20 41 6c 73 6f 20 68 61 73 68 20        Also hash 
1ac00 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1ac10 72 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20  r table",.  "   
1ac20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34 20 20 20     --sha3-224   
1ac30 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1ac40 20 73 68 61 33 2d 32 32 34 20 61 6c 67 6f 72 69   sha3-224 algori
1ac50 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  thm",.  "      -
1ac60 2d 73 68 61 33 2d 32 35 36 20 20 20 20 20 20 20  -sha3-256       
1ac70 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61       Use the sha
1ac80 33 2d 32 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e  3-256 algorithm.
1ac90 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
1aca0 66 61 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20  fault.",.  "    
1acb0 20 20 2d 2d 73 68 61 33 2d 33 38 34 20 20 20 20    --sha3-384    
1acc0 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1acd0 73 68 61 33 2d 33 38 34 20 61 6c 67 6f 72 69 74  sha3-384 algorit
1ace0 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  hm",.  "      --
1acf0 73 68 61 33 2d 35 31 32 20 20 20 20 20 20 20 20  sha3-512        
1ad00 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1ad10 2d 35 31 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c  -512 algorithm",
1ad20 0a 20 20 22 20 20 20 20 41 6e 79 20 6f 74 68 65  .  "    Any othe
1ad30 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  r argument is a 
1ad40 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72  LIKE pattern for
1ad50 20 74 61 62 6c 65 73 20 74 6f 20 68 61 73 68 22   tables to hash"
1ad60 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1ad70 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
1ad80 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47   ".shell CMD ARG
1ad90 53 2e 2e 2e 20 20 20 20 20 20 20 52 75 6e 20 43  S...       Run C
1ada0 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20  MD ARGS... in a 
1adb0 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23  system shell",.#
1adc0 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20  endif.  ".show  
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72 65    Show the curre
1adf0 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61  nt values for va
1ae00 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 22 2c  rious settings",
1ae10 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f  .  ".stats ?on|o
1ae20 66 66 3f 20 20 20 20 20 20 20 20 20 20 53 68 6f  ff?          Sho
1ae30 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20  w stats or turn 
1ae40 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22  stats on or off"
1ae50 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1ae60 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
1ae70 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52   ".system CMD AR
1ae80 47 53 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20 43  GS...      Run C
1ae90 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20  MD ARGS... in a 
1aea0 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23  system shell",.#
1aeb0 65 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c 65 73  endif.  ".tables
1aec0 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20   ?TABLE?        
1aed0 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20    List names of 
1aee0 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
1aef0 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
1af00 4c 45 22 2c 0a 20 20 22 2e 74 65 73 74 63 61 73  LE",.  ".testcas
1af10 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  e NAME          
1af20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69   Begin redirecti
1af30 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65  ng output to 'te
1af40 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 22  stcase-out.txt'"
1af50 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53  ,.  ".timeout MS
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1af70 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64  y opening locked
1af80 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d   tables for MS m
1af90 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c 0a 20 20  illiseconds",.  
1afa0 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20  ".timer on|off  
1afb0 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 53            Turn S
1afc0 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f  QL timer on or o
1afd0 66 66 22 2c 0a 20 20 22 2e 74 72 61 63 65 20 46  ff",.  ".trace F
1afe0 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
1aff0 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c   Output each SQL
1b000 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
1b010 20 69 73 20 72 75 6e 22 2c 0a 20 20 22 2e 76 66   is run",.  ".vf
1b020 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20  sinfo ?AUX?     
1b030 20 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f        Informatio
1b040 6e 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d  n about the top-
1b050 6c 65 76 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e  level VFS",.  ".
1b060 76 66 73 6c 69 73 74 20 20 20 20 20 20 20 20 20  vfslist         
1b070 20 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c          List all
1b080 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73   available VFSes
1b090 22 2c 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f  ",.  ".vfsname ?
1b0a0 41 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 50  AUX?           P
1b0b0 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66  rint the name of
1b0c0 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 22 2c   the VFS stack",
1b0d0 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20  .  ".width NUM1 
1b0e0 4e 55 4d 32 20 2e 2e 2e 20 20 20 20 20 53 65 74  NUM2 ...     Set
1b0f0 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66   column widths f
1b100 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f  or \"column\" mo
1b110 64 65 22 2c 0a 20 20 22 20 20 20 20 20 4e 65 67  de",.  "     Neg
1b120 61 74 69 76 65 20 76 61 6c 75 65 73 20 72 69 67  ative values rig
1b130 68 74 2d 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a  ht-justify",.};.
1b140 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65  ./*.** Output he
1b150 6c 70 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a  lp text..**.** z
1b160 50 61 74 74 65 72 6e 20 64 65 73 63 72 69 62 65  Pattern describe
1b170 73 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6d  s the set of com
1b180 6d 61 6e 64 73 20 66 6f 72 20 77 68 69 63 68 20  mands for which 
1b190 68 65 6c 70 20 74 65 78 74 20 69 73 20 70 72 6f  help text is pro
1b1a0 76 69 64 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61  vided..** If zPa
1b1b0 74 74 65 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74  ttern is NULL, t
1b1c0 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d  hen show all com
1b1d0 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20  mands, but only 
1b1e0 67 69 76 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a  give a one-line.
1b1f0 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ** description o
1b200 66 20 65 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65  f each..**.** Re
1b210 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1b220 6f 66 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73  of matches..*/.s
1b230 74 61 74 69 63 20 69 6e 74 20 73 68 6f 77 48 65  tatic int showHe
1b240 6c 70 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  lp(FILE *out, co
1b250 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65  nst char *zPatte
1b260 72 6e 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  rn){.  int i = 0
1b270 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20  ;.  int j = 0;. 
1b280 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68   int n = 0;.  ch
1b290 61 72 20 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20  ar *zPat;.  if( 
1b2a0 7a 50 61 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c  zPattern==0.   |
1b2b0 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27  | zPattern[0]=='
1b2c0 30 27 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28  0'.   || strcmp(
1b2d0 7a 50 61 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d  zPattern,"-a")==
1b2e0 30 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a  0.   || strcmp(z
1b2f0 50 61 74 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d  Pattern,"-all")=
1b300 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b310 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73  how all commands
1b320 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c  , but only one l
1b330 69 6e 65 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20  ine per command 
1b340 2a 2f 0a 20 20 20 20 69 66 28 20 7a 50 61 74 74  */.    if( zPatt
1b350 65 72 6e 3d 3d 30 20 29 20 7a 50 61 74 74 65 72  ern==0 ) zPatter
1b360 6e 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28  n = "";.    for(
1b370 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1b380 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1b390 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70        if( azHelp
1b3a0 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a  [i][0]=='.' || z
1b3b0 50 61 74 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20  Pattern[0] ){.  
1b3c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1b3d0 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61  f(out, "%s\n", a
1b3e0 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20  zHelp[i]);.     
1b3f0 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
1b400 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b410 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63     /* Look for c
1b420 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 66 6f 72  ommands that for
1b430 20 77 68 69 63 68 20 7a 50 61 74 74 65 72 6e 20   which zPattern 
1b440 69 73 20 61 6e 20 65 78 61 63 74 20 70 72 65 66  is an exact pref
1b450 69 78 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d  ix */.    zPat =
1b460 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1b470 28 22 2e 25 73 2a 22 2c 20 7a 50 61 74 74 65 72  (".%s*", zPatter
1b480 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  n);.    for(i=0;
1b490 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48   i<ArraySize(azH
1b4a0 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  elp); i++){.    
1b4b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1b4c0 72 67 6c 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65  rglob(zPat, azHe
1b4d0 6c 70 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  lp[i])==0 ){.   
1b4e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1b4f0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1b500 48 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Help[i]);.      
1b510 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20    j = i+1;.     
1b520 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
1b530 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b540 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20  3_free(zPat);.  
1b550 20 20 69 66 28 20 6e 20 29 7b 0a 20 20 20 20 20    if( n ){.     
1b560 20 69 66 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20   if( n==1 ){.   
1b570 20 20 20 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61       /* when zPa
1b580 74 74 65 72 6e 20 69 73 20 61 20 70 72 65 66 69  ttern is a prefi
1b590 78 20 6f 66 20 65 78 61 63 74 6c 79 20 6f 6e 65  x of exactly one
1b5a0 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69   command, then i
1b5b0 6e 63 6c 75 64 65 20 74 68 65 0a 20 20 20 20 20  nclude the.     
1b5c0 20 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66     ** details of
1b5d0 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77   that command, w
1b5e0 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 67 69  hich should begi
1b5f0 6e 20 61 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f  n at offset j */
1b600 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1b610 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  j<ArraySize(azHe
1b620 6c 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b  lp)-1 && azHelp[
1b630 6a 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20  j][0]!='.' ){.  
1b640 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1b650 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1b660 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20   azHelp[j]);.   
1b670 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
1b680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b690 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20      return n;.  
1b6a0 20 20 7d 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20    }.    /* Look 
1b6b0 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  for commands tha
1b6c0 74 20 63 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65  t contain zPatte
1b6d0 72 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 53 68  rn anywhere.  Sh
1b6e0 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a  ow the complete.
1b6f0 20 20 20 20 2a 2a 20 74 65 78 74 20 6f 66 20 61      ** text of a
1b700 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  ll commands that
1b710 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a   match. */.    z
1b720 50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Pat = sqlite3_mp
1b730 72 69 6e 74 66 28 22 25 25 25 73 25 25 22 2c 20  rintf("%%%s%%", 
1b740 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66  zPattern);.    f
1b750 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
1b760 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b  ize(azHelp); i++
1b770 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48  ){.      if( azH
1b780 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29  elp[i][0]=='.' )
1b790 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66   j = i;.      if
1b7a0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
1b7b0 65 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69  e(zPat, azHelp[i
1b7c0 5d 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], 0)==0 ){.    
1b7d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1b7e0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1b7f0 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  elp[j]);.       
1b800 20 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53   while( j<ArrayS
1b810 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26  ize(azHelp)-1 &&
1b820 20 61 7a 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21   azHelp[j+1][0]!
1b830 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
1b840 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
1b850 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1b860 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1b870 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [j]);.        }.
1b880 20 20 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20          i = j;. 
1b890 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1b8a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1b8b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29  lite3_free(zPat)
1b8c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
1b8d0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1b8e0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
1b8f0 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f  tic int process_
1b900 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65  input(ShellState
1b910 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a   *p, FILE *in);.
1b920 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1b930 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20  content of file 
1b940 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  zName into memor
1b950 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1b960 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1b970 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ().** and return
1b980 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1b990 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63 61  e buffer. The ca
1b9a0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1b9b0 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a  ble for freeing.
1b9c0 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a  ** the memory..*
1b9d0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1b9e0 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20  r pnByte is not 
1b9f0 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20  NULL, (*pnByte) 
1ba00 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1ba10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a  mber of bytes.**
1ba20 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
1ba30 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20   convenience, a 
1ba40 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
1ba50 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61 70  yte is always ap
1ba60 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61  pended to the da
1ba70 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20  ta read.** from 
1ba80 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  the file before 
1ba90 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72 65  the buffer is re
1baa0 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74  turned. This byt
1bab0 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  e is not include
1bac0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61  d in.** the fina
1bad0 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42  l value of (*pnB
1bae0 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61  yte), if applica
1baf0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20  ble..**.** NULL 
1bb00 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
1bb10 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ny error is enco
1bb20 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e  untered. The fin
1bb30 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42  al value of *pnB
1bb40 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69  yte.** is undefi
1bb50 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1bb60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1bb70 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74   *readFile(const
1bb80 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
1bb90 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49  t *pnByte){.  FI
1bba0 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  LE *in = fopen(z
1bbb0 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c  Name, "rb");.  l
1bbc0 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f  ong nIn;.  size_
1bbd0 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20  t nRead;.  char 
1bbe0 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d  *pBuf;.  if( in=
1bbf0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1bc00 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45   fseek(in, 0, SE
1bc10 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d  EK_END);.  nIn =
1bc20 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65   ftell(in);.  re
1bc30 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66  wind(in);.  pBuf
1bc40 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1bc50 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20  c64( nIn+1 );.  
1bc60 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 20 66  if( pBuf==0 ){ f
1bc70 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65 74 75 72  close(in); retur
1bc80 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61 64 20 3d  n 0; }.  nRead =
1bc90 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e   fread(pBuf, nIn
1bca0 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f  , 1, in);.  fclo
1bcb0 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52  se(in);.  if( nR
1bcc0 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71  ead!=1 ){.    sq
1bcd0 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75 66 29  lite3_free(pBuf)
1bce0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1bcf0 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20    }.  pBuf[nIn] 
1bd00 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74  = 0;.  if( pnByt
1bd10 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49  e ) *pnByte = nI
1bd20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66  n;.  return pBuf
1bd30 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
1bd40 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
1bd50 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c  ESSION)./*.** Cl
1bd60 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65  ose a single Ope
1bd70 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20  nSession object 
1bd80 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
1bd90 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  of its associate
1bda0 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a  d.** resources..
1bdb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1bdc0 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65  ession_close(Ope
1bdd0 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  nSession *pSessi
1bde0 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  on){.  int i;.  
1bdf0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64  sqlite3session_d
1be00 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e  elete(pSession->
1be10 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
1be20 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61  ee(pSession->zNa
1be30 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  me);.  for(i=0; 
1be40 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
1be50 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ter; i++){.    s
1be60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1be70 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
1be80 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
1be90 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1bea0 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65  >azFilter);.  me
1beb0 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30  mset(pSession, 0
1bec0 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73  , sizeof(OpenSes
1bed0 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  sion));.}.#endif
1bee0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
1bef0 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62  l OpenSession ob
1bf00 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73  jects and releas
1bf10 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  e all associated
1bf20 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23   resources..*/.#
1bf30 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1bf40 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1bf50 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ).static void se
1bf60 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28  ssion_close_all(
1bf70 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
1bf80 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1bf90 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f  =0; i<p->nSessio
1bfa0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73  n; i++){.    ses
1bfb0 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61  sion_close(&p->a
1bfc0 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d  Session[i]);.  }
1bfd0 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d  .  p->nSession =
1bfe0 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   0;.}.#else.# de
1bff0 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  fine session_clo
1c000 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66  se_all(X).#endif
1c010 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1c020 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46  tation of the xF
1c030 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  ilter function f
1c040 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69  or an open sessi
1c050 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79  on.  Omit.** any
1c060 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79   tables named by
1c070 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65   ".session filte
1c080 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f  r" but let all o
1c090 74 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75  ther table throu
1c0a0 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  gh..*/.#if defin
1c0b0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c0c0 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63  _SESSION).static
1c0d0 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c   int session_fil
1c0e0 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ter(void *pCtx, 
1c0f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1c100 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ){.  OpenSession
1c110 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70   *pSession = (Op
1c120 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b  enSession*)pCtx;
1c130 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1c140 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d  i=0; i<pSession-
1c150 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nFilter; i++){.
1c160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1c170 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e  strglob(pSession
1c180 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a  ->azFilter[i], z
1c190 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tab)==0 ) return
1c1a0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1c1b0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
1c1c0 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63  .** Try to deduc
1c1d0 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 66 69  e the type of fi
1c1e0 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73  le for zName bas
1c1f0 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e  ed on its conten
1c200 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e  t.  Return.** on
1c210 65 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f  e of the SHELL_O
1c220 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  PEN_* constants.
1c230 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1c240 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
1c250 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20 62 75  t or is empty bu
1c260 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73  t its name looks
1c270 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61   like a ZIP.** a
1c280 72 63 68 69 76 65 20 61 6e 64 20 74 68 65 20 64  rchive and the d
1c290 66 6c 74 5a 69 70 20 66 6c 61 67 20 69 73 20 74  fltZip flag is t
1c2a0 72 75 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  rue, then assume
1c2b0 20 69 74 20 69 73 20 61 20 5a 49 50 20 61 72 63   it is a ZIP arc
1c2c0 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  hive..** Otherwi
1c2d0 73 65 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f 72  se, assume an or
1c2e0 64 69 6e 61 72 79 20 64 61 74 61 62 61 73 65 20  dinary database 
1c2f0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
1c300 65 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a  e filename if.**
1c310 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74   the type cannot
1c320 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 66   be determined f
1c330 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  rom content..*/.
1c340 69 6e 74 20 64 65 64 75 63 65 44 61 74 61 62 61  int deduceDataba
1c350 73 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  seType(const cha
1c360 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66  r *zName, int df
1c370 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a  ltZip){.  FILE *
1c380 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  f = fopen(zName,
1c390 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74   "rb");.  size_t
1c3a0 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   n;.  int rc = S
1c3b0 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1c3c0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1c3d0 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29  0];.  if( f==0 )
1c3e0 7b 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5a 69  {.    if( dfltZi
1c3f0 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  p && sqlite3_str
1c400 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61  like("%.zip",zNa
1c410 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  me,0)==0 ){.    
1c420 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f     return SHELL_
1c430 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20  OPEN_ZIPFILE;.  
1c440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c450 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45  return SHELL_OPE
1c460 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a  N_NORMAL;.    }.
1c470 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65 61 64 28    }.  n = fread(
1c480 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20 66 29 3b  zBuf, 16, 1, f);
1c490 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d  .  if( n==1 && m
1c4a0 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 51 4c  emcmp(zBuf, "SQL
1c4b0 69 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20 31  ite format 3", 1
1c4c0 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c  6)==0 ){.    fcl
1c4d0 6f 73 65 28 66 29 3b 0a 20 20 20 20 72 65 74 75  ose(f);.    retu
1c4e0 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f  rn SHELL_OPEN_NO
1c4f0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73 65 65  RMAL;.  }.  fsee
1c500 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45  k(f, -25, SEEK_E
1c510 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64  ND);.  n = fread
1c520 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29  (zBuf, 25, 1, f)
1c530 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20  ;.  if( n==1 && 
1c540 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74  memcmp(zBuf, "St
1c550 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22  art-Of-SQLite3-"
1c560 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
1c570 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1c580 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c  APPENDVFS;.  }el
1c590 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c  se{.    fseek(f,
1c5a0 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b   -22, SEEK_END);
1c5b0 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a  .    n = fread(z
1c5c0 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a  Buf, 22, 1, f);.
1c5d0 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20      if( n==1 && 
1c5e0 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26  zBuf[0]==0x50 &&
1c5f0 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26   zBuf[1]==0x4b &
1c600 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a  & zBuf[2]==0x05.
1c610 20 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33         && zBuf[3
1c620 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20  ]==0x06 ){.     
1c630 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
1c640 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65  _ZIPFILE;.    }e
1c650 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20  lse if( n==0 && 
1c660 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74  dfltZip && sqlit
1c670 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69  e3_strlike("%.zi
1c680 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29  p",zName,0)==0 )
1c690 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48 45  {.      rc = SHE
1c6a0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
1c6b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c  .    }.  }.  fcl
1c6c0 6f 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e  ose(f);.  return
1c6d0 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 20 46 6c 61   rc;  .}../* Fla
1c6e0 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29  gs for open_db()
1c6f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  ..**.** The defa
1c700 75 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20  ult behavior of 
1c710 6f 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20  open_db() is to 
1c720 65 78 69 74 28 31 29 20 69 66 20 74 68 65 20 64  exit(1) if the d
1c730 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
1c740 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f  .** open.  The O
1c750 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
1c760 20 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68   flag changes th
1c770 61 74 20 73 6f 20 74 68 61 74 20 69 74 20 70 72  at so that it pr
1c780 69 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  ints an error.**
1c790 20 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72   but still retur
1c7a0 6e 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ns without calli
1c7b0 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ng exit..**.** T
1c7c0 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49  he OPEN_DB_ZIPFI
1c7d0 4c 45 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f  LE flag causes o
1c7e0 70 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66  pen_db() to pref
1c7f0 65 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73  er to open files
1c800 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63   as a.** ZIP arc
1c810 68 69 76 65 20 69 66 20 74 68 65 20 66 69 6c 65  hive if the file
1c820 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
1c830 6f 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20  or is empty and 
1c840 69 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  its name matches
1c850 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61  .** the *.zip pa
1c860 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ttern..*/.#defin
1c870 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c  e OPEN_DB_KEEPAL
1c880 49 56 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a  IVE   0x001   /*
1c890 20 52 65 74 75 72 6e 20 61 66 74 65 72 20 65 72   Return after er
1c8a0 72 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23  ror if true */.#
1c8b0 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a  define OPEN_DB_Z
1c8c0 49 50 46 49 4c 45 20 20 20 20 20 30 78 30 30 32  IPFILE     0x002
1c8d0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49     /* Open as ZI
1c8e0 50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65  P if name matche
1c8f0 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a  s *.zip */../*.*
1c900 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1c910 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1c920 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1c930 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20   then open it.  
1c940 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  If.** the databa
1c950 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e  se fails to open
1c960 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  , print an error
1c970 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69   message and exi
1c980 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1c990 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53  d open_db(ShellS
1c9a0 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65  tate *p, int ope
1c9b0 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70  nFlags){.  if( p
1c9c0 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ->db==0 ){.    i
1c9d0 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d  f( p->openMode==
1c9e0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
1c9f0 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  C ){.      if( p
1ca00 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30  ->zDbFilename==0
1ca10 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61   || p->zDbFilena
1ca20 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  me[0]==0 ){.    
1ca30 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
1ca40 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  = SHELL_OPEN_NOR
1ca50 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MAL;.      }else
1ca60 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
1ca70 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75  nMode = (u8)dedu
1ca80 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70  ceDatabaseType(p
1ca90 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a  ->zDbFilename, .
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70               (op
1cac0 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44  enFlags & OPEN_D
1cad0 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a  B_ZIPFILE)!=0);.
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1caf0 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65    switch( p->ope
1cb00 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  nMode ){.      c
1cb10 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  ase SHELL_OPEN_A
1cb20 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20  PPENDVFS: {.    
1cb30 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
1cb40 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  _v2(p->zDbFilena
1cb50 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20  me, &p->db, .   
1cb60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1cb70 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1cb80 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1cb90 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20  , "apndvfs");.  
1cba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cbb0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1cbc0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52  SHELL_OPEN_DESER
1cbd0 49 41 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  IALIZE: {.      
1cbe0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30    sqlite3_open(0
1cbf0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1cc00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cc10 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1cc20 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a  LL_OPEN_ZIPFILE:
1cc30 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1cc40 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
1cc50 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  :", &p->db);.   
1cc60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cc70 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1cc80 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
1cc90 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  LY: {.        sq
1cca0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d  lite3_open_v2(p-
1ccb0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
1ccc0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ->db, SQLITE_OPE
1ccd0 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a  N_READONLY, 0);.
1cce0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ccf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1cd00 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  e SHELL_OPEN_UNS
1cd10 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  PEC:.      case 
1cd20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1cd30 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L: {.        sql
1cd40 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62  ite3_open(p->zDb
1cd50 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
1cd60 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1cd70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cd80 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70      globalDb = p
1cd90 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d  ->db;.    if( p-
1cda0 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  >db==0 || SQLITE
1cdb0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
1cdc0 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
1cdd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1cde0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
1cdf0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
1ce00 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
1ce10 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1ce20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c   p->zDbFilename,
1ce30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1ce40 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
1ce50 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  f( openFlags & O
1ce60 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
1ce70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
1ce80 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
1ce90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cea0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
1ceb0 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  ON.    sqlite3_e
1cec0 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
1ced0 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a  sion(p->db, 1);.
1cee0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
1cef0 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70  e3_fileio_init(p
1cf00 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1cf10 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65   sqlite3_shathre
1cf20 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  e_init(p->db, 0,
1cf30 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1cf40 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74  _completion_init
1cf50 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  (p->db, 0, 0);.#
1cf60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
1cf70 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74  E_ZLIB.    sqlit
1cf80 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28  e3_zipfile_init(
1cf90 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1cfa0 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
1cfb0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1cfc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
1cfd0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1cfe0 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
1cff0 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c  ell_add_schema",
1d000 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
1d010 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d030 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61  shellAddSchemaNa
1d040 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  me, 0, 0);.    s
1d050 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1d060 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
1d070 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65  hell_module_sche
1d080 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  ma", 1, SQLITE_U
1d090 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0b0 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53      shellModuleS
1d0c0 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20  chema, 0, 0);.  
1d0d0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1d0e0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1d0f0 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c   "shell_putsnl",
1d100 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1d110 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   p,.            
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30  shellPutsFunc, 0
1d140 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
1d150 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1d160 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  EM.    sqlite3_c
1d170 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1d180 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31 2c  ->db, "edit", 1,
1d190 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1d1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
1d1c0 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
1d1d0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1d1e0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1d1f0 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c 49   "edit", 2, SQLI
1d200 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e 63          editFunc
1d230 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
1d240 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
1d250 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
1d260 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
1d270 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
1d280 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
1d290 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
1d2a0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69  VIRTUAL TABLE zi
1d2b0 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  p USING zipfile(
1d2c0 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c  %Q);", p->zDbFil
1d2d0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  ename);.      sq
1d2e0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1d2f0 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
1d300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1d310 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1d320 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 65  }else if( p->ope
1d330 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1d340 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b  N_DESERIALIZE ){
1d350 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61  .      int nData
1d360 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 73 69   = 0;.      unsi
1d370 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
1d380 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1d390 72 2a 29 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a  r*)readFile(p->z
1d3a0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61  DbFilename, &nDa
1d3b0 74 61 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  ta);.      int r
1d3c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65  c = sqlite3_dese
1d3d0 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20 22  rialize(p->db, "
1d3e0 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e 44  main", aData, nD
1d3f0 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20 20  ata, nData,.    
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1d410 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a  QLITE_DESERIALIZ
1d420 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20  E_RESIZEABLE |. 
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41    SQLITE_DESERIA
1d450 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45  LIZE_FREEONCLOSE
1d460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1d470 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1d480 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1d490 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64  Error: sqlite3_d
1d4a0 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72 65 74  eserialize() ret
1d4b0 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
1d4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d4d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
1d4e0 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  mpt to close the
1d4f0 20 64 61 74 61 62 61 65 73 20 63 6f 6e 6e 65 63   databaes connec
1d500 74 69 6f 6e 2e 20 20 52 65 70 6f 72 74 20 65 72  tion.  Report er
1d510 72 6f 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c  rors..*/.void cl
1d520 6f 73 65 5f 64 62 28 73 71 6c 69 74 65 33 20 2a  ose_db(sqlite3 *
1d530 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
1d540 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
1d550 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1d560 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1d570 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
1d580 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 72  qlite3_close() r
1d590 65 74 75 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22  eturns %d: %s\n"
1d5a0 2c 0a 20 20 20 20 20 20 20 20 72 63 2c 20 73 71  ,.        rc, sq
1d5b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1d5c0 29 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48  );.  } .}..#if H
1d5d0 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20  AVE_READLINE || 
1d5e0 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a  HAVE_EDITLINE./*
1d5f0 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d  .** Readline com
1d600 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
1d610 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s.*/.static char
1d620 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c   *readline_compl
1d630 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28  etion_generator(
1d640 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74  const char *text
1d650 2c 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20  , int state){.  
1d660 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
1d670 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1d680 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20    char *zRet;.  
1d690 69 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a  if( state==0 ){.
1d6a0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
1d6b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1d6c0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1d6d0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1d6e0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1d6f0 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
1d700 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
1d710 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1d730 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e   FROM completion
1d740 28 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  (%Q) ORDER BY 1"
1d750 2c 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c  , text);.    sql
1d760 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1d770 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
1d780 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1d790 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d7a0 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  (zSql);.  }.  if
1d7b0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1d7c0 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
1d7d0 57 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20  W ){.    zRet = 
1d7e0 73 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68  strdup((const ch
1d7f0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1d800 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
1d810 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1d820 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1d830 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
1d840 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65  tmt = 0;.    zRe
1d850 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1d860 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74  urn zRet;.}.stat
1d870 69 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69  ic char **readli
1d880 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  ne_completion(co
1d890 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
1d8a0 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1d8b0 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74   iEnd){.  rl_att
1d8c0 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f  empted_completio
1d8d0 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65  n_over = 1;.  re
1d8e0 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69  turn rl_completi
1d8f0 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74  on_matches(zText
1d900 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c  , readline_compl
1d910 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29  etion_generator)
1d920 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f  ;.}..#elif HAVE_
1d930 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20  LINENOISE./*.** 
1d940 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65  Linenoise comple
1d950 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f  tion callback.*/
1d960 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e  .static void lin
1d970 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f  enoise_completio
1d980 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  n(const char *zL
1d990 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f  ine, linenoiseCo
1d9a0 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a  mpletions *lc){.
1d9b0 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74    int nLine = st
1d9c0 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20  rlen30(zLine);. 
1d9d0 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a   int i, iStart;.
1d9e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d9f0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1da00 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
1da10 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69  zBuf[1000];..  i
1da20 66 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28  f( nLine>sizeof(
1da30 7a 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72  zBuf)-30 ) retur
1da40 6e 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30  n;.  if( zLine[0
1da50 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b  ]=='.' || zLine[
1da60 30 5d 3d 3d 27 23 27 29 20 72 65 74 75 72 6e 3b  0]=='#') return;
1da70 0a 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31  .  for(i=nLine-1
1da80 3b 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e  ; i>=0 && (isaln
1da90 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20  um(zLine[i]) || 
1daa0 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20  zLine[i]=='_'); 
1dab0 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d  i--){}.  if( i==
1dac0 6e 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e  nLine-1 ) return
1dad0 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31  ;.  iStart = i+1
1dae0 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c  ;.  memcpy(zBuf,
1daf0 20 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b   zLine, iStart);
1db00 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1db10 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
1db20 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69  T DISTINCT candi
1db30 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  date COLLATE noc
1db40 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ase".           
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1db60 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e   FROM completion
1db70 28 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59  (%Q,%Q) ORDER BY
1db80 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   1",.           
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
1dba0 4c 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c  Line[iStart], zL
1dbb0 69 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ine);.  sqlite3_
1dbc0 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61  prepare_v2(globa
1dbd0 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  lDb, zSql, -1, &
1dbe0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
1dbf0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
1dc00 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
1dc10 67 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d  globalDb, "PRAGM
1dc20 41 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30  A page_count", 0
1dc30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64  , 0, 0); /* Load
1dc40 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
1dc50 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
1dc60 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
1dc70 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
1dc80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70  onst char *zComp
1dc90 6c 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  letion = (const 
1dca0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
1dcb0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
1dcc0 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f   0);.    int nCo
1dcd0 6d 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74  mpletion = sqlit
1dce0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1dcf0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
1dd00 66 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c  f( iStart+nCompl
1dd10 65 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a  etion < sizeof(z
1dd20 42 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20  Buf)-1 ){.      
1dd30 6d 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61  memcpy(zBuf+iSta
1dd40 72 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c  rt, zCompletion,
1dd50 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b   nCompletion+1);
1dd60 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65  .      linenoise
1dd70 41 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63  AddCompletion(lc
1dd80 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  , zBuf);.    }. 
1dd90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
1dda0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
1ddb0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
1ddc0 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c   C-language styl
1ddd0 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a  e dequoting..**.
1dde0 2a 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61  **    \a    -> a
1ddf0 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20  larm.**    \b   
1de00 20 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a   -> backspace.**
1de10 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62      \t    -> tab
1de20 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20  .**    \n    -> 
1de30 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76  newline.**    \v
1de40 20 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20      -> vertical 
1de50 74 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20  tab.**    \f    
1de60 2d 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20  -> form feed.** 
1de70 20 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72     \r    -> carr
1de80 69 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20  iage return.**  
1de90 20 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65    \s    -> space
1dea0 0a 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20  .**    \"    -> 
1deb0 22 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e  ".**    \'    ->
1dec0 20 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d   '.**    \\    -
1ded0 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20  > backslash.**  
1dee0 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69    \NNN  -> ascii
1def0 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69   character NNN i
1df00 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69  n octal.*/.stati
1df10 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62  c void resolve_b
1df20 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20  ackslashes(char 
1df30 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *z){.  int i, j;
1df40 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69  .  char c;.  whi
1df50 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  le( *z && *z!='\
1df60 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28  \' ) z++;.  for(
1df70 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  i=j=0; (c = z[i]
1df80 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  )!=0; i++, j++){
1df90 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27  .    if( c=='\\'
1dfa0 20 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b   && z[i+1]!=0 ){
1dfb0 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69  .      c = z[++i
1dfc0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
1dfd0 27 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'a' ){.        c
1dfe0 20 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d   = '\a';.      }
1dff0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20  else if( c=='b' 
1e000 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1e010 5c 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \b';.      }else
1e020 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
1e030 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
1e040 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e050 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20   c=='n' ){.     
1e060 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20     c = '\n';.   
1e070 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1e080 27 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'v' ){.        c
1e090 20 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d   = '\v';.      }
1e0a0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20  else if( c=='f' 
1e0b0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1e0c0 5c 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \f';.      }else
1e0d0 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20   if( c=='r' ){. 
1e0e0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b         c = '\r';
1e0f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e100 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
1e110 20 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20     c = '"';.    
1e120 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1e130 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  \'' ){.        c
1e140 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d   = '\'';.      }
1e150 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27  else if( c=='\\'
1e160 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1e170 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\\';.      }els
1e180 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20  e if( c>='0' && 
1e190 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  c<='7' ){.      
1e1a0 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20    c -= '0';.    
1e1b0 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d      if( z[i+1]>=
1e1c0 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27  '0' && z[i+1]<='
1e1d0 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7' ){.          
1e1e0 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  i++;.          c
1e1f0 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
1e200 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
1e210 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
1e220 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
1e230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e240 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
1e250 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b   c = (c<<3) + z[
1e260 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  i] - '0';.      
1e270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e290 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a    z[j] = c;.  }.
1e2a0 20 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d    if( j<i ) z[j]
1e2b0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
1e2c0 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73  nterpret zArg as
1e2d0 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
1e2e0 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  er or a boolean 
1e2f0 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31  value.  Return 1
1e300 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55   or 0.** for TRU
1e310 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65  E and FALSE.  Re
1e320 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72  turn the integer
1e330 20 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70   value if approp
1e340 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
1e350 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   int booleanValu
1e360 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
1e370 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rg){.  int i;.  
1e380 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
1e390 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
1e3a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b   ){.    for(i=2;
1e3b0 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a   hexDigitValue(z
1e3c0 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29  Arg[i])>=0; i++)
1e3d0 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  {}.  }else{.    
1e3e0 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d  for(i=0; zArg[i]
1e3f0 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d  >='0' && zArg[i]
1e400 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  <='9'; i++){}.  
1e410 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a  }.  if( i>0 && z
1e420 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75  Arg[i]==0 ) retu
1e430 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72  rn (int)(integer
1e440 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78  Value(zArg) & 0x
1e450 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28  ffffffff);.  if(
1e460 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
1e470 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20  (zArg, "on")==0 
1e480 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
1e490 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d  mp(zArg,"yes")==
1e4a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e4b0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
1e4c0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
1e4d0 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20  g, "off")==0 || 
1e4e0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1e4f0 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b  zArg,"no")==0 ){
1e500 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1e510 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66   }.  utf8_printf
1e520 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
1e530 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76   Not a boolean v
1e540 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73  alue: \"%s\". As
1e550 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e  suming \"no\".\n
1e560 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72  ",.          zAr
1e570 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  g);.  return 0;.
1e580 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20  }../*.** Set or 
1e590 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c  clear a shell fl
1e5a0 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ag according to 
1e5b0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
1e5c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e5d0 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53  setOrClearFlag(S
1e5e0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e  hellState *p, un
1e5f0 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f  signed mFlag, co
1e600 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
1e610 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61  .  if( booleanVa
1e620 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20  lue(zArg) ){.   
1e630 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
1e640 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65   mFlag);.  }else
1e650 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  {.    ShellClear
1e660 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a  Flag(p, mFlag);.
1e670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
1e680 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  se an output fil
1e690 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69  e, assuming it i
1e6a0 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20  s not stderr or 
1e6b0 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63  stdout.*/.static
1e6c0 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c   void output_fil
1e6d0 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29  e_close(FILE *f)
1e6e0 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d  {.  if( f && f!=
1e6f0 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64  stdout && f!=std
1e700 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  err ) fclose(f);
1e710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1e720 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20   open an output 
1e730 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65  file.   The name
1e740 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22  s "stdout" and "
1e750 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72  stderr" are.** r
1e760 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f  ecognized and do
1e770 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67   the right thing
1e780 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
1e790 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ned if the outpu
1e7a0 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73  t.** filename is
1e7b0 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69   "off"..*/.stati
1e7c0 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66  c FILE *output_f
1e7d0 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ile_open(const c
1e7e0 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
1e7f0 62 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49  bTextMode){.  FI
1e800 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72  LE *f;.  if( str
1e810 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75  cmp(zFile,"stdou
1e820 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  t")==0 ){.    f 
1e830 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73  = stdout;.  }els
1e840 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
1e850 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30  le, "stderr")==0
1e860 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65   ){.    f = stde
1e870 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rr;.  }else if( 
1e880 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f  strcmp(zFile, "o
1e890 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ff")==0 ){.    f
1e8a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1e8b0 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69     f = fopen(zFi
1e8c0 6c 65 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20  le, bTextMode ? 
1e8d0 22 77 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20  "w" : "wb");.   
1e8e0 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1e8f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e900 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
1e910 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
1e920 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
1e930 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e940 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69   f;.}..#if !defi
1e950 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e960 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
1e970 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
1e980 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f  LOATING_POINT)./
1e990 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66  *.** A routine f
1e9a0 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70  or handling outp
1e9b0 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ut from sqlite3_
1e9c0 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  trace()..*/.stat
1e9d0 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65  ic int sql_trace
1e9e0 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73  _callback(.  uns
1e9f0 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76  igned mType,.  v
1ea00 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69  oid *pArg,.  voi
1ea10 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70  d *pP,.  void *p
1ea20 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  X.){.  FILE *f =
1ea30 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20   (FILE*)pArg;.  
1ea40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ea50 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45  (mType);.  UNUSE
1ea60 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b  D_PARAMETER(pP);
1ea70 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20  .  if( f ){.    
1ea80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1ea90 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b  (const char*)pX;
1eaa0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72  .    int i = str
1eab0 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68  len30(z);.    wh
1eac0 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d  ile( i>0 && z[i-
1ead0 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20  1]==';' ){ i--; 
1eae0 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  }.    utf8_print
1eaf0 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20  f(f, "%.*s;\n", 
1eb00 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i, z);.  }.  ret
1eb10 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1eb20 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72  ./*.** A no-op r
1eb30 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75 6e 73  outine that runs
1eb40 20 77 69 74 68 20 74 68 65 20 22 2e 62 72 65 61   with the ".brea
1eb50 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d  kpoint" doc-comm
1eb60 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  and.  This is.**
1eb70 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74 20 74   a useful spot t
1eb80 6f 20 73 65 74 20 61 20 64 65 62 75 67 67 65 72  o set a debugger
1eb90 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
1eba0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
1ebb0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64  _breakpoint(void
1ebc0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
1ebd0 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61  nCall = 0;.  nCa
1ebe0 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ll++;.}../*.** A
1ebf0 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  n object used to
1ec00 20 72 65 61 64 20 61 20 43 53 56 20 61 6e 64 20   read a CSV and 
1ec10 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f 72 20  other files for 
1ec20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70 65 64  import..*/.typed
1ec30 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f 72 74  ef struct Import
1ec40 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b 0a 73  Ctx ImportCtx;.s
1ec50 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20  truct ImportCtx 
1ec60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1ec70 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  zFile;  /* Name 
1ec80 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
1ec90 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  e */.  FILE *in;
1eca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ecb0 61 64 20 74 68 65 20 43 53 56 20 74 65 78 74 20  ad the CSV text 
1ecc0 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
1ecd0 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72  stream */.  char
1ece0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
1ecf0 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74  /* Accumulated t
1ed00 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20  ext for a field 
1ed10 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
1ed20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ed30 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
1ed40 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
1ed50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
1ed60 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1ed70 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c   z[] */.  int nL
1ed80 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ine;          /*
1ed90 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75   Current line nu
1eda0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 4e  mber */.  int bN
1edb0 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20 2f 2a  otFirst;      /*
1edc0 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20   True if one or 
1edd0 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72 65 61  more bytes alrea
1ede0 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  dy read */.  int
1edf0 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   cTerm;         
1ee00 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 74 68   /* Character th
1ee10 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20 74 68  at terminated th
1ee20 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 66 69  e most recent fi
1ee30 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63 43 6f  eld */.  int cCo
1ee40 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  lSep;        /* 
1ee50 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  The column separ
1ee60 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
1ee70 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a   (Usually ",") *
1ee80 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65 70 3b  /.  int cRowSep;
1ee90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1eea0 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ow separator cha
1eeb0 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
1eec0 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f  y "\n") */.};../
1eed0 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c  * Append a singl
1eee0 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f  e byte to z[] */
1eef0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6d 70  .static void imp
1ef00 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
1ef10 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20 69 6e  ImportCtx *p, in
1ef20 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  t c){.  if( p->n
1ef30 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  +1>=p->nAlloc ){
1ef40 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  .    p->nAlloc +
1ef50 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30  = p->nAlloc + 10
1ef60 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71  0;.    p->z = sq
1ef70 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
1ef80 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
1ef90 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d  ;.    if( p->z==
1efa0 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
1efb0 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 7d 0a 20  _memory();.  }. 
1efc0 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20   p->z[p->n++] = 
1efd0 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52  (char)c;.}../* R
1efe0 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ead a single fie
1eff0 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20  ld of CSV text. 
1f000 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   Compatible with
1f010 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78 74   rfc4180 and ext
1f020 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  ended.** with th
1f030 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69  e option of havi
1f040 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f  ng a separator o
1f050 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a  ther than ","..*
1f060 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20  *.**   +  Input 
1f070 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e  comes from p->in
1f080 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1f090 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20  results in p->z 
1f0a0 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20  of length p->n. 
1f0b0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70   Space to hold p
1f0c0 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  ->z comes.**    
1f0d0 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d    from sqlite3_m
1f0e0 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20  alloc64()..**   
1f0f0 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61  +  Use p->cSep a
1f100 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  s the column sep
1f110 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1f120 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20  ault is ","..** 
1f130 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70    +  Use p->rSep
1f140 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61   as the row sepa
1f150 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1f160 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20  ult is "\n"..** 
1f170 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20    +  Keep track 
1f180 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  of the line numb
1f190 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a  er in p->nLine..
1f1a0 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68  **   +  Store th
1f1b0 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  e character that
1f1c0 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20   terminates the 
1f1d0 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72  field in p->cTer
1f1e0 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20  m.  Store.**    
1f1f0 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d    EOF on end-of-
1f200 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65  file..**   +  Re
1f210 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f  port syntax erro
1f220 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a  rs on stderr.*/.
1f230 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c  static char *SQL
1f240 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65  ITE_CDECL csv_re
1f250 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
1f260 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
1f270 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
1f280 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
1f290 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
1f2a0 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
1f2b0 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
1f2c0 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
1f2d0 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
1f2e0 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
1f2f0 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
1f300 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f310 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
1f320 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20    int pc, ppc;. 
1f330 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
1f340 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20   = p->nLine;.   
1f350 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b   int cQuote = c;
1f360 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20  .    pc = ppc = 
1f370 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  0;.    while( 1 
1f380 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  ){.      c = fge
1f390 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
1f3a0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70   if( c==rSep ) p
1f3b0 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20  ->nLine++;.     
1f3c0 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29   if( c==cQuote )
1f3d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  {.        if( pc
1f3e0 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
1f3f0 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20        pc = 0;.  
1f400 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1f410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f420 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63    }.      if( (c
1f430 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==cSep && pc==cQ
1f440 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
1f450 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
1f460 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1f470 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63  | (c==rSep && pc
1f480 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63  =='\r' && ppc==c
1f490 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
1f4a0 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d   (c==EOF && pc==
1f4b0 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b  cQuote).      ){
1f4c0 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e  .        do{ p->
1f4d0 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e  n--; }while( p->
1f4e0 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20  z[p->n]!=cQuote 
1f4f0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
1f500 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
1f510 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1f520 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
1f530 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20  uote && c!='\r' 
1f540 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1f550 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1f560 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64  %s:%d: unescaped
1f570 20 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22   %c character\n"
1f580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f590 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e    p->zFile, p->n
1f5a0 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
1f5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f5c0 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20   c==EOF ){.     
1f5d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1f5e0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
1f5f0 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71  nterminated %c-q
1f600 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a  uoted field\n",.
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c  p->zFile, startL
1f630 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20  ine, cQuote);.  
1f640 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
1f650 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
1f660 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1f670 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1f680 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
1f690 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20   ppc = pc;.     
1f6a0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20   pc = c;.    }. 
1f6b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1f6c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1f6d0 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20  rst field being 
1f6e0 70 61 72 73 65 64 20 61 6e 64 20 69 74 20 62 65  parsed and it be
1f6f0 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20  gins with the.  
1f700 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20    ** UTF-8 BOM  
1f710 28 30 78 45 46 20 42 42 20 42 46 29 20 74 68 65  (0xEF BB BF) the
1f720 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a  n skip the BOM *
1f730 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 66  /.    if( (c&0xf
1f740 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62  f)==0xef && p->b
1f750 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  NotFirst==0 ){. 
1f760 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
1f770 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
1f780 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
1f790 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
1f7a0 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20   (c&0xff)==0xbb 
1f7b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72  ){.        impor
1f7c0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
1f7d0 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d   c);.        c =
1f7e0 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
1f7f0 20 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78         if( (c&0x
1f800 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20  ff)==0xbf ){.   
1f810 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69         p->bNotFi
1f820 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rst = 1;.       
1f830 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20     p->n = 0;.   
1f840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 73         return cs
1f850 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
1f860 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (p);.        }. 
1f870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f880 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26   while( c!=EOF &
1f890 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d  & c!=cSep && c!=
1f8a0 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d  rSep ){.      im
1f8b0 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
1f8c0 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20  (p, c);.      c 
1f8d0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1f8e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
1f8f0 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70  =rSep ){.      p
1f900 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20  ->nLine++;.     
1f910 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70   if( p->n>0 && p
1f920 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72  ->z[p->n-1]=='\r
1f930 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20  ' ) p->n--;.    
1f940 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  }.    p->cTerm =
1f950 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   c;.  }.  if( p-
1f960 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20  >z ) p->z[p->n] 
1f970 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69  = 0;.  p->bNotFi
1f980 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  rst = 1;.  retur
1f990 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65  n p->z;.}../* Re
1f9a0 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ad a single fiel
1f9b0 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d  d of ASCII delim
1f9c0 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a  ited text..**.**
1f9d0 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
1f9e0 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
1f9f0 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
1fa00 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
1fa10 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
1fa20 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
1fa30 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
1fa40 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
1fa50 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
1fa60 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
1fa70 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
1fa80 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
1fa90 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20   is "\x1F"..**  
1faa0 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20   +  Use p->rSep 
1fab0 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72  as the row separ
1fac0 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
1fad0 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a  lt is "\x1E"..**
1fae0 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b     +  Keep track
1faf0 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62   of the row numb
1fb00 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a  er in p->nLine..
1fb10 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68  **   +  Store th
1fb20 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  e character that
1fb30 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20   terminates the 
1fb40 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72  field in p->cTer
1fb50 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20  m.  Store.**    
1fb60 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d    EOF on end-of-
1fb70 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65  file..**   +  Re
1fb80 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f  port syntax erro
1fb90 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a  rs on stderr.*/.
1fba0 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c  static char *SQL
1fbb0 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f  ITE_CDECL ascii_
1fbc0 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49  read_one_field(I
1fbd0 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20  mportCtx *p){.  
1fbe0 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65  int c;.  int cSe
1fbf0 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a  p = p->cColSep;.
1fc00 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e    int rSep = p->
1fc10 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20  cRowSep;.  p->n 
1fc20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63  = 0;.  c = fgetc
1fc30 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63  (p->in);.  if( c
1fc40 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74  ==EOF || seenInt
1fc50 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d  errupt ){.    p-
1fc60 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20  >cTerm = EOF;.  
1fc70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1fc80 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20    while( c!=EOF 
1fc90 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21  && c!=cSep && c!
1fca0 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70  =rSep ){.    imp
1fcb0 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
1fcc0 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66  p, c);.    c = f
1fcd0 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d  getc(p->in);.  }
1fce0 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29  .  if( c==rSep )
1fcf0 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  {.    p->nLine++
1fd00 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d  ;.  }.  p->cTerm
1fd10 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = c;.  if( p->z
1fd20 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
1fd30 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a  0;.  return p->z
1fd40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
1fd50 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74 61 20  o transfer data 
1fd60 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65  for table zTable
1fd70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
1fd80 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20  s seen while.** 
1fd90 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20  moving forward, 
1fda0 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61  try to go backwa
1fdb0 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61  rds.  The backwa
1fdc0 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e  rds movement won
1fdd0 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57  't.** work for W
1fde0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1fdf0 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
1fe00 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61  oid tryToCloneDa
1fe10 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ta(.  ShellState
1fe20 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
1fe30 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
1fe40 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20  har *zTable.){. 
1fe50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1fe60 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c  Query = 0;.  sql
1fe70 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65  ite3_stmt *pInse
1fe80 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rt = 0;.  char *
1fe90 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68  zQuery = 0;.  ch
1fea0 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b  ar *zInsert = 0;
1feb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1fec0 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20   i, j, n;.  int 
1fed0 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65 6e 33  nTable = strlen3
1fee0 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74  0(zTable);.  int
1fef0 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e   k = 0;.  int cn
1ff00 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69  t = 0;.  const i
1ff10 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31 30  nt spinRate = 10
1ff20 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d  000;..  zQuery =
1ff30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1ff40 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
1ff50 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29  \"%w\"", zTable)
1ff60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ff70 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
1ff80 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
1ff90 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
1ffa0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
1ffb0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1ffc0 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
1ffd0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
1ffe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1fff0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70  tended_errcode(p
20000 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ->db), sqlite3_e
20010 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20  rrmsg(p->db),.  
20020 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
20030 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
20040 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
20050 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   n = sqlite3_col
20060 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72 79  umn_count(pQuery
20070 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20 73  );.  zInsert = s
20080 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
20090 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20 6e  200 + nTable + n
200a0 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73 65  *3);.  if( zInse
200b0 72 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75  rt==0 ) shell_ou
200c0 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
200d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
200e0 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e  f(200+nTable,zIn
200f0 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sert,.          
20100 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
20110 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
20120 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28 3f 22  \"%s\" VALUES(?"
20130 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69 20 3d  , zTable);.  i =
20140 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e 73 65 72   strlen30(zInser
20150 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  t);.  for(j=1; j
20160 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65  <n; j++){.    me
20170 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20  mcpy(zInsert+i, 
20180 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20 69 20  ",?", 2);.    i 
20190 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  += 2;.  }.  memc
201a0 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 29  py(zInsert+i, ")
201b0 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d 20 73  ;", 3);.  rc = s
201c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
201d0 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65 72 74  2(newDb, zInsert
201e0 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c 20  , -1, &pInsert, 
201f0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
20200 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
20210 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
20220 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
20230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
20240 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
20250 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 20 73  rrcode(newDb), s
20260 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
20270 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  wDb),.          
20280 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
20290 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
202a0 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30  r;.  }.  for(k=0
202b0 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ; k<2; k++){.   
202c0 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
202d0 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
202e0 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
202f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
20300 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
20310 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
20320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
20330 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b 0a 20  (pQuery, i) ){. 
20340 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
20350 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
20360 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20370 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65  _bind_null(pInse
20380 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  rt, i+1);.      
20390 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
203a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
203b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
203c0 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
203d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
203e0 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65 72 74  nd_int64(pInsert
203f0 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
20400 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65  olumn_int64(pQue
20410 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  ry,i));.        
20420 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20440 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
20450 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
20460 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
20470 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c 20 69  ouble(pInsert, i
20480 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
20490 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65 72 79  mn_double(pQuery
204a0 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
204b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
204c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
204d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
204e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
204f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
20500 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20  (pInsert, i+1,. 
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
20530 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
20540 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
20550 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
20580 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
20590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
205a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
205b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
205c0 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
205d0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
205e0 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  lob(pInsert, i+1
205f0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
20600 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69 29 2c  _blob(pQuery,i),
20610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
20640 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
20650 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  s(pQuery,i),.   
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20680 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20690 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
206a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
206b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
206c0 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64  }.      } /* End
206d0 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63   for */.      rc
206e0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
206f0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
20700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20710 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
20720 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ROW && rc!=SQLIT
20730 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
20740 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
20750 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
20760 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
20770 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
20780 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20  (newDb),.       
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
207b0 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20 20 7d  newDb));.      }
207c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
207d0 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20  eset(pInsert);. 
207e0 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
207f0 20 20 69 66 28 20 28 63 6e 74 25 73 70 69 6e 52    if( (cnt%spinR
20800 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ate)==0 ){.     
20810 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c 62 22     printf("%c\b"
20820 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73  , "|/-\\"[(cnt/s
20830 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20 20  pinRate)%4]);.  
20840 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64        fflush(std
20850 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
20860 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65    } /* End while
20870 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
20880 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72  SQLITE_DONE ) br
20890 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eak;.    sqlite3
208a0 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
208b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
208c0 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  ree(zQuery);.   
208d0 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   zQuery = sqlite
208e0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
208f0 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
20900 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
20910 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  ESC;",.         
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20      zTable);.   
20940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
20950 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
20960 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
20970 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ery, 0);.    if(
20980 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
20990 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
209a0 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f   "Warning: canno
209b0 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20 62 61  t step \"%s\" ba
209c0 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62 6c 65  ckwards", zTable
209d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
209e0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
209f0 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a   for(k=0...) */.
20a00 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a  .end_data_xfer:.
20a10 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
20a20 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
20a30 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20a40 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74  Insert);.  sqlit
20a50 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
20a60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20a70 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a  zInsert);.}.../*
20a80 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73  .** Try to trans
20a90 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  fer all rows of 
20aa0 74 68 65 20 73 63 68 65 6d 61 20 74 68 61 74 20  the schema that 
20ab0 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20 20 46  match zWhere.  F
20ac0 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20  or.** each row, 
20ad0 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63 68 28  invoke xForEach(
20ae0 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  ) on the object 
20af0 64 65 66 69 6e 65 64 20 62 79 20 74 68 61 74 20  defined by that 
20b00 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  row..** If an er
20b10 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
20b20 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20  ed while moving 
20b30 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67 68 20  forward through 
20b40 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  the.** sqlite_ma
20b50 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72 79 20  ster table, try 
20b60 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63  again moving bac
20b70 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  kwards..*/.stati
20b80 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
20b90 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c  eSchema(.  Shell
20ba0 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
20bb0 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
20bc0 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
20bd0 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45  ,.  void (*xForE
20be0 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74 65 2a  ach)(ShellState*
20bf0 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20  ,sqlite3*,const 
20c00 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
20c10 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
20c20 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
20c30 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  uery = 0;.  int 
20c40 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  rc;.  const unsi
20c50 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65  gned char *zName
20c60 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
20c70 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  ed char *zSql;. 
20c80 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
20c90 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20   0;..  zQuery = 
20ca0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20cb0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71  "SELECT name, sq
20cc0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
20cd0 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57   " WHERE %s", zW
20d00 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  here);.  rc = sq
20d10 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
20d20 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
20d30 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
20d40 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
20d50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20d60 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
20d70 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
20d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74       sqlite3_ext
20da0 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d  ended_errcode(p-
20db0 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  >db), sqlite3_er
20dc0 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20  rmsg(p->db),.   
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f   zQuery);.    go
20df0 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
20e00 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  er;.  }.  while(
20e10 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73   (rc = sqlite3_s
20e20 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51  tep(pQuery))==SQ
20e30 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
20e40 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
20e50 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
20e60 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c  ry, 0);.    zSql
20e70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
20e80 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31  n_text(pQuery, 1
20e90 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  );.    printf("%
20ea0 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
20eb0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
20ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
20ed0 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63  (newDb, (const c
20ee0 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c  har*)zSql, 0, 0,
20ef0 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
20f00 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
20f10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
20f20 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
20f30 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
20f40 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
20f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20f60 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
20f70 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20        zErrMsg = 
20f80 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
20f90 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20   xForEach ){.   
20fa0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
20fb0 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
20fc0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  r*)zName);.    }
20fd0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e  .    printf("don
20fe0 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e\n");.  }.  if(
20ff0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21000 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21010 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
21020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21030 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  ee(zQuery);.    
21040 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
21050 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
21060 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20   name, sql FROM 
21070 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21090 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
210a0 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20  ERE %s ORDER BY 
210b0 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 57 68  rowid DESC", zWh
210c0 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ere);.    rc = s
210d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
210e0 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  2(p->db, zQuery,
210f0 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29   -1, &pQuery, 0)
21100 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
21110 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
21120 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
21130 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
21140 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
21150 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21160 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
21170 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
21180 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
21190 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
211a0 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
211b0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
211c0 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
211d0 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
211e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
211f0 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
21200 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
21210 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
21220 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
21230 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a  ery, 0);.      z
21240 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Sql = sqlite3_co
21250 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
21260 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  , 1);.      prin
21270 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
21280 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
21290 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ut);.      sqlit
212a0 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28  e3_exec(newDb, (
212b0 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c  const char*)zSql
212c0 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  , 0, 0, &zErrMsg
212d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72  );.      if( zEr
212e0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20  rMsg ){.        
212f0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
21300 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
21310 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
21320 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
21330 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21340 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
21350 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30       zErrMsg = 0
21360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21370 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
21380 20 20 20 20 20 20 20 20 78 46 6f 72 45 61 63 68          xForEach
21390 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
213a0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
213b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
213c0 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a  intf("done\n");.
213d0 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63      }.  }.end_sc
213e0 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  hema_xfer:.  sql
213f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
21400 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
21410 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d  _free(zQuery);.}
21420 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
21430 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ew database file
21440 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e   named "zNewDb".
21450 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76 65 72    Try to recover
21460 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61   as much informa
21470 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69  tion.** as possi
21480 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ble out of the m
21490 61 69 6e 20 64 61 74 61 62 61 73 65 20 28 77 68  ain database (wh
214a0 69 63 68 20 6d 69 67 68 74 20 62 65 20 63 6f 72  ich might be cor
214b0 72 75 70 74 29 20 61 6e 64 20 77 72 69 74 65 20  rupt) and write 
214c0 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44  it.** into zNewD
214d0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
214e0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65  d tryToClone(She
214f0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
21500 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b  t char *zNewDb){
21510 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21520 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b  ite3 *newDb = 0;
21530 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4e  .  if( access(zN
21540 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  ewDb,0)==0 ){.  
21550 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
21560 64 65 72 72 2c 20 22 46 69 6c 65 20 5c 22 25 73  derr, "File \"%s
21570 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  \" already exist
21580 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a  s.\n", zNewDb);.
21590 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
215a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
215b0 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77  pen(zNewDb, &new
215c0 44 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Db);.  if( rc ){
215d0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
215e0 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
215f0 20 63 72 65 61 74 65 20 6f 75 74 70 75 74 20 64   create output d
21600 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a  atabase: %s\n",.
21610 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21620 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
21630 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
21640 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
21650 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
21660 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
21670 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
21680 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
21690 77 44 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c  wDb, "BEGIN EXCL
216a0 55 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30  USIVE;", 0, 0, 0
216b0 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e  );.    tryToClon
216c0 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62  eSchema(p, newDb
216d0 2c 20 22 74 79 70 65 3d 27 74 61 62 6c 65 27 22  , "type='table'"
216e0 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61  , tryToCloneData
216f0 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e  );.    tryToClon
21700 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62  eSchema(p, newDb
21710 2c 20 22 74 79 70 65 21 3d 27 74 61 62 6c 65 27  , "type!='table'
21720 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
21730 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22  e3_exec(newDb, "
21740 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20  COMMIT;", 0, 0, 
21750 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
21760 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
21770 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
21780 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c  ema=OFF;", 0, 0,
21790 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65   0);.  }.  close
217a0 5f 64 62 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f  _db(newDb);.}../
217b0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
217c0 6f 75 74 70 75 74 20 66 69 6c 65 20 62 61 63 6b  output file back
217d0 20 74 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a   to stdout..**.*
217e0 2a 20 49 66 20 74 68 65 20 70 2d 3e 64 6f 58 64  * If the p->doXd
217f0 67 4f 70 65 6e 20 66 6c 61 67 20 69 73 20 73 65  gOpen flag is se
21800 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
21810 65 20 6f 75 74 70 75 74 20 77 61 73 20 62 65 69  e output was bei
21820 6e 67 0a 2a 2a 20 72 65 64 69 72 65 63 74 65 64  ng.** redirected
21830 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
21840 66 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 70 2d  file named by p-
21850 3e 7a 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20  >zTempFile.  In 
21860 74 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61  that case,.** la
21870 75 6e 63 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f  unch start/open/
21880 78 64 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74  xdg-open on that
21890 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
218a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
218b0 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68 65  output_reset(She
218c0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
218d0 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  f( p->outfile[0]
218e0 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66  =='|' ){.#ifndef
218f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
21900 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70 2d  EN.    pclose(p-
21910 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  >out);.#endif.  
21920 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70 75  }else{.    outpu
21930 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
21940 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  out);.#ifndef SQ
21950 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
21960 45 4d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f  EM.    if( p->do
21970 58 64 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  XdgOpen ){.     
21980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64   const char *zXd
21990 67 4f 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64  gOpenCmd =.#if d
219a0 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
219b0 20 20 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65       "start";.#e
219c0 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
219d0 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70  PLE__).      "op
219e0 65 6e 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  en";.#else.     
219f0 20 22 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e   "xdg-open";.#en
21a00 64 69 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dif.      char *
21a10 7a 43 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64  zCmd;.      zCmd
21a20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21a30 74 66 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67  tf("%s %s", zXdg
21a40 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d  OpenCmd, p->zTem
21a50 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
21a60 28 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29  ( system(zCmd) )
21a70 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
21a80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
21a90 61 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ailed: [%s]\n", 
21aa0 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zCmd);.      }. 
21ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21ac0 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f  e(zCmd);.      o
21ad0 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b  utputModePop(p);
21ae0 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
21af0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  pen = 0;.    }.#
21b00 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
21b10 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  d(SQLITE_NOHAVE_
21b20 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20  SYSTEM) */.  }. 
21b30 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d   p->outfile[0] =
21b40 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73   0;.  p->out = s
21b50 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tdout;.}../*.** 
21b60 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61  Run an SQL comma
21b70 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
21b80 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  e single integer
21b90 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
21ba0 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68  ic int db_int(Sh
21bb0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
21bc0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
21bd0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
21be0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73  pStmt;.  int res
21bf0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
21c00 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
21c10 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
21c20 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  mt, 0);.  if( pS
21c30 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73  tmt && sqlite3_s
21c40 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
21c50 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65  TE_ROW ){.    re
21c60 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
21c70 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b  mn_int(pStmt,0);
21c80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
21c90 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
21ca0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
21cb0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
21cc0 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74   2-byte or 4-byt
21cd0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
21ce0 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69  eger into a nati
21cf0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74  ve integer.*/.st
21d00 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
21d10 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e  t get2byteInt(un
21d20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
21d30 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
21d40 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74  <8) + a[1];.}.st
21d50 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
21d60 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e  t get4byteInt(un
21d70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
21d80 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
21d90 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36  <24) + (a[1]<<16
21da0 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20  ) + (a[2]<<8) + 
21db0 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  a[3];.}../*.** I
21dc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21dd0 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d   the ".info" com
21de0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mand..**.** Retu
21df0 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
21e00 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
21e10 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
21e20 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64  atic int shell_d
21e30 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68  binfo_command(Sh
21e40 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
21e50 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
21e60 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Arg){.  static c
21e70 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f  onst struct { co
21e80 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
21e90 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69   int ofst; } aFi
21ea0 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  eld[] = {.     {
21eb0 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f   "file change co
21ec0 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c  unter:",  24  },
21ed0 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
21ee0 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  e page count:", 
21ef0 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   28  },.     { "
21f00 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f  freelist page co
21f10 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20  unt:",  36  },. 
21f20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f      { "schema co
21f30 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34  okie:",        4
21f40 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  0  },.     { "sc
21f50 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20  hema format:",  
21f60 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20        44  },.   
21f70 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63    { "default cac
21f80 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20  he size:",   48 
21f90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f   },.     { "auto
21fa0 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a  vacuum top root:
21fb0 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20  ",  52  },.     
21fc0 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  { "incremental v
21fd0 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d  acuum:",   64  }
21fe0 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65  ,.     { "text e
21ff0 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20  ncoding:",      
22000 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20    56  },.     { 
22010 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c  "user version:",
22020 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a           60  },.
22030 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74       { "applicat
22040 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20  ion id:",       
22050 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  68  },.     { "s
22060 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a  oftware version:
22070 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20  ",     96  },.  
22080 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
22090 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
220a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f   char *zName; co
220b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
220c0 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20  } aQuery[] = {. 
220d0 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
220e0 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20   tables:",.     
220f0 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
22100 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
22110 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d   type='table'" }
22120 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
22130 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20   of indexes:",. 
22140 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
22150 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
22160 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
22170 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
22180 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73  mber of triggers
22190 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
221a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
221b0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
221c0 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20  trigger'" },.   
221d0 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76    { "number of v
221e0 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  iews:",.       "
221f0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
22200 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
22210 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20  pe='view'" },.  
22220 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a     { "schema siz
22230 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  e:",.       "SEL
22240 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68  ECT total(length
22250 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20  (sql)) FROM %s" 
22260 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
22270 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 44 61 74  .  unsigned iDat
22280 61 56 65 72 73 69 6f 6e 3b 0a 20 20 63 68 61 72  aVersion;.  char
22290 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20   *zSchemaTab;.  
222a0 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67  char *zDb = nArg
222b0 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
222c0 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74   "main";.  sqlit
222d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
222e0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
222f0 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20  har aHdr[100];. 
22300 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
22310 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
22320 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c   return 1;.  sql
22330 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
22340 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61  p->db,"SELECT da
22350 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
22360 62 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20  bpage(?1) WHERE 
22370 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20  pgno=1",.       
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
22390 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
223a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
223b0 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c  t(pStmt, 1, zDb,
223c0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
223d0 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  IC);.  if( sqlit
223e0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
223f0 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26  SQLITE_ROW.   &&
22400 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
22410 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31  bytes(pStmt,0)>1
22420 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  00.  ){.    memc
22430 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33  py(aHdr, sqlite3
22440 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
22450 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20  mt,0), 100);.   
22460 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
22470 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  e(pStmt);.  }els
22480 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
22490 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c  f(stderr, "unabl
224a0 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  e to read databa
224b0 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20  se header\n");. 
224c0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
224d0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
224e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
224f0 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28  i = get2byteInt(
22500 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20  aHdr+16);.  if( 
22510 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36  i==1 ) i = 65536
22520 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
22530 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
22540 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20  d\n", "database 
22550 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b  page size:", i);
22560 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
22570 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
22580 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d  \n", "write form
22590 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b  at:", aHdr[18]);
225a0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
225b0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
225c0 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61  \n", "read forma
225d0 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a  t:", aHdr[19]);.
225e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
225f0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
22600 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62 79  n", "reserved by
22610 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29  tes:", aHdr[20])
22620 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
22630 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29  rraySize(aField)
22640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
22650 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d  ofst = aField[i]
22660 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67  .ofst;.    unsig
22670 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65  ned int val = ge
22680 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b  t4byteInt(aHdr +
22690 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38   ofst);.    utf8
226a0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
226b0 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65  "%-20s %u", aFie
226c0 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c  ld[i].zName, val
226d0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
226e0 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  fst ){.      cas
226f0 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20  e 56: {.        
22700 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77  if( val==1 ) raw
22710 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
22720 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20  " (utf8)");.    
22730 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29      if( val==2 )
22740 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
22750 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22  ut, " (utf16le)"
22760 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
22770 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e  al==3 ) raw_prin
22780 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
22790 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20  f16be)");.      
227a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  }.    }.    raw_
227b0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
227c0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
227d0 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  zDb==0 ){.    zS
227e0 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
227f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e  e3_mprintf("main
22800 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  .sqlite_master")
22810 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
22820 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29  rcmp(zDb,"temp")
22830 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
22840 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
22850 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73  mprintf("%s", "s
22860 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
22870 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r");.  }else{.  
22880 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
22890 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
228a0 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61  \"%w\".sqlite_ma
228b0 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  ster", zDb);.  }
228c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
228d0 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b  raySize(aQuery);
228e0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
228f0 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
22900 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69  mprintf(aQuery[i
22910 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54  ].zSql, zSchemaT
22920 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  ab);.    int val
22930 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71   = db_int(p, zSq
22940 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
22950 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
22960 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
22970 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
22980 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d  , aQuery[i].zNam
22990 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e, val);.  }.  s
229a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68  qlite3_free(zSch
229b0 65 6d 61 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  emaTab);.  sqlit
229c0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
229d0 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  p->db, zDb, SQLI
229e0 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45  TE_FCNTL_DATA_VE
229f0 52 53 49 4f 4e 2c 20 26 69 44 61 74 61 56 65 72  RSION, &iDataVer
22a00 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38 5f 70 72  sion);.  utf8_pr
22a10 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
22a20 32 30 73 20 25 75 5c 6e 22 2c 20 22 64 61 74 61  20s %u\n", "data
22a30 20 76 65 72 73 69 6f 6e 22 2c 20 69 44 61 74 61   version", iData
22a40 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72 65 74 75  Version);.  retu
22a50 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
22a60 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74  rint the current
22a70 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
22a80 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72  ) value to stder
22a90 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
22aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
22ab0 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
22ac0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
22ad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
22ae0 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
22af0 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70  sg(db);.  utf8_p
22b00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
22b10 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
22b20 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  r);.  return 1;.
22b30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
22b40 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20   the pattern in 
22b50 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20  zGlob[] against 
22b60 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e  the text in z[].
22b70 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a    Return TRUE.**
22b80 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61   if they match a
22b90 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66 20  nd FALSE (0) if 
22ba0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
22bb0 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e  h..**.** Globbin
22bc0 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
22bd0 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61      '*'       Ma
22be0 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
22bf0 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ce of zero or mo
22c00 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  re characters..*
22c10 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20  *.**      '?'   
22c20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63      Matches exac
22c30 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65  tly one characte
22c40 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e  r..**.**     [..
22c50 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  .]      Matches 
22c60 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72  one character fr
22c70 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  om the enclosed 
22c80 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
22c90 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
22ca0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
22cb0 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68  [^...]     Match
22cc0 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
22cd0 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c   not in the encl
22ce0 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  osed list..**.**
22cf0 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20 20        '#'       
22d00 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
22d10 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ence of one or m
22d20 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68 20  ore digits with 
22d30 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
22d40 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20       optional + 
22d50 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f  or - sign in fro
22d60 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20  nt.**.**      ' 
22d70 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e  '       Any span
22d80 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 6d   of whitespace m
22d90 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72  atches any other
22da0 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20   span of.**     
22db0 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74 65             white
22dc0 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74  space..**.** Ext
22dd0 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61 74  ra whitespace at
22de0 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20   the end of z[] 
22df0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73  is ignored..*/.s
22e00 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63 61  tatic int testca
22e10 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68  se_glob(const ch
22e20 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74  ar *zGlob, const
22e30 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
22e40 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e   c, c2;.  int in
22e50 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
22e60 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
22e70 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d   (*(zGlob++)))!=
22e80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53  0 ){.    if( IsS
22e90 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
22ea0 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a   if( !IsSpace(*z
22eb0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
22ec0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
22ed0 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c  ce(*zGlob) ) zGl
22ee0 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  ob++;.      whil
22ef0 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29  e( IsSpace(*z) )
22f00 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   z++;.    }else 
22f10 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20  if( c=='*' ){.  
22f20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a      while( (c=(*
22f30 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27  (zGlob++))) == '
22f40 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a  *' || c=='?' ){.
22f50 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
22f60 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d  ?' && (*(z++))==
22f70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22f80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22f90 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
22fa0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
22fb0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
22fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
22fd0 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73  e( *z && testcas
22fe0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a  e_glob(zGlob-1,z
22ff0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23000 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    z++;.        }
23010 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23020 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d  (*z)!=0;.      }
23030 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
23040 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30  2 = (*(z++)))!=0
23050 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
23060 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20  e( c2!=c ){.    
23070 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b        c2 = *(z++
23080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23090 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
230a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
230b0 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61 73       if( testcas
230c0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  e_glob(zGlob,z) 
230d0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
230e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
230f0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
23100 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
23110 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
23120 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
23130 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
23140 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
23150 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
23160 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
23170 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
23180 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
23190 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
231a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
231b0 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
231c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
231d0 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
231e0 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
231f0 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
23200 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
23210 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
23220 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
23230 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
23240 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
23250 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
23260 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
23270 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
23280 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
23290 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
232a0 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
232b0 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
232c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
232d0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
232e0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
232f0 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
23300 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
23310 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
23320 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
23330 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
23340 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
23350 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
23360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23370 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
23380 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
23390 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
233a0 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
233b0 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
233c0 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
233d0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
233e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
233f0 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
23400 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
23410 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49   z[0]=='+') && I
23420 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sDigit(z[1]) ) z
23430 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
23440 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sDigit(z[0]) ) r
23450 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
23460 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
23470 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29   IsDigit(z[0]) )
23480 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
23490 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
234a0 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
234b0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
234c0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
234d0 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
234e0 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
234f0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
23500 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 61   the string as a
23510 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
23520 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72  tion with either
23530 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69   one or two.** i
23540 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61  nitial "-" chara
23550 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
23560 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68   int optionMatch
23570 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
23580 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
23590 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72  Opt){.  if( zStr
235a0 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  [0]!='-' ) retur
235b0 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20  n 0;.  zStr++;. 
235c0 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d   if( zStr[0]=='-
235d0 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65  ' ) zStr++;.  re
235e0 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72  turn strcmp(zStr
235f0 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f  , zOpt)==0;.}../
23600 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69  *.** Delete a fi
23610 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c  le..*/.int shell
23620 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74  DeleteFile(const
23630 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
23640 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66  ){.  int rc;.#if
23650 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68  def _WIN32.  wch
23660 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
23670 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
23680 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  unicode(zFilenam
23690 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c  e);.  rc = _wunl
236a0 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ink(z);.  sqlite
236b0 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
236c0 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a  .  rc = unlink(z
236d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
236e0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
236f0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
23700 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
23710 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68 65  ary file (if the
23720 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66  re is one) and f
23730 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72  ree the.** memor
23740 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  y used to hold t
23750 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
23760 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  emp file..*/.sta
23770 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65  tic void clearTe
23780 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74  mpFile(ShellStat
23790 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
237a0 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  zTempFile==0 ) r
237b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
237c0 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75  doXdgOpen ) retu
237d0 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44  rn;.  if( shellD
237e0 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65  eleteFile(p->zTe
237f0 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e  mpFile) ) return
23800 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
23810 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  (p->zTempFile);.
23820 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
23830 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
23840 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66  ate a new temp f
23850 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68  ile name with th
23860 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a  e given suffix..
23870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
23880 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  ewTempFile(Shell
23890 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
238a0 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a  char *zSuffix){.
238b0 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28    clearTempFile(
238c0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
238d0 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  ee(p->zTempFile)
238e0 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ;.  p->zTempFile
238f0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64   = 0;.  if( p->d
23900 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
23910 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
23920 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  >db, 0, SQLITE_F
23930 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
23940 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  E, &p->zTempFile
23950 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
23960 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
23970 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
23980 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  64 r;.    sqlite
23990 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
239a0 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
239b0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
239c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
239d0 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72  "temp%llx.%s", r
239e0 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  , zSuffix);.  }e
239f0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d  lse{.    p->zTem
23a00 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
23a10 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c  mprintf("%z.%s",
23a20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a   p->zTempFile, z
23a30 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69  Suffix);.  }.  i
23a40 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d  f( p->zTempFile=
23a50 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
23a60 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
23a70 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
23a80 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
23a90 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
23aa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
23ab0 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
23ac0 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61  ction fkey_colla
23ad0 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65  te_clause(), use
23ae0 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69  d.** by the ".li
23af0 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
23b00 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73   command. This s
23b10 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69  calar function i
23b20 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c  s always.** call
23b30 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67  ed with four arg
23b40 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72  uments - the par
23b50 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  ent table name, 
23b60 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
23b70 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63  n name,.** the c
23b80 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  hild table name 
23b90 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f  and the child co
23ba0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  lumn name..**.**
23bb0 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
23bc0 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74  clause('parent-t
23bd0 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c  ab', 'parent-col
23be0 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20  ', 'child-tab', 
23bf0 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a  'child-col').**.
23c00 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
23c10 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73  the named tables
23c20 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e   or columns do n
23c30 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66  ot exist, this f
23c40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
23c50 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  ns an empty stri
23c60 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72  ng. An empty str
23c70 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ing is also retu
23c80 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62  rned if both tab
23c90 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d  les.** and colum
23ca0 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76  ns exist but hav
23cb0 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
23cc0 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
23cd0 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66  uence. Or,.** if
23ce0 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20   both exist but 
23cf0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
23d00 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
23d10 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
23d20 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
23d30 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
23d40 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61  ng " COLLATE <pa
23d50 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22  rent-collation>"
23d60 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65  , where.** <pare
23d70 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73  nt-collation> is
23d80 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
23d90 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
23da0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  of the parent co
23db0 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
23dc0 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f  void shellFkeyCo
23dd0 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73  llateClause(.  s
23de0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
23df0 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
23e00 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
23e10 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
23e20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
23e30 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
23e40 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20  handle(pCtx);.  
23e50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
23e60 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ent;.  const cha
23e70 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20  r *zParentCol;. 
23e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
23e90 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74  rentSeq;.  const
23ea0 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20   char *zChild;. 
23eb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
23ec0 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  ildCol;.  const 
23ed0 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20  char *zChildSeq 
23ee0 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  = 0;  /* Initial
23ef0 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c  ize to avoid fal
23f00 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e  se-positive warn
23f10 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
23f20 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
23f30 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74  ==4 );.  zParent
23f40 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
23f50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
23f60 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
23f70 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f  zParentCol = (co
23f80 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
23f90 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
23fa0 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[1]);.  zChild
23fb0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
23fc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
23fd0 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
23fe0 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e  zChildCol = (con
23ff0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
24000 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
24010 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  l[3]);..  sqlite
24020 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
24030 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49  tx, "", -1, SQLI
24040 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63  TE_STATIC);.  rc
24050 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
24060 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
24070 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69  (.      db, "mai
24080 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61  n", zParent, zPa
24090 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61  rentCol, 0, &zPa
240a0 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30  rentSeq, 0, 0, 0
240b0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
240c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
240d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
240e0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
240f0 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ata(.        db,
24100 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c   "main", zChild,
24110 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26   zChildCol, 0, &
24120 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c  zChildSeq, 0, 0,
24130 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
24140 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24150 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
24160 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71  ricmp(zParentSeq
24170 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a  , zChildSeq) ){.
24180 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
24190 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
241a0 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61  COLLATE %s", zPa
241b0 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71  rentSeq);.    sq
241c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
241d0 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53  t(pCtx, z, -1, S
241e0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
241f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
24200 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(z);.  }.}.../
24210 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
24220 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63  ntation of dot-c
24230 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b  ommand ".lint fk
24240 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a  ey-indexes"..*/.
24250 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46  static int lintF
24260 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68  keyIndexes(.  Sh
24270 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
24280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24290 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
242a0 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
242b0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242d0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
242e0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
242f0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
24300 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
24330 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
24340 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
24350 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  *db = pState->db
24360 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
24370 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75  ase handle to qu
24380 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66  ery "main" db of
24390 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20   */.  FILE *out 
243a0 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20  = pState->out;  
243b0 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20        /* Stream 
243c0 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72  to write non-err
243d0 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a  or output to */.
243e0 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
243f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24400 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65    /* If -verbose
24410 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
24420 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72   int bGroupByPar
24430 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
24440 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70   /* If -groupbyp
24450 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  arent is present
24460 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24480 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
24490 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72  ate through azAr
244a0 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  g[] */.  const c
244b0 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22  har *zIndent = "
244c0 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ";       /* How 
244d0 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43  much to indent C
244e0 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a  REATE INDEX by *
244f0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24520 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
24530 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20  stmt *pSql = 0; 
24540 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
24550 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  led version of S
24560 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  QL statement bel
24570 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ow */..  /*.  **
24580 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   This SELECT sta
24590 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f  tement returns o
245a0 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  ne row for each 
245b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
245c0 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74  traint.  ** in t
245d0 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
245e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
245f0 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  The column value
24600 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s are:.  **.  **
24610 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20   0. The text of 
24620 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
24630 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a   similar to:.  *
24640 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50  *.  **      "EXP
24650 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
24660 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68  SELECT 1 FROM ch
24670 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20  ild_table WHERE 
24680 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a  child_key=?".  *
24690 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53  *.  **    This S
246a0 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72  ELECT is similar
246b0 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74   to the one that
246c0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
246d0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
246e0 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74  .  **    needs t
246f0 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  o run internally
24700 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73   on child tables
24710 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
24720 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a   index that can.
24730 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20    **    be used 
24740 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73  to optimize this
24750 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
24760 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64  can also be used
24770 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20   by the FK.  ** 
24780 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
24790 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45  n to optimize DE
247a0 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
247b0 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
247c0 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20   parent.  **    
247d0 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
247e0 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65   1. A GLOB patte
247f0 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  rn suitable for 
24800 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
24810 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f  ). If the plan o
24820 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20  utput by.  **   
24830 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
24840 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
24850 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74  matches this pat
24860 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tern, then the s
24870 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f  chema.  **    co
24880 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20  ntains an index 
24890 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
248a0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
248b0 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
248c0 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 2. Human reada
248d0 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
248e0 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c  scribes the chil
248f0 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  d table and colu
24900 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
24910 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64   **       "child
24920 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
24930 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a  1, child_key2)".
24940 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d    **.  ** 3. Hum
24950 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
24960 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
24970 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
24980 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
24990 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
249a0 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65     "parent_table
249b0 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61  (parent_key1, pa
249c0 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  rent_key2)".  **
249d0 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20  .  ** 4. A full 
249e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
249f0 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  tement for an in
24a00 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62  dex that could b
24a10 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20  e used to.  **  
24a20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54    optimize DELET
24a30 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
24a40 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
24a50 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e  rent table. e.g.
24a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
24a70 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63   "CREATE INDEX c
24a80 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64  hild_table_child
24a90 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61  _key ON child_ta
24aa0 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a  ble(child_key)".
24ab0 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65    **.  ** 5. The
24ac0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
24ad0 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ent table..  **.
24ae0 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76    ** These six v
24af0 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62  alues are used b
24b00 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65  y the C logic be
24b10 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  low to generate 
24b20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f  the report..  */
24b30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24b40 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20  Sql =.  "SELECT 
24b50 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50  ".    "     'EXP
24b60 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
24b70 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20  SELECT 1 FROM ' 
24b80 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
24b90 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20   || ' WHERE '". 
24ba0 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
24bb0 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61  oncat(quote(s.na
24bc0 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
24bd0 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
24be0 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c   '=?' ".    "  |
24bf0 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  | fkey_collate_c
24c00 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
24c10 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
24c20 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
24c30 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
24c40 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41  e, f.[from]),' A
24c50 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a  ND ')".    ", ".
24c60 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43      "     'SEARC
24c70 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e  H TABLE ' || s.n
24c80 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43  ame || ' USING C
24c90 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27  OVERING INDEX*('
24ca0 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
24cb0 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20  p_concat('*=?', 
24cc0 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22  ' AND ') || ')'"
24cd0 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
24ce0 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27      s.name  || '
24cf0 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
24d00 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c  at(f.[from],  ',
24d10 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
24d20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
24d30 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20  .[table] || '(' 
24d40 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
24d50 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
24d60 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27   p.[name])) || '
24d70 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
24d80 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49   "     'CREATE I
24d90 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28  NDEX ' || quote(
24da0 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67  s.name ||'_'|| g
24db0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
24dc0 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20  rom], '_'))".   
24dd0 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c   "  || ' ON ' ||
24de0 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
24df0 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  | '('".    "  ||
24e00 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
24e10 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
24e20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66  ".    "        f
24e30 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
24e40 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
24e50 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
24e60 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
24e70 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
24e80 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c  e, f.[from]), ',
24e90 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27   ')".    "  || '
24ea0 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  );'".    ", ".  
24eb0 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
24ec0 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71  ] ".    "FROM sq
24ed0 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73  lite_master AS s
24ee0 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e  , pragma_foreign
24ef0 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65  _key_list(s.name
24f00 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45  ) AS f ".    "LE
24f10 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74  FT JOIN pragma_t
24f20 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f  able_info AS p O
24f30 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20  N (pk-1=seq AND 
24f40 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29  p.arg=f.[table])
24f50 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59   ".    "GROUP BY
24f60 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a   s.name, f.id ".
24f70 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43      "ORDER BY (C
24f80 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20  ASE WHEN ? THEN 
24f90 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73  f.[table] ELSE s
24fa0 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a  .name END)".  ;.
24fb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
24fc0 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48  lobIPK = "SEARCH
24fd0 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49   TABLE * USING I
24fe0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
24ff0 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a  EY (rowid=?)";..
25000 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
25010 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
25020 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
25030 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Arg[i]);.    if(
25040 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
25050 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f  strnicmp("-verbo
25060 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  se", azArg[i], n
25070 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56  )==0 ){.      bV
25080 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
25090 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
250a0 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
250b0 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79  rnicmp("-groupby
250c0 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69  parent", azArg[i
250d0 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
250e0 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74    bGroupByParent
250f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64   = 1;.      zInd
25100 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20  ent = "    ";.  
25110 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
25120 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
25130 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
25140 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20  s %s ?-verbose? 
25150 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f  ?-groupbyparent?
25160 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  \n",.          a
25170 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31  zArg[0], azArg[1
25180 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
25190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
251a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
251b0 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
251c0 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  he fkey_collate_
251d0 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e  clause() SQL fun
251e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20  ction */.  rc = 
251f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
25200 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65  unction(db, "fke
25210 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
25220 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
25230 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c  8,.      0, shel
25240 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
25250 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a  se, 0, 0.  );...
25260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25270 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
25280 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
25290 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
252a0 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a   &pSql, 0);.  }.
252b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
252c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
252d0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
252e0 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72  , 1, bGroupByPar
252f0 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
25300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25310 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
25320 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d     char *zPrev =
25330 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   0;.    while( S
25340 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
25350 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
25360 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
25370 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
25380 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
25390 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  n = 0;.      con
253a0 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
253b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
253c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
253d0 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20  (pSql, 0);.     
253e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
253f0 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ob = (const char
25400 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
25410 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
25420 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25430 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74   *zFrom = (const
25440 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
25450 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
25460 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   2);.      const
25470 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d   char *zTarget =
25480 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
25490 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
254a0 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
254b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
254c0 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  I = (const char*
254d0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
254e0 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20  text(pSql, 4);. 
254f0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25500 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73  *zParent = (cons
25510 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
25520 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
25530 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  , 5);..      rc 
25540 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
25550 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
25560 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
25570 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25580 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
25590 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  k;.      if( SQL
255a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
255b0 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
255c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
255d0 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28   char *zPlan = (
255e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
255f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25600 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20  pExplain, 3);.  
25610 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20        res = (.  
25620 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73              0==s
25630 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
25640 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  Glob, zPlan).   
25650 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
25660 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
25670 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20  lobIPK, zPlan). 
25680 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
25690 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
256a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
256b0 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69  xplain);.      i
256c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
256d0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
256e0 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
256f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25700 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
25710 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22   internal error"
25720 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
25730 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25740 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75         if( bGrou
25750 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20  pByParent.      
25760 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c    && (bVerbose |
25770 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20  | res==0).      
25780 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c    && (zPrev==0 |
25790 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
257a0 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76  p(zParent, zPrev
257b0 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
257c0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
257d0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65  tf(out, "-- Pare
257e0 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20  nt table %s\n", 
257f0 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
25800 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25810 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  (zPrev);.       
25820 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74     zPrev = sqlit
25830 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
25840 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
25850 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
25860 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
25870 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25880 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20  (out, "%s%s --> 
25890 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20  %s\n", zIndent, 
258a0 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  zCI, zTarget);. 
258b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
258c0 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
258d0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
258e0 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20  f(out, "%s/* no 
258f0 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65  extra indexes re
25900 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e  quired for %s ->
25910 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
25920 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74           zIndent
25930 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74  , zFrom, zTarget
25940 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
25950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25960 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25970 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a  3_free(zPrev);..
25980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
259a0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
259b0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
259c0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
259d0 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20     }..    rc2 = 
259e0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
259f0 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pSql);.    if( 
25a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25a10 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
25a20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
25a30 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  2;.      raw_pri
25a40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
25a50 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
25a60 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
25a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
25a80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25a90 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
25aa0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
25ab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25ac0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
25ad0 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22  ation of ".lint"
25ae0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
25af0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
25b00 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
25b10 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
25b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
25b30 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
25b40 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
25b50 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b70 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
25b80 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
25b90 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
25ba0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
25bd0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
25be0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
25bf0 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20   n = (nArg>=2 ? 
25c00 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
25c10 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e  ]) : 0);.  if( n
25c20 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  <1 || sqlite3_st
25c30 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  rnicmp(azArg[1],
25c40 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c   "fkey-indexes",
25c50 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65   n) ) goto usage
25c60 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46  ;.  return lintF
25c70 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74  keyIndexes(pStat
25c80 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  e, azArg, nArg);
25c90 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f  .. usage:.  raw_
25ca0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25cb0 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d  Usage %s sub-com
25cc0 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e  mand ?switches..
25cd0 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  .?\n", azArg[0])
25ce0 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
25cf0 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75  tderr, "Where su
25d00 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c  b-commands are:\
25d10 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  n");.  raw_print
25d20 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66  f(stderr, "    f
25d30 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b  key-indexes\n");
25d40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25d50 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21  _ERROR;.}..#if !
25d60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25d70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
25d80 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
25d90 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f  ITE_HAVE_ZLIB)./
25da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25df0 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69  *.** The ".archi
25e00 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d  ve" or ".ar" com
25e10 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
25e20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
25e30 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
25e40 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  , .  int *pRc, .
25e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
25e60 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql, .  sqlite3_s
25e70 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a  tmt **ppStmt.){.
25e80 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
25e90 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
25ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
25eb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
25ec0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
25ed0 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29  , -1, ppStmt, 0)
25ee0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25f00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25f10 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20  rr, "sql error: 
25f20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20  %s (%d)\n", .   
25f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
25f40 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74  rrmsg(db), sqlit
25f50 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20  e3_errcode(db). 
25f60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70       );.      *p
25f70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  Rc = rc;.    }. 
25f80 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
25f90 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72  d shellPreparePr
25fa0 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20  intf(.  sqlite3 
25fb0 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
25fc0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
25fd0 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f  t **ppStmt,.  co
25fe0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
25ff0 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53  .  ....){.  *ppS
26000 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  tmt = 0;.  if( *
26010 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
26020 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
26030 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ;.    char *z;. 
26040 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
26050 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
26060 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
26070 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  zFmt, ap);.    v
26080 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69  a_end(ap);.    i
26090 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
260a0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
260b0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
260c0 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70  .      shellPrep
260d0 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20  are(db, pRc, z, 
260e0 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73  ppStmt);.      s
260f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
26100 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
26110 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69  tic void shellFi
26120 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70  nalize(.  int *p
26130 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
26140 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
26150 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
26160 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
26170 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
26180 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74  (pStmt);.    int
26190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
261a0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
261b0 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c     if( *pRc==SQL
261c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
261d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
261e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  K ){.        raw
261f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26200 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
26210 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
26220 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a  g(db));.      }.
26230 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b        *pRc = rc;
26240 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
26250 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52  atic void shellR
26260 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63  eset(.  int *pRc
26270 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
26280 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e  t *pStmt.){.  in
26290 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  t rc = sqlite3_r
262a0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
262b0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
262c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
262d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
262e0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
262f0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
26300 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
26310 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
26320 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72  derr, "SQL error
26330 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
26340 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
26350 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72    }.    *pRc = r
26360 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53  c;.  }.}./*.** S
26370 74 72 75 63 74 75 72 65 20 72 65 70 72 65 73 65  tructure represe
26380 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22  nting a single "
26390 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  .ar" command..*/
263a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
263b0 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d  ArCommand ArComm
263c0 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f  and;.struct ArCo
263d0 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d  mmand {.  u8 eCm
263e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
263f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
26400 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a  AR_CMD_* value *
26410 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b  /.  u8 bVerbose;
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
26440 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38  -verbose */.  u8
26450 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20   bZip;          
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26470 20 54 72 75 65 20 69 66 20 74 68 65 20 61 72 63   True if the arc
26480 68 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f  hive is a ZIP */
26490 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20  .  u8 bDryRun;  
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d     /* True if --
264c0 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20  dry-run */.  u8 
264d0 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20  bAppend;        
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
264f0 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64  True if --append
26500 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d 43 6d 64   */.  u8 fromCmd
26510 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Line;           
26520 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 66 72 6f        /* Run fro
26530 6d 20 2d 41 20 69 6e 73 74 65 61 64 20 6f 66 20  m -A instead of 
26540 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 69 6e  .archive */.  in
26550 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26570 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61   Number of comma
26580 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26590 20 20 63 68 61 72 20 2a 7a 53 72 63 54 61 62 6c    char *zSrcTabl
265a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
265b0 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a    /* "sqlar", "z
265c0 69 70 66 69 6c 65 28 24 66 69 6c 65 29 22 20 6f  ipfile($file)" o
265d0 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e  r "zip" */.  con
265e0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20  st char *zFile; 
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26600 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c  --file argument,
26610 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f   or NULL */.  co
26620 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 20  nst char *zDir; 
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26640 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 61 72 67   --directory arg
26650 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a  ument, or NULL *
26660 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
26670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26680 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
26690 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
266a0 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74  s */.  ShellStat
266b0 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
266c0 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20         /* Shell 
266d0 73 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  state */.  sqlit
266e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
266f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
26700 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
26710 67 20 74 68 65 20 61 72 63 68 69 76 65 20 2a 2f  g the archive */
26720 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  .};../*.** Print
26730 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67 65   a usage message
26740 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d   for the .ar com
26750 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61  mand to stderr a
26760 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
26770 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69  _ERROR..*/.stati
26780 63 20 69 6e 74 20 61 72 55 73 61 67 65 28 46 49  c int arUsage(FI
26790 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f 77 48 65  LE *f){.  showHe
267a0 6c 70 28 66 2c 22 61 72 63 68 69 76 65 22 29 3b  lp(f,"archive");
267b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
267c0 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
267d0 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   Print an error 
267e0 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20  message for the 
267f0 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73  .ar command to s
26800 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
26810 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
26820 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R..*/.static int
26830 20 61 72 45 72 72 6f 72 4d 73 67 28 41 72 43 6f   arErrorMsg(ArCo
26840 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e 73  mmand *pAr, cons
26850 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
26860 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
26870 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76  ;.  char *z;.  v
26880 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
26890 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
268a0 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
268b0 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
268c0 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
268d0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
268e0 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 69 66   %s\n", z);.  if
268f0 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64 4c 69  ( pAr->fromCmdLi
26900 6e 65 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  ne ){.    utf8_p
26910 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
26920 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20 6d 6f  se \"-A\" for mo
26930 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d  re help\n");.  }
26940 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
26950 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
26960 73 65 20 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d  se \".archive --
26970 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72 65 20  help\" for more 
26980 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  help\n");.  }.  
26990 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
269a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
269b0 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
269c0 20 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f   Values for ArCo
269d0 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23  mmand.eCmd..*/.#
269e0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52  define AR_CMD_CR
269f0 45 41 54 45 20 20 20 20 20 20 20 31 0a 23 64 65  EATE       1.#de
26a00 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  fine AR_CMD_EXTR
26a10 41 43 54 20 20 20 20 20 20 32 0a 23 64 65 66 69  ACT      2.#defi
26a20 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20  ne AR_CMD_LIST  
26a30 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
26a40 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20   AR_CMD_UPDATE  
26a50 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41       4.#define A
26a60 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20  R_CMD_HELP      
26a70 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65     5../*.** Othe
26a80 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20  r (non-command) 
26a90 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65  switches..*/.#de
26aa0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56  fine AR_SWITCH_V
26ab0 45 52 42 4f 53 45 20 20 20 20 20 36 0a 23 64 65  ERBOSE     6.#de
26ac0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46  fine AR_SWITCH_F
26ad0 49 4c 45 20 20 20 20 20 20 20 20 37 0a 23 64 65  ILE        7.#de
26ae0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
26af0 49 52 45 43 54 4f 52 59 20 20 20 38 0a 23 64 65  IRECTORY   8.#de
26b00 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41  fine AR_SWITCH_A
26b10 50 50 45 4e 44 20 20 20 20 20 20 39 0a 23 64 65  PPEND      9.#de
26b20 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
26b30 52 59 52 55 4e 20 20 20 20 20 31 30 0a 0a 73 74  RYRUN     10..st
26b40 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65  atic int arProce
26b50 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61  ssSwitch(ArComma
26b60 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77  nd *pAr, int eSw
26b70 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  itch, const char
26b80 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *zArg){.  switc
26b90 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20  h( eSwitch ){.  
26ba0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
26bb0 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41  EATE:.    case A
26bc0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
26bd0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c     case AR_CMD_L
26be0 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  IST:.    case AR
26bf0 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20  _CMD_UPDATE:.   
26c00 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c   case AR_CMD_HEL
26c10 50 3a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  P:.      if( pAr
26c20 2d 3e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  ->eCmd ){.      
26c30 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
26c40 4d 73 67 28 70 41 72 2c 20 22 6d 75 6c 74 69 70  Msg(pAr, "multip
26c50 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f  le command optio
26c60 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
26c70 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20      pAr->eCmd = 
26c80 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62  eSwitch;.      b
26c90 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
26ca0 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e  AR_SWITCH_DRYRUN
26cb0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72  :.      pAr->bDr
26cc0 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  yRun = 1;.      
26cd0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
26ce0 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
26cf0 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56  E:.      pAr->bV
26d00 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
26d10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
26d20 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  e AR_SWITCH_APPE
26d30 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  ND:.      pAr->b
26d40 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20  Append = 1;.    
26d50 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
26d60 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20  nto --file */.  
26d70 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
26d80 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72  _FILE:.      pAr
26d90 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a  ->zFile = zArg;.
26da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26db0 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
26dc0 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20  DIRECTORY:.     
26dd0 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72   pAr->zDir = zAr
26de0 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  g;.      break;.
26df0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
26e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26e10 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d  * Parse the comm
26e20 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20  and line for an 
26e30 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  ".ar" command. T
26e40 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 77  he results are w
26e50 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73  ritten into.** s
26e60 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e  tructure (*pAr).
26e70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26e80 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f  turned if the co
26e90 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61  mmand line is pa
26ea0 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66  rsed.** successf
26eb0 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20  ully, otherwise 
26ec0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26ed0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73   is written to s
26ee0 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51  tderr and .** SQ
26ef0 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72  LITE_ERROR retur
26f00 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
26f10 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e  nt arParseComman
26f20 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  d(.  char **azAr
26f30 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
26f40 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
26f50 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
26f60 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
26f70 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26fa0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
26fb0 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d  Arg[] */.  ArCom
26fc0 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20  mand *pAr       
26fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
26fe0 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
26ff0 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
27000 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20  t ArSwitch {.   
27010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
27020 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68  ng;.    char cSh
27030 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69  ort;.    u8 eSwi
27040 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67  tch;.    u8 bArg
27050 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20  ;.  } aSwitch[] 
27060 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74  = {.    { "creat
27070 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43  e",    'c', AR_C
27080 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20  MD_CREATE,      
27090 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74   0 },.    { "ext
270a0 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52  ract",   'x', AR
270b0 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20  _CMD_EXTRACT,   
270c0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c     0 },.    { "l
270d0 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20  ist",      't', 
270e0 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20  AR_CMD_LIST,    
270f0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
27100 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27  "update",    'u'
27110 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c  , AR_CMD_UPDATE,
27120 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
27130 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27  { "help",      '
27140 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c  h', AR_CMD_HELP,
27150 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
27160 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20    { "verbose",  
27170 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'v', AR_SWITCH_
27180 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a  VERBOSE,   0 },.
27190 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20      { "file",   
271a0 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43     'f', AR_SWITC
271b0 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d  H_FILE,      1 }
271c0 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22  ,.    { "append"
271d0 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49  ,    'a', AR_SWI
271e0 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31  TCH_APPEND,    1
271f0 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63   },.    { "direc
27200 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53  tory", 'C', AR_S
27210 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c  WITCH_DIRECTORY,
27220 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79   1 },.    { "dry
27230 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52  run",    'n', AR
27240 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20  _SWITCH_DRYRUN, 
27250 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69     0 },.  };.  i
27260 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a  nt nSwitch = siz
27270 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73  eof(aSwitch) / s
27280 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53  izeof(struct ArS
27290 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74  witch);.  struct
272a0 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20   ArSwitch *pEnd 
272b0 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74  = &aSwitch[nSwit
272c0 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  ch];..  if( nArg
272d0 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  <=1 ){.    utf8_
272e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
272f0 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  Wrong number of 
27300 61 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61 67  arguments.  Usag
27310 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  e:\n");.    retu
27320 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72  rn arUsage(stder
27330 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
27340 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
27350 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [1];.    if( z[0
27360 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
27370 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73  /* Traditional s
27380 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63  tyle [tar] invoc
27390 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
273a0 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
273b0 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20  iArg = 2;.      
273c0 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
273d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
273e0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
273f0 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  0;.        struc
27400 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
27410 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f  ;.        for(pO
27420 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
27430 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
27440 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
27450 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
27460 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
27470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27480 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29  if( pOpt==pEnd )
27490 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
274a0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
274b0 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
274c0 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b   option: %c", z[
274d0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
274e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d         if( pOpt-
274f0 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
27500 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72     if( iArg>=nAr
27510 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
27520 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
27530 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
27540 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
27550 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b  ment: %c",z[i]);
27560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27570 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
27580 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20  Arg[iArg++];.   
27590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
275a0 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
275b0 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53  ch(pAr, pOpt->eS
275c0 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72  witch, zArg) ) r
275d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
275e0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
275f0 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
27600 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69  rg-iArg;.      i
27610 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29  f( pAr->nArg>0 )
27620 7b 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61  {.        pAr->a
27630 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
27640 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg];.      }.   
27650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27660 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c   Non-traditional
27670 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
27680 20 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20       int iArg;. 
27690 20 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b       for(iArg=1;
276a0 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67   iArg<nArg; iArg
276b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
276c0 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   n;.        z = 
276d0 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
276e0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
276f0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
27700 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  /* All remaining
27710 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f   command line wo
27720 72 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20  rds are command 
27730 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  arguments. */.  
27740 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
27750 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
27760 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  ];.          pAr
27770 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
27780 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  rg;.          br
27790 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
277a0 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
277b0 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20  n30(z);..       
277c0 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29   if( z[1]!='-' )
277d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
277e0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;.          /* 
277f0 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72  One or more shor
27800 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  t options */.   
27810 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
27820 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
27830 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
27840 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
27850 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27860 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a  ArSwitch *pOpt;.
27870 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
27880 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
27890 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
278a0 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
278b0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
278c0 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
278d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
278e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
278f0 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a  ( pOpt==pEnd ){.
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
27910 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
27920 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a  pAr, "unrecogniz
27930 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20  ed option: %c", 
27940 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
27950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27960 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
27970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27980 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a   if( i<(n-1) ){.
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279a0 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a  zArg = &z[i+1];.
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  i = n;.         
279d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
279e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
279f0 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
27a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27a10 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
27a20 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69  orMsg(pAr, "opti
27a30 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
27a40 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69  rgument: %c",z[i
27a50 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
27a60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27a70 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
27a80 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
27a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ab0 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
27ac0 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
27ad0 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
27ae0 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
27af0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27b10 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27  else if( z[2]=='
27b20 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \0' ){.         
27b30 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c   /* A -- option,
27b40 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
27b50 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   all remaining c
27b60 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
27b70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
27b80 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
27b90 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
27ba0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
27bb0 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b   &azArg[iArg+1];
27bc0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
27bd0 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
27be0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
27bf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
27c00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
27c10 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a   A long option *
27c20 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  /.          cons
27c30 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
27c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27c50 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70   Argument for op
27c60 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  tion, if any */.
27c70 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
27c80 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63   ArSwitch *pMatc
27c90 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d  h = 0;      /* M
27ca0 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a  atching option *
27cb0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  /.          stru
27cc0 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
27cd0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
27ce0 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   Iterator */.   
27cf0 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
27d00 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
27d10 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
27d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
27d30 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d  st char *zLong =
27d40 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20   pOpt->zLong;.  
27d50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
27d60 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c  -2)<=strlen30(zL
27d70 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
27d80 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
27d90 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
27da0 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
27db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27dc0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
27dd0 6f 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69  orMsg(pAr, "ambi
27de0 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73  guous option: %s
27df0 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",z);.          
27e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27e10 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
27e20 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20  h = pOpt;.      
27e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27e50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
27e60 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a  f( pMatch==0 ){.
27e70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
27e80 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
27e90 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
27ea0 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29   option: %s", z)
27eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74          if( pMat
27ed0 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  ch->bArg ){.    
27ee0 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
27ef0 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
27f00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
27f10 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
27f20 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
27f30 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
27f40 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
27f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27f60 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
27f70 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
27f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27f90 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
27fa0 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d  tch(pAr, pMatch-
27fb0 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
27fc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27fd0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
27fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27ff0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
28000 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28010 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
28020 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20  ssumes that all 
28030 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e  arguments within
28040 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61   the ArCommand.a
28050 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  zArg[].** array 
28060 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65  refer to archive
28070 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72   members, as for
28080 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f   the --extract o
28090 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64  r --list command
280a0 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73  s. .** It checks
280b0 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
280c0 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  em are present. 
280d0 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64  If any specified
280e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
280f0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61  present in the a
28100 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72  rchive, an error
28110 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73   is printed to s
28120 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72  tderr and an err
28130 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72  or.** code retur
28140 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
28150 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64  if all specified
28160 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70   arguments are p
28170 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
28180 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45   archive, SQLITE
28190 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
281a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
281b0 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20  tion strips any 
281c0 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61  trailing '/' cha
281d0 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63  racters from eac
281e0 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  h argument..** T
281f0 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  his is consisten
28200 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74  t with the way t
28210 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64  he [tar] command
28220 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f   seems to work o
28230 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73  n.** Linux..*/.s
28240 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63  tatic int arChec
28250 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61  kEntries(ArComma
28260 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20  nd *pAr){.  int 
28270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28280 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20    if( pAr->nArg 
28290 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
282a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
282b0 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
282c0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
282d0 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
282e0 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20  rc, &pTest,.    
282f0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
28300 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e   FROM %s WHERE n
28310 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20  ame=$name", .   
28320 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61       pAr->zSrcTa
28330 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a  ble.    );.    j
28340 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
28350 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
28360 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b  pTest, "$name");
28370 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28380 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
28390 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
283a0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
283b0 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
283c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
283d0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
283e0 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
283f0 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
28400 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
28410 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
28420 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
28430 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
28440 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31  (pTest, j, z, -1
28450 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
28460 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
28470 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
28480 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
28490 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
284a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
284b0 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
284c0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
284d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
284e0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
284f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
28500 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
28510 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
28520 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
28530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
28540 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
28550 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
28560 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
28570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
28590 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
285a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
285b0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
285c0 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
285d0 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
285e0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
285f0 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
28600 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
28610 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
28620 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
28630 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
28640 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
28650 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
28660 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
28670 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
28680 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
28690 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
286a0 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
286b0 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
286c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
286d0 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
286e0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
286f0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
28700 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
28710 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
28720 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
28730 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
28740 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
28750 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
28760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28770 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
28780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
28790 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
287a0 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
287b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
287c0 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
287d0 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
287e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
287f0 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
28800 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
28810 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
28820 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
28830 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
28840 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
28850 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65        "%z%s name
28860 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74   = '%q' OR subst
28870 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27  r(name,1,%d) = '
28880 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20  %q/'", .        
28890 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
288a0 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31  z, strlen30(z)+1
288b0 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , z.        );. 
288c0 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
288d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
288e0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
288f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
28900 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28910 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
28920 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
28930 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
28940 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
28950 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
28960 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
28970 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  lisT" command. .
28980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
28990 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ListCommand(ArCo
289a0 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
289b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
289c0 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f  = "SELECT %s FRO
289d0 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20  M %s WHERE %s"; 
289e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
289f0 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zCols[] = {.    
28a00 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d  "name",.    "lsm
28a10 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64  ode(mode), sz, d
28a20 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27  atetime(mtime, '
28a30 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d  unixepoch'), nam
28a40 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20  e".  };..  char 
28a50 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73  *zWhere = 0;.  s
28a60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
28a70 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  l = 0;.  int rc;
28a80 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
28a90 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
28aa0 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
28ab0 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
28ac0 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
28ad0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
28ae0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
28af0 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
28b00 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28b20 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
28b30 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41  Where);.  if( pA
28b40 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
28b50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
28b60 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
28b70 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
28b80 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Sql));.  }else{.
28b90 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
28ba0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
28bb0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
28bc0 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
28bd0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
28be0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
28bf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
28c00 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20  ->p->out, "%s % 
28c10 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a  10d  %s  %s\n",.
28c20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28c30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
28c40 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20  pSql, 0),.      
28c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
28c60 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
28c70 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
28c80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
28c90 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20  ext(pSql, 2),.  
28ca0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28cb0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
28cc0 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29  ql, 3).        )
28cd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28ce0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
28cf0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
28d00 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
28d10 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
28d20 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
28d30 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c     }.  }.  shell
28d40 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
28d50 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ql);.  sqlite3_f
28d60 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
28d70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
28d80 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
28d90 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
28da0 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
28db0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
28dc0 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43  tractCommand(ArC
28dd0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
28de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
28df0 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54  1 = .    "SELECT
28e00 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c   ".    " ($dir |
28e10 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20  | name),".    " 
28e20 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20  writefile(($dir 
28e30 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f  || name), %s, mo
28e40 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20  de, mtime) ".   
28e50 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20   "FROM %s WHERE 
28e60 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
28e70 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e  S NULL OR $dirOn
28e80 6c 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41  ly = 0)".    " A
28e90 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42  ND name NOT GLOB
28ea0 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a   '*..[/\\]*'";..
28eb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
28ec0 45 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a  ExtraArg[] = { .
28ed0 20 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d      "sqlar_uncom
28ee0 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22  press(data, sz)"
28ef0 2c 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d  ,.    "data".  }
28f00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ;..  sqlite3_stm
28f10 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69  t *pSql = 0;.  i
28f20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28f30 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20  K;.  char *zDir 
28f40 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68  = 0;.  char *zWh
28f50 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ere = 0;.  int i
28f60 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  , j;..  /* If ar
28f70 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63  guments are spec
28f80 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61  ified, check tha
28f90 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20  t they actually 
28fa0 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a  exist within.  *
28fb0 2a 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65  * the archive be
28fc0 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e  fore proceeding.
28fd0 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61   And formulate a
28fe0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
28ff0 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d  .  ** match them
29000 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43  .  */.  rc = arC
29010 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29  heckEntries(pAr)
29020 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73  ;.  arWhereClaus
29030 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68  e(&rc, pAr, &zWh
29040 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ere);..  if( rc=
29050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29060 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20    if( pAr->zDir 
29070 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  ){.      zDir = 
29080 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29090 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72  "%s/", pAr->zDir
290a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
290b0 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
290c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a  e3_mprintf("");.
290d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
290e0 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ir==0 ) rc = SQL
290f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
29100 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
29110 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
29120 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c  c, &pSql, zSql1,
29130 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41   .      azExtraA
29140 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70  rg[pAr->bZip], p
29150 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
29160 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66  Where.  );..  if
29170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29180 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  ){.    j = sqlit
29190 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
291a0 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24  r_index(pSql, "$
291b0 64 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  dir");.    sqlit
291c0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71  e3_bind_text(pSq
291d0 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20  l, j, zDir, -1, 
291e0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
291f0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
29200 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29210 20 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73   twice. The firs
29220 74 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c  t time, writefil
29230 65 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  e() is called.  
29240 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63    ** for all arc
29250 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61  hive members tha
29260 74 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72  t should be extr
29270 61 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e  acted. The secon
29280 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f  d time,.    ** o
29290 6e 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65  nly for the dire
292a0 63 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73  ctories. This is
292b0 20 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d   because the tim
292c0 65 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20  estamps for.    
292d0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72  ** extracted dir
292e0 65 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65  ectories must be
292f0 20 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65   reset after the
29300 79 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  y are populated 
29310 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  (as.    ** popul
29320 61 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67  ating them chang
29330 65 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  es the timestamp
29340 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ).  */.    for(i
29350 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
29360 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33       j = sqlite3
29370 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
29380 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69  index(pSql, "$di
29390 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73  rOnly");.      s
293a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
293b0 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20  pSql, j, i);.   
293c0 20 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79     if( pAr->bDry
293d0 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
293e0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
293f0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
29400 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
29410 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
29420 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
29430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29440 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
29450 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
29460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29470 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56   i==0 && pAr->bV
29480 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
29490 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
294a0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
294b0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
294c0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
294d0 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
294e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
294f0 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
29500 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b  eset(&rc, pSql);
29510 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
29520 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
29530 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ql);.  }..  sqli
29540 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a  te3_free(zDir);.
29550 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29560 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
29570 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75   rc;.}../*.** Ru
29580 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
29590 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72  ent in zSql.  Or
295a0 20 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72   if doing a --dr
295b0 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69  yrun, merely pri
295c0 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74  nt it out..*/.st
295d0 61 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53  atic int arExecS
295e0 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  ql(ArCommand *pA
295f0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
29600 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Sql){.  int rc;.
29610 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
29620 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  un ){.    utf8_p
29630 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
29640 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
29650 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
29660 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
29670 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
29680 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
29690 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62  te3_exec(pAr->db
296a0 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  , zSql, 0, 0, &z
296b0 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Err);.    if( zE
296c0 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
296d0 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
296e0 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a  "ERROR: %s\n", z
296f0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
29700 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
29710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29720 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
29730 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
29740 6f 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 20  of .ar "create" 
29750 61 6e 64 20 22 75 70 64 61 74 65 22 20 63 6f 6d  and "update" com
29760 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65  mands..**.** Cre
29770 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20  ate the "sqlar" 
29780 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
29790 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73  abase if it does
297a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
297b0 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20  st..** Then add 
297c0 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65  each file in the
297d0 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20   azFile[] array 
297e0 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20  to the archive. 
297f0 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61  Directories.** a
29800 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69  re added recursi
29810 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e  vely. If argumen
29820 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f  t bVerbose is no
29830 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67  n-zero, a messag
29840 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20  e is.** printed 
29850 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61  on stdout for ea
29860 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64  ch file archived
29870 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61  ..**.** The crea
29880 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68  te command is th
29890 65 20 73 61 6d 65 20 61 73 20 75 70 64 61 74 65  e same as update
298a0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
298b0 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78   drops.** any ex
298c0 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20 74  isting "sqlar" t
298d0 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69  able before begi
298e0 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  nning..*/.static
298f0 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72 55   int arCreateOrU
29900 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20 20  pdateCommand(.  
29910 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
29940 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73  ents and options
29950 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74   */.  int bUpdat
29960 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
29970 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66 6f        /* true fo
29980 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 20 66  r a --create.  f
29990 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70 64 61 74  alse for --updat
299a0 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
299b0 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
299c0 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54  .      "CREATE T
299d0 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
299e0 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a 20 20 20  TS sqlar(\n".   
299f0 20 20 20 22 20 20 6e 61 6d 65 20 54 45 58 54 20     "  name TEXT 
29a00 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d 2d  PRIMARY KEY,  --
29a10 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
29a20 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 6f  e\n".      "  mo
29a30 64 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  de INT,         
29a40 20 20 20 20 20 20 2d 2d 20 61 63 63 65 73 73 20        -- access 
29a50 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a 20  permissions\n". 
29a60 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20 49 4e       "  mtime IN
29a70 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
29a80 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69 63 61  -- last modifica
29a90 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20 20 20  tion time\n".   
29aa0 20 20 20 22 20 20 73 7a 20 49 4e 54 2c 20 20 20     "  sz INT,   
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
29ac0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 73   original file s
29ad0 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ize\n".      "  
29ae0 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20 20 20  data BLOB       
29af0 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70 72          -- compr
29b00 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e 22  essed content\n"
29b10 0a 20 20 20 20 20 20 22 29 22 3b 0a 20 20 63 6f  .      ")";.  co
29b20 6e 73 74 20 63 68 61 72 20 2a 7a 44 72 6f 70 20  nst char *zDrop 
29b30 3d 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  = "DROP TABLE IF
29b40 20 45 58 49 53 54 53 20 73 71 6c 61 72 22 3b 0a   EXISTS sqlar";.
29b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
29b60 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a  nsertFmt[2] = {.
29b70 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
29b80 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c  TO %s(name,mode,
29b90 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61 29 5c 6e  mtime,sz,data)\n
29ba0 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  ".     "  SELECT
29bb0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73  \n".     "    %s
29bc0 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
29bd0 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ode,\n".     "  
29be0 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20    mtime,\n".    
29bf0 20 22 20 20 20 20 43 41 53 45 20 73 75 62 73 74   "    CASE subst
29c00 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 31  r(lsmode(mode),1
29c10 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ,1)\n".     "   
29c20 20 20 20 57 48 45 4e 20 27 2d 27 20 54 48 45 4e     WHEN '-' THEN
29c30 20 6c 65 6e 67 74 68 28 64 61 74 61 29 5c 6e 22   length(data)\n"
29c40 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45  .     "      WHE
29c50 4e 20 27 64 27 20 54 48 45 4e 20 30 5c 6e 22 0a  N 'd' THEN 0\n".
29c60 20 20 20 20 20 22 20 20 20 20 20 20 45 4c 53 45       "      ELSE
29c70 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20 20 20 20   -1 END,\n".    
29c80 20 22 20 20 20 20 73 71 6c 61 72 5f 63 6f 6d 70   "    sqlar_comp
29c90 72 65 73 73 28 64 61 74 61 29 5c 6e 22 0a 20 20  ress(data)\n".  
29ca0 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72     "  FROM fsdir
29cb0 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20  (%Q,%Q)\n".     
29cc0 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
29cd0 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
29ce0 3f 25 25 27 3b 22 2c 0a 20 20 20 20 20 22 52 45  ?%%';",.     "RE
29cf0 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61  PLACE INTO %s(na
29d00 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61  me,mode,mtime,da
29d10 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53  ta)\n".     "  S
29d20 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20  ELECT\n".     " 
29d30 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22     %s,\n".     "
29d40 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20      mode,\n".   
29d50 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22    "    mtime,\n"
29d60 0a 20 20 20 20 20 22 20 20 20 20 64 61 74 61 5c  .     "    data\
29d70 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  n".     "  FROM 
29d80 66 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a  fsdir(%Q,%Q)\n".
29d90 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73       "  WHERE ls
29da0 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c  mode(mode) NOT L
29db0 49 4b 45 20 27 3f 25 25 27 3b 22 0a 20 20 7d 3b  IKE '?%%';".  };
29dc0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29de0 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
29df0 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69  ing through azFi
29e00 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  le[] */.  int rc
29e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29e30 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  urn code */.  co
29e40 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
29e50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
29e60 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20   SQL table into 
29e70 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20  which to insert 
29e80 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  */.  char *zSql;
29e90 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30  .  char zTemp[50
29ea0 5d 3b 0a 0a 20 20 61 72 45 78 65 63 53 71 6c 28  ];..  arExecSql(
29eb0 70 41 72 2c 20 22 50 52 41 47 4d 41 20 70 61 67  pAr, "PRAGMA pag
29ec0 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a 20 20  e_size=512");.  
29ed0 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
29ee0 41 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 61  Ar, "SAVEPOINT a
29ef0 72 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  r;");.  if( rc!=
29f00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29f10 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70 5b 30  rn rc;.  zTemp[0
29f20 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28 20 70 41  ] = 0; .  if( pA
29f30 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20 20 2f  r->bZip ){.    /
29f40 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
29f50 20 7a 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c   zipfile virtual
29f60 20 74 61 62 6c 65 2c 20 69 66 20 6e 65 63 65 73   table, if neces
29f70 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
29f80 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20  pAr->zFile ){.  
29f90 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
29fa0 36 34 20 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  64 r;.      sqli
29fb0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
29fc0 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a 20 20  izeof(r),&r);.  
29fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29fe0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 65 6d  intf(sizeof(zTem
29ff0 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25 30 31  p),zTemp,"zip%01
2a000 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20 20 20  6llx",r);.      
2a010 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  zTab = zTemp;.  
2a020 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2a030 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2a040 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52       "CREATE VIR
2a050 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e  TUAL TABLE temp.
2a060 25 73 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  %s USING zipfile
2a070 28 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20  (%Q)",.         
2a080 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69 6c 65  zTab, pAr->zFile
2a090 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2a0a0 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
2a0b0 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  Ar, zSql);.     
2a0c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2a0d0 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
2a0e0 20 20 20 20 20 20 7a 54 61 62 20 3d 20 22 7a 69        zTab = "zi
2a0f0 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  p";.    }.  }els
2a100 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
2a110 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 66  lize the table f
2a120 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f 0a 20  or an SQLAR */. 
2a130 20 20 20 7a 54 61 62 20 3d 20 22 73 71 6c 61 72     zTab = "sqlar
2a140 22 3b 0a 20 20 20 20 69 66 28 20 62 55 70 64 61  ";.    if( bUpda
2a150 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  te==0 ){.      r
2a160 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2a170 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20 20  r, zDrop);.     
2a180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a190 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 72  OK ) goto end_ar
2a1a0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  _transaction;.  
2a1b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 72 45    }.    rc = arE
2a1c0 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 43 72 65  xecSql(pAr, zCre
2a1d0 61 74 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ate);.  }.  for(
2a1e0 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
2a1f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2a200 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  K; i++){.    cha
2a210 72 20 2a 7a 53 71 6c 32 20 3d 20 73 71 6c 69 74  r *zSql2 = sqlit
2a220 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e 73 65  e3_mprintf(zInse
2a230 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69 70 5d  rtFmt[pAr->bZip]
2a240 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20 20 20 20  , zTab,.        
2a250 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3f 20  pAr->bVerbose ? 
2a260 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61  "shell_putsnl(na
2a270 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c 0a 20  me)" : "name",. 
2a280 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2a290 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69 72 29  g[i], pAr->zDir)
2a2a0 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65  ;.    rc = arExe
2a2b0 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29  cSql(pAr, zSql2)
2a2c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2a2d0 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65  ee(zSql2);.  }.e
2a2e0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
2a2f0 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  n:.  if( rc!=SQL
2a300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72  ITE_OK ){.    ar
2a310 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 4f  ExecSql(pAr, "RO
2a320 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45  LLBACK TO ar; RE
2a330 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d  LEASE ar;");.  }
2a340 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2a350 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52  rExecSql(pAr, "R
2a360 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20  ELEASE ar;");.  
2a370 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
2a380 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  && pAr->zFile ){
2a390 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
2a3a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44  lite3_mprintf("D
2a3b0 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ROP TABLE %s", z
2a3c0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45  Temp);.      arE
2a3d0 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2a3e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a3f0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2a400 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a410 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
2a420 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
2a430 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  .ar" dot command
2a440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a450 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  arDotCommand(.  
2a460 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
2a470 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2a480 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
2a490 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
2a4a0 20 69 6e 74 20 66 72 6f 6d 43 6d 64 4c 69 6e 65   int fromCmdLine
2a4b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a4c0 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 41 20 63   /* True if -A c
2a4d0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
2a4e0 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20 63 6d 64 20  on, not .ar cmd 
2a4f0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
2a500 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2a510 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2a520 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
2a530 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
2a540 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a570 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
2a580 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72  Arg[] */.){.  Ar
2a590 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69  Command cmd;.  i
2a5a0 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  nt rc;.  memset(
2a5b0 26 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &cmd, 0, sizeof(
2a5c0 63 6d 64 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f  cmd));.  cmd.fro
2a5d0 6d 43 6d 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43  mCmdLine = fromC
2a5e0 6d 64 4c 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61  mdLine;.  rc = a
2a5f0 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a  rParseCommand(az
2a600 41 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29  Arg, nArg, &cmd)
2a610 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
2a630 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c   eDbType = SHELL
2a640 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20  _OPEN_UNSPEC;.  
2a650 20 20 63 6d 64 2e 70 20 3d 20 70 53 74 61 74 65    cmd.p = pState
2a660 3b 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 70  ;.    cmd.db = p
2a670 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69  State->db;.    i
2a680 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a  f( cmd.zFile ){.
2a690 20 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20        eDbType = 
2a6a0 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79  deduceDatabaseTy
2a6b0 70 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29  pe(cmd.zFile, 1)
2a6c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a6d0 20 20 20 65 44 62 54 79 70 65 20 3d 20 70 53 74     eDbType = pSt
2a6e0 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20  ate->openMode;. 
2a6f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44 62     }.    if( eDb
2a700 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
2a710 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
2a720 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d    if( cmd.eCmd==
2a730 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 7c  AR_CMD_EXTRACT |
2a740 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  | cmd.eCmd==AR_C
2a750 4d 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20 20 20  MD_LIST ){.     
2a760 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65     if( cmd.zFile
2a770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a780 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
2a790 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2a7a0 28 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 20  ("zip");.       
2a7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a7c0 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2a7d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2a7e0 66 28 22 7a 69 70 66 69 6c 65 28 25 51 29 22 2c  f("zipfile(%Q)",
2a7f0 20 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20   cmd.zFile);.   
2a800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a810 20 20 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20       cmd.bZip = 
2a820 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2a830 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20   cmd.zFile ){.  
2a840 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20      int flags;. 
2a850 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70       if( cmd.bAp
2a860 70 65 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d  pend ) eDbType =
2a870 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
2a880 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28  NDVFS;.      if(
2a890 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2a8a0 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e  D_CREATE || cmd.
2a8b0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
2a8c0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ATE ){.        f
2a8d0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
2a8e0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2a8f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
2a900 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a910 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51        flags = SQ
2a920 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2a930 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
2a940 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20    cmd.db = 0;.  
2a950 20 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79      if( cmd.bDry
2a960 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
2a970 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74  tf8_printf(pStat
2a980 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e  e->out, "-- open
2a990 20 64 61 74 61 62 61 73 65 20 27 25 73 27 25 73   database '%s'%s
2a9a0 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a  \n", cmd.zFile,.
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62               eDb
2a9c0 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
2a9d0 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75  _APPENDVFS ? " u
2a9e0 73 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20  sing 'apndvfs'" 
2a9f0 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  : "");.      }. 
2aa00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2aa10 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46  3_open_v2(cmd.zF
2aa20 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c  ile, &cmd.db, fl
2aa30 61 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ags, .          
2aa40 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c     eDbType==SHEL
2aa50 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
2aa60 20 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30   ? "apndvfs" : 0
2aa70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2aa80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aa90 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2aaa0 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
2aab0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20  t open file: %s 
2aac0 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20  (%s)\n", .      
2aad0 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c        cmd.zFile,
2aae0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2aaf0 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20  cmd.db).        
2ab00 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2ab10 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a  end_ar_command;.
2ab20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2ab30 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
2ab40 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b  t(cmd.db, 0, 0);
2ab50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2ab60 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62  qlar_init(cmd.db
2ab70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2ab80 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2ab90 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22  nction(cmd.db, "
2aba0 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31  shell_putsnl", 1
2abb0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63  , SQLITE_UTF8, c
2abc0 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20  md.p,.          
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e      shellPutsFun
2abf0 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d  c, 0, 0);..    }
2ac00 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72  .    if( cmd.zSr
2ac10 63 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64  cTable==0 && cmd
2ac20 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e  .bZip==0 && cmd.
2ac30 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c  eCmd!=AR_CMD_HEL
2ac40 50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  P ){.      if( c
2ac50 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f  md.eCmd!=AR_CMD_
2ac60 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 26 26  CREATE.       &&
2ac70 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
2ac80 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63  olumn_metadata(c
2ac90 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c  md.db,0,"sqlar",
2aca0 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30  "name",0,0,0,0,0
2acb0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2acc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2acd0 74 64 65 72 72 2c 20 22 64 61 74 61 62 61 73 65  tderr, "database
2ace0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2acf0 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62  n an 'sqlar' tab
2ad00 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  le\n");.        
2ad10 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2ad20 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
2ad30 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a  end_ar_command;.
2ad40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
2ad50 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2ad60 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73  lite3_mprintf("s
2ad70 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  qlar");.    }.. 
2ad80 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65     switch( cmd.e
2ad90 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73  Cmd ){.      cas
2ada0 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
2adb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2adc0 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f  CreateOrUpdateCo
2add0 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 29 3b 0a  mmand(&cmd, 0);.
2ade0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2adf0 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
2ae00 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 20  D_EXTRACT:.     
2ae10 20 20 20 72 63 20 3d 20 61 72 45 78 74 72 61 63     rc = arExtrac
2ae20 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a  tCommand(&cmd);.
2ae30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2ae40 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
2ae50 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20  D_LIST:.        
2ae60 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61  rc = arListComma
2ae70 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20  nd(&cmd);.      
2ae80 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2ae90 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  case AR_CMD_HELP
2aea0 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73 61 67  :.        arUsag
2aeb0 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a  e(pState->out);.
2aec0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2aed0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
2aee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2aef0 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2af00 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20  UPDATE );.      
2af10 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f    rc = arCreateO
2af20 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26  rUpdateCommand(&
2af30 63 6d 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  cmd, 1);.       
2af40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2af50 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64  }.end_ar_command
2af60 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62 21 3d  :.  if( cmd.db!=
2af70 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20  pState->db ){.  
2af80 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64 2e 64    close_db(cmd.d
2af90 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
2afa0 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63 54  3_free(cmd.zSrcT
2afb0 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  able);..  return
2afc0 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66   rc;.}./* End of
2afd0 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22 20   the ".archive" 
2afe0 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  or ".ar" command
2aff0 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   logic.*********
2b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
2b050 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
2b060 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2b070 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
2b080 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
2b090 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  LIB) */.../*.** 
2b0a0 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65  If an input line
2b0b0 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22   begins with "."
2b0c0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69   then invoke thi
2b0d0 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20  s routine to.** 
2b0e0 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e  process that lin
2b0f0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
2b100 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f  1 on error, 2 to
2b110 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68   exit, and 0 oth
2b120 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
2b130 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f  c int do_meta_co
2b140 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e  mmand(char *zLin
2b150 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  e, ShellState *p
2b160 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a  ){.  int h = 1;.
2b170 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
2b180 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e    int n, c;.  in
2b190 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72  t rc = 0;.  char
2b1a0 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23 69   *azArg[50];..#i
2b1b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b1c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2b1d0 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e 70   if( p->expert.p
2b1e0 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65 78  Expert ){.    ex
2b1f0 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31 2c  pertFinish(p, 1,
2b200 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2b210 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
2b220 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20  input line into 
2b230 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77  tokens..  */.  w
2b240 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
2b250 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65  & nArg<ArraySize
2b260 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77  (azArg) ){.    w
2b270 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c  hile( IsSpace(zL
2b280 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20  ine[h]) ){ h++; 
2b290 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  }.    if( zLine[
2b2a0 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  h]==0 ) break;. 
2b2b0 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
2b2c0 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68  ='\'' || zLine[h
2b2d0 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
2b2e0 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e  int delim = zLin
2b2f0 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a  e[h++];.      az
2b300 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
2b310 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
2b320 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
2b330 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69  & zLine[h]!=deli
2b340 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  m ){.        if(
2b350 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20   zLine[h]=='\\' 
2b360 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26  && delim=='"' &&
2b370 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29   zLine[h+1]!=0 )
2b380 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b   h++;.        h+
2b390 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
2b3a0 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64   if( zLine[h]==d
2b3b0 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
2b3c0 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a  zLine[h++] = 0;.
2b3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b3e0 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72  ( delim=='"' ) r
2b3f0 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
2b400 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
2b410 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b420 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b      azArg[nArg++
2b430 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20  ] = &zLine[h];. 
2b440 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e       while( zLin
2b450 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65  e[h] && !IsSpace
2b460 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
2b470 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +; }.      if( z
2b480 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b  Line[h] ) zLine[
2b490 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
2b4a0 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
2b4b0 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
2b4c0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
2b4d0 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
2b4e0 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f  input line..  */
2b4f0 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
2b500 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f   return 0; /* no
2b510 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f   tokens, no erro
2b520 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65  r */.  n = strle
2b530 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n30(azArg[0]);. 
2b540 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d   c = azArg[0][0]
2b550 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  ;.  clearTempFil
2b560 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  e(p);..#ifndef S
2b570 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
2b580 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63  RIZATION.  if( c
2b590 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70  =='a' && strncmp
2b5a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68  (azArg[0], "auth
2b5b0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2b5c0 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20  if( nArg!=2 ){. 
2b5d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2b5e0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2b5f0 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29  .auth ON|OFF\n")
2b600 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2b610 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2b620 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2b630 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
2b640 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  p, 0);.    if( b
2b650 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2b660 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  g[1]) ){.      s
2b670 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
2b680 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65  rizer(p->db, she
2b690 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20  llAuth, p);.    
2b6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2b6b0 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
2b6c0 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  zer(p->db, 0, 0)
2b6d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2b6e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
2b6f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b700 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
2b710 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2b720 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69 66  _HAVE_ZLIB).  if
2b730 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
2b740 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
2b750 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20 29  rchive", n)==0 )
2b760 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
2b770 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72   0);.    rc = ar
2b780 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 30 2c  DotCommand(p, 0,
2b790 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
2b7a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2b7b0 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
2b7c0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2b7d0 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75  azArg[0], "backu
2b7e0 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  p", n)==0).   ||
2b7f0 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33   (c=='s' && n>=3
2b800 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b810 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29  g[0], "save", n)
2b820 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
2b830 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
2b840 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ile = 0;.    con
2b850 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2b860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
2b870 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
2b880 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
2b890 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  p;.    int j;.  
2b8a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
2b8b0 66 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  fs = 0;.    for(
2b8c0 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  j=1; j<nArg; j++
2b8d0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2b8e0 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a  har *z = azArg[j
2b8f0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30  ];.      if( z[0
2b900 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
2b910 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
2b920 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
2b930 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61  f( strcmp(z, "-a
2b940 70 70 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ppend")==0 ){.  
2b950 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22          zVfs = "
2b960 61 70 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20  apndvfs";.      
2b970 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
2b980 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
2b990 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2b9a0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
2b9b0 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d   %s\n", azArg[j]
2b9c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
2b9d0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
2b9e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2b9f0 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
2ba00 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
2ba10 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
2ba20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
2ba30 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db==0 ){.       
2ba40 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65   zDb = zDestFile
2ba50 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  ;.        zDestF
2ba60 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
2ba70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ba80 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ba90 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2baa0 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 2d 2d  .backup ?DB? ?--
2bab0 61 70 70 65 6e 64 3f 20 46 49 4c 45 4e 41 4d 45  append? FILENAME
2bac0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  \n");.        re
2bad0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2bae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
2baf0 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
2bb00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2bb10 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20  tderr, "missing 
2bb20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e  FILENAME argumen
2bb30 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29  t on .backup\n")
2bb40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2bb50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2bb60 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22  zDb==0 ) zDb = "
2bb70 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20  main";.    rc = 
2bb80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
2bb90 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
2bba0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
2bbb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
2bbc0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2bbd0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
2bbe0 7a 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72  zVfs);.    if( r
2bbf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bc00 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2bc10 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2bc20 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2bc30 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
2bc40 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  le);.      close
2bc50 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20  _db(pDest);.    
2bc60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2bc70 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
2bc80 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
2bc90 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
2bca0 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d  p_init(pDest, "m
2bcb0 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62  ain", p->db, zDb
2bcc0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
2bcd0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  up==0 ){.      u
2bce0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2bcf0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
2bd00 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2bd10 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20  (pDest));.      
2bd20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
2bd30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2bd40 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
2bd50 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  (  (rc = sqlite3
2bd60 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
2bd70 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
2bd80 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71  TE_OK ){}.    sq
2bd90 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
2bda0 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
2bdb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bdc0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
2bdd0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
2bde0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2bdf0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2be00 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2be10 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
2be20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2be30 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
2be40 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  _db(pDest);.  }e
2be50 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
2be60 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2be70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2be80 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  bail", n)==0 ){.
2be90 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2bea0 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
2beb0 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e  _error = boolean
2bec0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
2bed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2bee0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2bef0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61  err, "Usage: .ba
2bf00 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  il on|off\n");. 
2bf10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2bf20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2bf30 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
2bf40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2bf50 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20  g[0], "binary", 
2bf60 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2bf70 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2bf80 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
2bf90 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
2bfa0 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72          setBinar
2bfb0 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
2bfc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bfd0 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f         setTextMo
2bfe0 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
2bff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c000 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c010 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c020 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66  e: .binary on|of
2c030 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
2c040 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2c050 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2c060 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
2c070 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a  [0],"cd")==0 ){.
2c080 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2c090 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
2c0a0 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
2c0b0 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77  d(WIN32).      w
2c0c0 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69  char_t *z = sqli
2c0d0 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
2c0e0 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b  o_unicode(azArg[
2c0f0 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
2c100 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63  !SetCurrentDirec
2c110 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20  toryW(z);.      
2c120 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
2c130 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2c140 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d  = chdir(azArg[1]
2c150 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2c160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2c170 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c180 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68  derr, "Cannot ch
2c190 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
2c1a0 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  y \"%s\"\n", azA
2c1b0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
2c1c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
2c1d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c1e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2c1f0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20  rr, "Usage: .cd 
2c200 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20  DIRECTORY\n");. 
2c210 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2c220 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
2c230 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   The undocumente
2c240 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  d ".breakpoint" 
2c250 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61  command causes a
2c260 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d   call to the no-
2c270 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  op.  ** routine 
2c280 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b  named test_break
2c290 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20  point()..  */.  
2c2a0 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
2c2b0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2c2c0 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f  Arg[0], "breakpo
2c2d0 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
2c2e0 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69     test_breakpoi
2c2f0 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  nt();.  }else.. 
2c300 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
2c310 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2c320 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65  zArg[0], "change
2c330 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
2c340 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2c350 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
2c360 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
2c370 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72  untChanges, azAr
2c380 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2c390 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c3a0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c3b0 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f  e: .changes on|o
2c3c0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2c3d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2c3e0 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c  lse..  /* Cancel
2c3f0 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74   output redirect
2c400 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75  ion, if it is cu
2c410 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20  rrently set (by 
2c420 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20  .testcase).  ** 
2c430 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f  Then read the co
2c440 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73  ntent of the tes
2c450 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69  tcase-out.txt fi
2c460 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61  le and compare a
2c470 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72  gainst.  ** azAr
2c480 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20  g[1].  If there 
2c490 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c  are differences,
2c4a0 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   report an error
2c4b0 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a   and exit..  */.
2c4c0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
2c4d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2c4e0 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b  azArg[0], "check
2c4f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2c500 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a  char *zRes = 0;.
2c510 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
2c520 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
2c530 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
2c540 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c550 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20   "Usage: .check 
2c560 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29  GLOB-PATTERN\n")
2c570 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
2c580 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
2c590 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22  Res = readFile("
2c5a0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
2c5b0 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 0))==0 ){.   
2c5c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c5d0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
2c5e0 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63  nnot read 'testc
2c5f0 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29  ase-out.txt'\n")
2c600 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
2c610 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65      }else if( te
2c620 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72  stcase_glob(azAr
2c630 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b  g[1],zRes)==0 ){
2c640 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2c650 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
2c660 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73              "tes
2c670 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c  tcase-%s FAILED\
2c680 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  n Expected: [%s]
2c690 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73  \n      Got: [%s
2c6a0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
2c6b0 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63         p->zTestc
2c6c0 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a  ase, azArg[1], z
2c6d0 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Res);.      rc =
2c6e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2c6f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2c700 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61  (stdout, "testca
2c710 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e  se-%s ok\n", p->
2c720 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20  zTestcase);.    
2c730 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20    p->nCheck++;. 
2c740 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c750 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d  _free(zRes);.  }
2c760 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2c770 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
2c780 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c  Arg[0], "clone",
2c790 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2c7a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2c7b0 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c     tryToClone(p,
2c7c0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2c7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2c7e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2c7f0 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46  "Usage: .clone F
2c800 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
2c810 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2c820 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2c830 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
2c840 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c850 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
2c860 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
2c870 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
2c880 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2c890 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
2c8a0 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
2c8b0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
2c8c0 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
2c8d0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
2c8e0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
2c8f0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2c900 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
2c910 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c920 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f  f(sizeof(data.co
2c930 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61  lSeparator),data
2c940 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a  .colSeparator,":
2c950 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   ");.    data.cn
2c960 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
2c970 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2c980 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c  SELECT name, fil
2c990 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61  e FROM pragma_da
2c9a0 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20  tabase_list",.  
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2c9c0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
2c9d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
2c9e0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
2c9f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ca00 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
2ca10 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
2ca20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ca30 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
2ca40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2ca50 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2ca60 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26  c=='d' && n>=3 &
2ca70 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ca80 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c 20  0], "dbconfig", 
2ca90 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)==0 ){.    sta
2caa0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2cab0 20 44 62 43 6f 6e 66 69 67 43 68 6f 69 63 65 73   DbConfigChoices
2cac0 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
2cad0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
2cae0 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 7d 20    int op;.    } 
2caf0 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a  aDbConfig[] = {.
2cb00 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c          { "enabl
2cb10 65 5f 66 6b 65 79 22 2c 20 20 20 20 20 20 53 51  e_fkey",      SQ
2cb20 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
2cb30 41 42 4c 45 5f 46 4b 45 59 20 20 20 20 20 20 20  ABLE_FKEY       
2cb40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
2cb50 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69 67 67 65  { "enable_trigge
2cb60 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43  r",   SQLITE_DBC
2cb70 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49  ONFIG_ENABLE_TRI
2cb80 47 47 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  GGER         },.
2cb90 20 20 20 20 20 20 20 20 7b 20 22 66 74 73 33 5f          { "fts3_
2cba0 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20 53 51  tokenizer",   SQ
2cbb0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
2cbc0 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49  ABLE_FTS3_TOKENI
2cbd0 5a 45 52 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  ZER  },.        
2cbe0 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  { "load_extensio
2cbf0 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43  n",   SQLITE_DBC
2cc00 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
2cc10 44 5f 45 58 54 45 4e 53 49 4f 4e 20 20 7d 2c 0a  D_EXTENSION  },.
2cc20 20 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 63 6b          { "no_ck
2cc30 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20 53 51  pt_on_close", SQ
2cc40 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f  LITE_DBCONFIG_NO
2cc50 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20 20  _CKPT_ON_CLOSE  
2cc60 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
2cc70 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67 22 2c  { "enable_qpsg",
2cc80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
2cc90 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53  ONFIG_ENABLE_QPS
2cca0 47 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  G            },.
2ccb0 20 20 20 20 20 20 20 20 7b 20 22 74 72 69 67 67          { "trigg
2ccc0 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20 53 51  er_eqp",      SQ
2ccd0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
2cce0 49 47 47 45 52 5f 45 51 50 20 20 20 20 20 20 20  IGGER_EQP       
2ccf0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
2cd00 7b 20 22 72 65 73 65 74 5f 64 61 74 61 62 61 73  { "reset_databas
2cd10 65 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43  e",   SQLITE_DBC
2cd20 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41  ONFIG_RESET_DATA
2cd30 42 41 53 45 20 20 20 20 20 20 20 20 20 7d 2c 0a  BASE         },.
2cd40 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
2cd50 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  i, v;.    open_d
2cd60 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
2cd70 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79 53  (ii=0; ii<ArrayS
2cd80 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b 20  ize(aDbConfig); 
2cd90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
2cda0 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63 6d   nArg>1 && strcm
2cdb0 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43  p(azArg[1], aDbC
2cdc0 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29  onfig[ii].zName)
2cdd0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2cde0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d        if( nArg>=
2cdf0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
2ce00 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
2ce10 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
2ce20 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56  ii].op, booleanV
2ce30 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20  alue(azArg[2]), 
2ce40 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2ce50 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
2ce60 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f  fig(p->db, aDbCo
2ce70 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c  nfig[ii].op, -1,
2ce80 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66 38   &v);.      utf8
2ce90 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2cea0 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44 62  "%18s %s\n", aDb
2ceb0 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
2cec0 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66  , v ? "on" : "of
2ced0 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  f");.      if( n
2cee0 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  Arg>1 ) break;. 
2cef0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
2cf00 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61 79  g>1 && ii==Array
2cf10 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 20  Size(aDbConfig) 
2cf20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2cf30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2cf40 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63  ror: unknown dbc
2cf50 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c  onfig \"%s\"\n",
2cf60 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2cf70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2cf80 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e  derr, "Enter \".
2cf90 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68 20  dbconfig\" with 
2cfa0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
2cfb0 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20   a list\n");.   
2cfc0 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20   }   .  }else.. 
2cfd0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2cfe0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2cff0 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f  zArg[0], "dbinfo
2d000 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2d010 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66  rc = shell_dbinf
2d020 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72  o_command(p, nAr
2d030 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
2d040 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
2d050 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2d060 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
2d070 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
2d080 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
2d090 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
2d0a0 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65   int savedShowHe
2d0b0 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
2d0c0 61 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 73 61  ader;.    int sa
2d0d0 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20  vedShellFlags = 
2d0e0 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20  p->shellFlgs;.  
2d0f0 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
2d100 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
2d110 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65  veRowid|SHFLG_Ne
2d120 77 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68  wlines|SHFLG_Ech
2d130 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  o);.    for(i=1;
2d140 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
2d150 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
2d160 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
2d170 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2d180 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
2d190 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
2d1a0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
2d1b0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2d1c0 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
2d1d0 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
2d1e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2d1f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2d200 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2d210 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
2d220 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
2d230 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
2d240 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d260 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
2d270 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d280 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
2d290 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2d2a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2d2b0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2d2c0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
2d2d0 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
2d2e0 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
2d2f0 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
2d300 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2d310 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2d320 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
2d330 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
2d340 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
2d350 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
2d360 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2d370 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2d380 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2d390 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
2d3a0 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
2d3b0 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
2d3c0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
2d3d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2d3e0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2d3f0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
2d400 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2d410 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
2d420 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2d430 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2d440 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
2d450 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d470 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
2d480 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
2d490 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
2d4a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2d4b0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2d4c0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
2d4d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
2d4e0 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
2d4f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d500 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2d510 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79      /* When play
2d520 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70  ing back a "dump
2d530 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d  ", the content m
2d540 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61  ight appear in a
2d550 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77  n order.    ** w
2d560 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65  hich causes imme
2d570 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2d580 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
2d590 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20   be violated..  
2d5a0 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20    ** So disable 
2d5b0 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73  foreign-key cons
2d5c0 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65  traint enforceme
2d5d0 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72  nt to prevent pr
2d5e0 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72  oblems. */.    r
2d5f0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2d600 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  , "PRAGMA foreig
2d610 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b  n_keys=OFF;\n");
2d620 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2d630 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54  p->out, "BEGIN T
2d640 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b  RANSACTION;\n");
2d650 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65  .    p->writable
2d660 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
2d670 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
2d680 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72  0;.    /* Set wr
2d690 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
2d6a0 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
2d6b0 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f  forces SQLite to
2d6c0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20   initialize.    
2d6d0 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  ** as much of th
2d6e0 65 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63  e schema as it c
2d6f0 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73  an even if the s
2d700 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2d710 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72  le is.    ** cor
2d720 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  rupt. */.    sql
2d730 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2d740 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70   "SAVEPOINT dump
2d750 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  ; PRAGMA writabl
2d760 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c  e_schema=ON", 0,
2d770 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e   0, 0);.    p->n
2d780 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Err = 0;.    if(
2d790 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20   zLike==0 ){.   
2d7a0 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
2d7b0 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
2d7c0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2d7d0 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
2d7e0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2d7f0 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2d800 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
2d810 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41   type=='table' A
2d820 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65  ND name!='sqlite
2d830 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
2d840 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73    );.      run_s
2d850 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
2d860 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
2d870 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
2d880 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
2d890 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
2d8a0 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73   "WHERE name=='s
2d8b0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
2d8c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2d8d0 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
2d8e0 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
2d8f0 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
2d900 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2d910 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2d920 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
2d930 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78   type IN ('index
2d940 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65  ','trigger','vie
2d950 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b  w')", 0.      );
2d960 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d970 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2d980 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2d990 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2d9a0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2d9b0 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
2d9c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2d9d0 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2d9e0 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51  tbl_name LIKE %Q
2d9f0 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c   AND type=='tabl
2da00 65 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41  e'".        "  A
2da10 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  ND sql NOT NULL"
2da20 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
2da30 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
2da40 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20  query(p,zSql);. 
2da50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2da60 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a  e(zSql);.      z
2da70 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2da80 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
2da90 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
2daa0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
2dab0 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
2dac0 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  ql NOT NULL".   
2dad0 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65       "  AND type
2dae0 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
2daf0 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a  igger','view')".
2db00 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74          "  AND t
2db10 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22  bl_name LIKE %Q"
2db20 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
2db30 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
2db40 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29  uery(p, zSql, 0)
2db50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2db60 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2db70 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69  }.    if( p->wri
2db80 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
2db90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2dba0 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
2dbb0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
2dbc0 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  OFF;\n");.      
2dbd0 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
2dbe0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  a = 0;.    }.   
2dbf0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2dc00 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
2dc10 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
2dc20 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
2dc30 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2dc40 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64  ->db, "RELEASE d
2dc50 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ump;", 0, 0, 0);
2dc60 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2dc70 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20  p->out, p->nErr 
2dc80 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20  ? "ROLLBACK; -- 
2dc90 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22  due to errors\n"
2dca0 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b   : "COMMIT;\n");
2dcb0 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
2dcc0 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65  er = savedShowHe
2dcd0 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 73 68 65  ader;.    p->she
2dce0 6c 6c 46 6c 67 73 20 3d 20 73 61 76 65 64 53 68  llFlgs = savedSh
2dcf0 65 6c 6c 46 6c 61 67 73 3b 0a 20 20 7d 65 6c 73  ellFlags;.  }els
2dd00 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
2dd10 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2dd20 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d  [0], "echo", n)=
2dd30 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2dd40 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
2dd50 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c  etOrClearFlag(p,
2dd60 20 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41   SHFLG_Echo, azA
2dd70 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
2dd80 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2dd90 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2dda0 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66  ge: .echo on|off
2ddb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2ddc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2ddd0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
2dde0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2ddf0 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d  [0], "eqp", n)==
2de00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2de10 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==2 ){.      p-
2de20 3e 61 75 74 6f 45 51 50 74 65 73 74 20 3d 20 30  >autoEQPtest = 0
2de30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
2de40 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c  mp(azArg[1],"ful
2de50 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
2de60 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
2de70 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20  UTOEQP_full;.   
2de80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
2de90 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72  cmp(azArg[1],"tr
2dea0 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  igger")==0 ){.  
2deb0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2dec0 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67   = AUTOEQP_trigg
2ded0 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  er;.      }else 
2dee0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
2def0 5b 31 5d 2c 22 74 65 73 74 22 29 3d 3d 30 20 29  [1],"test")==0 )
2df00 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
2df10 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f  oEQP = AUTOEQP_o
2df20 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  n;.        p->au
2df30 74 6f 45 51 50 74 65 73 74 20 3d 20 31 3b 0a 20  toEQPtest = 1;. 
2df40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2df50 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
2df60 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75   (u8)booleanValu
2df70 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2df80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2df90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2dfa0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2dfb0 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69   .eqp off|on|tri
2dfc0 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20  gger|full\n");. 
2dfd0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2dfe0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2dff0 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
2e000 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
2e010 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  xit", n)==0 ){. 
2e020 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26     if( nArg>1 &&
2e030 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65   (rc = (int)inte
2e040 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
2e050 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28 72 63  ]))!=0 ) exit(rc
2e060 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  );.    rc = 2;. 
2e070 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
2e080 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d   ".explain" comm
2e090 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63  and is automatic
2e0a0 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72   now.  It is lar
2e0b0 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20  gely pointless. 
2e0c0 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65   It.  ** retaine
2e0d0 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63  d purely for bac
2e0e0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
2e0f0 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d  lity */.  if( c=
2e100 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2e110 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61  azArg[0], "expla
2e120 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  in", n)==0 ){.  
2e130 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20    int val = 1;. 
2e140 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29     if( nArg>=2 )
2e150 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2e160 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74  mp(azArg[1],"aut
2e170 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  o")==0 ){.      
2e180 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20    val = 99;.    
2e190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e1a0 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56   val =  booleanV
2e1b0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2e1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e1d0 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20    if( val==1 && 
2e1e0 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78  p->mode!=MODE_Ex
2e1f0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  plain ){.      p
2e200 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70  ->normalMode = p
2e210 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  ->mode;.      p-
2e220 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
2e230 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61  lain;.      p->a
2e240 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
2e250 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
2e260 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l==0 ){.      if
2e270 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
2e280 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
2e290 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
2e2a0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
2e2b0 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
2e2c0 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
2e2d0 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  99 ){.      if( 
2e2e0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
2e2f0 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
2e300 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
2e310 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
2e320 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  plain = 1;.    }
2e330 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
2e340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2e350 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
2e360 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
2e370 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
2e380 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  pert", n)==0 ){.
2e390 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2e3a0 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74  );.    expertDot
2e3b0 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67  Command(p, azArg
2e3c0 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
2e3d0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2e3e0 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70  =='f' && strncmp
2e3f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c  (azArg[0], "full
2e400 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29  schema", n)==0 )
2e410 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
2e420 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
2e430 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2e440 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20    int doStats = 
2e450 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  0;.    memcpy(&d
2e460 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
2e470 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
2e480 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
2e490 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2e4a0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2e4b0 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20  E_Semi;.    if( 
2e4c0 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f  nArg==2 && optio
2e4d0 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c  nMatch(azArg[1],
2e4e0 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20   "indent") ){.  
2e4f0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2e500 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2e510 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
2e520 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nArg = 1;.    }.
2e530 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20      if( nArg!=1 
2e540 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2e550 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2e560 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20  ge: .fullschema 
2e570 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a  ?--indent?\n");.
2e580 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2e590 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2e5a0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2e5b0 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
2e5c0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2e5d0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2e5e0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
2e5f0 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20   sql FROM".     
2e600 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c    "  (SELECT sql
2e610 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c   sql, type type,
2e620 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61   tbl_name tbl_na
2e630 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72  me, name name, r
2e640 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22  owid x".       "
2e650 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65       FROM sqlite
2e660 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c  _master UNION AL
2e670 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45  L".       "   SE
2e680 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20  LECT sql, type, 
2e690 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  tbl_name, name, 
2e6a0 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74  rowid FROM sqlit
2e6b0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22  e_temp_master) "
2e6c0 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74  .       "WHERE t
2e6d0 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
2e6e0 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20  sql NOTNULL AND 
2e6f0 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
2e700 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20  qlite_%' ".     
2e710 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69    "ORDER BY rowi
2e720 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62  d",.       callb
2e730 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2e740 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  rMsg.    );.    
2e750 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e760 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2e770 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2e780 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e790 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2e7a0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2e7b0 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69      "SELECT rowi
2e7c0 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  d FROM sqlite_ma
2e7d0 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
2e7e0 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d       " WHERE nam
2e7f0 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73  e GLOB 'sqlite_s
2e800 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20  tat[134]'",.    
2e810 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26             -1, &
2e820 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
2e830 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74   doStats = sqlit
2e840 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
2e850 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
2e860 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2e870 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
2e880 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73  .    if( doStats
2e890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2e8a0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2e8b0 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c  "/* No STAT tabl
2e8c0 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c  es available */\
2e8d0 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
2e8e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2e8f0 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
2e900 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
2e910 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
2e920 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2e930 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45  "SELECT 'ANALYZE
2e940 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22   sqlite_master'"
2e950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e960 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
2e970 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
2e980 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  .      data.cMod
2e990 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
2e9a0 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
2e9b0 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
2e9c0 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
2e9d0 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t1";.      shell
2e9e0 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45  _exec(&data, "SE
2e9f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
2ea00 74 65 5f 73 74 61 74 31 22 2c 20 26 7a 45 72 72  te_stat1", &zErr
2ea10 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61  Msg);.      data
2ea20 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73  .zDestTable = "s
2ea30 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20  qlite_stat3";.  
2ea40 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26      shell_exec(&
2ea50 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20  data, "SELECT * 
2ea60 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
2ea70 33 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  3", &zErrMsg);. 
2ea80 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54       data.zDestT
2ea90 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73  able = "sqlite_s
2eaa0 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65  tat4";.      she
2eab0 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22  ll_exec(&data, "
2eac0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
2ead0 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 26 7a 45  lite_stat4", &zE
2eae0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61  rrMsg);.      ra
2eaf0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2eb00 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
2eb10 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
2eb20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2eb30 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
2eb40 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2eb50 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20  headers", n)==0 
2eb60 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2eb70 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
2eb80 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c  howHeader = bool
2eb90 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
2eba0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2ebb0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ebc0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2ebd0 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c  .headers on|off\
2ebe0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ebf0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2ec00 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
2ec10 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ec20 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d  0], "help", n)==
2ec30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2ec40 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e 20  g>=2 ){.      n 
2ec50 3d 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75  = showHelp(p->ou
2ec60 74 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  t, azArg[1]);.  
2ec70 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
2ec80 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ec90 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74  ntf(p->out, "Not
2eca0 68 69 6e 67 20 6d 61 74 63 68 65 73 20 27 25 73  hing matches '%s
2ecb0 27 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  '\n", azArg[1]);
2ecc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ecd0 73 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 48 65  se{.      showHe
2ece0 6c 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20  lp(p->out, 0);. 
2ecf0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ed00 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
2ed10 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2ed20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20  "import", n)==0 
2ed30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61  ){.    char *zTa
2ed40 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
2ed50 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2ed60 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
2ed70 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
2ed80 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
2ed90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2eda0 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f  file to extra co
2edb0 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  ntent from */.  
2edc0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2edd0 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a  pStmt = NULL; /*
2ede0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a   A statement */.
2edf0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2ee20 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
2ee30 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  e */.    int nBy
2ee40 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2ee50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ee60 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51  f bytes in an SQ
2ee70 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  L string */.    
2ee80 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2eea0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2eeb0 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d      int needComm
2eec0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2eed0 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49  /* True to COMMI
2eee0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74  T or ROLLBACK at
2eef0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
2ef00 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
2ef10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ef20 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d  r of bytes in p-
2ef30 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20  >colSeparator[] 
2ef40 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
2ef50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2ef60 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
2ef70 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d  tement */.    Im
2ef80 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20 20  portCtx sCtx;   
2ef90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2efa0 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  der context */. 
2efb0 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45     char *(SQLITE
2efc0 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49  _CDECL *xRead)(I
2efd0 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46  mportCtx*); /* F
2efe0 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20  unc to read one 
2eff0 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74  value */.    int
2f000 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a   (SQLITE_CDECL *
2f010 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b  xCloser)(FILE*);
2f020 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f        /* Func to
2f030 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a   close file */..
2f040 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
2f050 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2f060 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2f070 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45  ge: .import FILE
2f080 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20   TABLE\n");.    
2f090 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2f0a0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2f0b0 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
2f0c0 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65  g[1];.    zTable
2f0d0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
2f0e0 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
2f0f0 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   0;.    memset(&
2f100 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCtx, 0, sizeof(
2f110 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e  sCtx));.    open
2f120 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e  _db(p, 0);.    n
2f130 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
2f140 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
2f150 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
2f160 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2f170 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
2f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
2f190 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63  rror: non-null c
2f1a0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
2f1b0 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
2f1c0 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
2f1d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2f1e0 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
2f1f0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f200 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f210 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
2f220 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  r column separat
2f230 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22  ors not allowed"
2f240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f250 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70         " for imp
2f260 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
2f270 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2f280 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
2f290 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  30(p->rowSeparat
2f2a0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
2f2b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  p==0 ){.      ra
2f2c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2f2d0 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c   "Error: non-nul
2f2e0 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  l row separator 
2f2f0 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
2f300 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
2f310 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2f320 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26     if( nSep==2 &
2f330 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  & p->mode==MODE_
2f340 43 73 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d  Csv && strcmp(p-
2f350 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2f360 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20  EP_CrLf)==0 ){. 
2f370 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70       /* When imp
2f380 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79  orting CSV (only
2f390 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73 65  ), if the row se
2f3a0 70 61 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  parator is set t
2f3b0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
2f3c0 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f  efault output ro
2f3d0 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61  w separator, cha
2f3e0 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20 64 65  nge it to the de
2f3f0 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20  fault input.    
2f400 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74    ** row separat
2f410 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  or.  This avoids
2f420 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74   having to maint
2f430 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e  ain different in
2f440 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  put.      ** and
2f450 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61   output row sepa
2f460 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20  rators. */.     
2f470 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2f480 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
2f490 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
2f4a0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2f4b0 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70  Row);.      nSep
2f4c0 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72   = strlen30(p->r
2f4d0 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
2f4e0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70    }.    if( nSep
2f4f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  >1 ){.      raw_
2f500 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f510 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61  Error: multi-cha
2f520 72 61 63 74 65 72 20 72 6f 77 20 73 65 70 61 72  racter row separ
2f530 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
2f540 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2f550 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
2f560 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2f570 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2f580 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20  .    sCtx.zFile 
2f590 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74  = zFile;.    sCt
2f5a0 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20  x.nLine = 1;.   
2f5b0 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b   if( sCtx.zFile[
2f5c0 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65  0]=='|' ){.#ifde
2f5d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
2f5e0 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72  PEN.      raw_pr
2f5f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2f600 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e  ror: pipes are n
2f610 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
2f620 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20  this OS\n");.   
2f630 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c     return 1;.#el
2f640 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e  se.      sCtx.in
2f650 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46   = popen(sCtx.zF
2f660 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20  ile+1, "r");.   
2f670 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20     sCtx.zFile = 
2f680 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20  "<pipe>";.      
2f690 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65  xCloser = pclose
2f6a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
2f6b0 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69  se{.      sCtx.i
2f6c0 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a  n = fopen(sCtx.z
2f6d0 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
2f6e0 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c     xCloser = fcl
2f6f0 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ose;.    }.    i
2f700 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
2f710 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20  _Ascii ){.      
2f720 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65  xRead = ascii_re
2f730 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20  ad_one_field;.  
2f740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78    }else{.      x
2f750 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f  Read = csv_read_
2f760 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d  one_field;.    }
2f770 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e  .    if( sCtx.in
2f780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
2f790 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2f7a0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
2f7b0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
2f7c0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  zFile);.      re
2f7d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2f7e0 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d    sCtx.cColSep =
2f7f0 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
2f800 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52  [0];.    sCtx.cR
2f810 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65  owSep = p->rowSe
2f820 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
2f830 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2f840 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
2f850 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c   FROM %s", zTabl
2f860 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  e);.    if( zSql
2f870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c  ==0 ){.      xCl
2f880 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2f890 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f       shell_out_o
2f8a0 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
2f8b0 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
2f8c0 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
2f8d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2f8e0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2f8f0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2f900 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72  t, 0);.    impor
2f910 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73  t_append_char(&s
2f920 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54  Ctx, 0);    /* T
2f930 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20  o ensure sCtx.z 
2f940 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  is allocated */.
2f950 20 20 20 20 69 66 28 20 72 63 20 26 26 20 73 71      if( rc && sq
2f960 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e  lite3_strglob("n
2f970 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22  o such table: *"
2f980 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2f990 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20  (p->db))==0 ){. 
2f9a0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61       char *zCrea
2f9b0 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
2f9c0 69 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42  intf("CREATE TAB
2f9d0 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b  LE %s", zTable);
2f9e0 0a 20 20 20 20 20 20 63 68 61 72 20 63 53 65 70  .      char cSep
2f9f0 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68   = '(';.      wh
2fa00 69 6c 65 28 20 78 52 65 61 64 28 26 73 43 74 78  ile( xRead(&sCtx
2fa10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72  ) ){.        zCr
2fa20 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
2fa30 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20  printf("%z%c\n  
2fa40 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43  \"%w\" TEXT", zC
2fa50 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74  reate, cSep, sCt
2fa60 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53  x.z);.        cS
2fa70 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  ep = ',';.      
2fa80 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d    if( sCtx.cTerm
2fa90 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  !=sCtx.cColSep )
2faa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2fab0 20 20 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d        if( cSep==
2fac0 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73  '(' ){.        s
2fad0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
2fae0 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ate);.        sq
2faf0 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
2fb00 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f  z);.        xClo
2fb10 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2fb20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2fb30 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d  f(stderr,"%s: em
2fb40 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74  pty file\n", sCt
2fb50 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  x.zFile);.      
2fb60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2fb70 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74    }.      zCreat
2fb80 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2fb90 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72  ntf("%z\n)", zCr
2fba0 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  eate);.      rc 
2fbb0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
2fbc0 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
2fbd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2fbe0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
2fbf0 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
2fc00 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2fc10 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2fc20 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
2fc30 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20  %s(...) failed: 
2fc40 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20  %s\n", zTable,. 
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2fc60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2fc70 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  >db));.        s
2fc80 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78  qlite3_free(sCtx
2fc90 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c  .z);.        xCl
2fca0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2fcb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2fcc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2fcd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2fce0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2fcf0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2fd00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
2fd10 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2fd20 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2fd30 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
2fd40 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2fd50 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2fd60 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2fd70 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
2fd80 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2fd90 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
2fda0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2fdb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2fdc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
2fdd0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2fde0 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
2fdf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2fe00 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2fe10 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
2fe20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  if( nCol==0 ) re
2fe30 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f  turn 0; /* no co
2fe40 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20  lumns, no error 
2fe50 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  */.    zSql = sq
2fe60 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
2fe70 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e  nByte*2 + 20 + n
2fe80 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
2fe90 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2fea0 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
2feb0 6e 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  n);.      shell_
2fec0 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
2fed0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2fee0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
2fef0 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+20, zSql, "INS
2ff00 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20  ERT INTO \"%w\" 
2ff10 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c  VALUES(?", zTabl
2ff20 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
2ff30 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
2ff40 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
2ff50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
2ff60 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
2ff70 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2ff80 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
2ff90 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
2ffa0 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
2ffb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ffc0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2ffd0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2ffe0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
2fff0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
30000 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
30010 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30020 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
30030 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
30040 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
30050 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
30060 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
30070 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
30080 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
30090 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
300a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65  1;.    }.    nee
300b0 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65  dCommit = sqlite
300c0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
300d0 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  (p->db);.    if(
300e0 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
300f0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
30100 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
30110 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20   0);.    do{.   
30120 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
30130 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20   = sCtx.nLine;. 
30140 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
30150 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
30160 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52      char *z = xR
30170 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20  ead(&sCtx);.    
30180 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
30190 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
301a0 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72  nd-of-file befor
301b0 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f  e finding any co
301c0 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a  lumns?.        *
301d0 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e  * If so, stop in
301e0 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
301f0 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e  lling the remain
30200 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
30210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30220 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30  if( z==0 && i==0
30230 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
30240 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
30250 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
30260 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d  -of-file OR end-
30270 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66  of-line before f
30280 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20  inding any.     
30290 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
302a0 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66   ASCII mode?  If
302b0 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61   so, stop instea
302c0 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e  d of NULL fillin
302d0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
302e0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
302f0 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
30300 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f         if( p->mo
30310 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26  de==MODE_Ascii &
30320 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  & (z==0 || z[0]=
30330 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72  =0) && i==0 ) br
30340 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
30350 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
30360 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31  Stmt, i+1, z, -1
30370 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
30380 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NT);.        if(
30390 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74   i<nCol-1 && sCt
303a0 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
303b0 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
303c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
303d0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
303e0 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
303f0 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
30400 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
30420 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20  illing the rest 
30430 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20  with NULL\n",.  
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30450 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
30460 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
30470 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
30480 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
30490 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c         while( i<
304a0 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33  =nCol ){ sqlite3
304b0 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
304c0 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20  , i); i++; }.   
304d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
304e0 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
304f0 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm==sCtx.cColSe
30500 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  p ){.        do{
30510 0a 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64  .          xRead
30520 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
30530 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
30540 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
30550 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
30560 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38   );.        utf8
30570 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30580 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
30590 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
305a0 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305c0 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e       "extras ign
305d0 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ored\n",.       
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305f0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
30600 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29  rtLine, nCol, i)
30610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30620 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20  if( i>=nCol ){. 
30630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
30640 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
30650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30660 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
30670 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30690 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
306a0 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
306b0 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a  : INSERT failed:
306c0 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69   %s\n", sCtx.zFi
306d0 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
306e0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c            startL
306f0 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ine, sqlite3_err
30700 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
30710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30720 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e     }while( sCtx.
30730 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20  cTerm!=EOF );.. 
30740 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
30750 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
30760 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
30770 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
30780 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
30790 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29  if( needCommit )
307a0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
307b0 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  >db, "COMMIT", 0
307c0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
307d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
307e0 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66  _UNTESTABLE.  if
307f0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
30800 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
30810 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20  mposter", n)==0 
30820 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
30830 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  l;.    char *zCo
30840 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73  llist = 0;.    s
30850 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
30860 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d  mt;.    int tnum
30870 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
30880 0a 20 20 20 20 69 66 28 20 21 28 6e 41 72 67 3d  .    if( !(nArg=
30890 3d 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26  =3 || (nArg==2 &
308a0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
308b0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22  p(azArg[1],"off"
308c0 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20  )==0)) ){.      
308d0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
308e0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70  rr, "Usage: .imp
308f0 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f  oster INDEX IMPO
30900 53 54 45 52 5c 6e 22 0a 20 20 20 20 20 20 20 20  STER\n".        
30910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30920 20 20 22 20 20 20 20 20 20 20 2e 69 6d 70 6f 73    "       .impos
30930 74 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20  ter off\n");.   
30940 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
30950 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
30960 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
30970 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
30980 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
30990 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
309a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
309b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
309c0 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c  IMPOSTER, p->db,
309d0 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a   "main", 0, 1);.
309e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
309f0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
30a00 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
30a10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
30a20 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
30a30 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
30a40 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
30a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
30a60 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27   WHERE name='%q'
30a70 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
30a80 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  '", azArg[1]);. 
30a90 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
30aa0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
30ab0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
30ac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
30ad0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
30ae0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
30af0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
30b00 4f 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d  OW ){.      tnum
30b10 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
30b20 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
30b30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30b40 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
30b50 74 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d  t);.    if( tnum
30b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
30b70 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30b80 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
30b90 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
30ba0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
30bb0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
30bc0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
30bd0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  t;.    }.    zSq
30be0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
30bf0 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65  ntf("PRAGMA inde
30c00 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61  x_xinfo='%q'", a
30c10 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63  zArg[1]);.    rc
30c20 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
30c30 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
30c40 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
30c50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
30c60 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
30c70 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
30c80 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
30c90 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
30ca0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
30cb0 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20  Label[20];.     
30cc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
30cd0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
30ce0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
30cf0 74 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20  text(pStmt,2);. 
30d00 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
30d10 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  if( zCol==0 ){. 
30d20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
30d30 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
30d40 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20  tmt,1)==-1 ){.  
30d50 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
30d60 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20  _ROWID_";.      
30d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30d80 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30d90 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65  ntf(sizeof(zLabe
30da0 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25  l),zLabel,"expr%
30db0 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  d",i);.         
30dc0 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a   zCol = zLabel;.
30dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30de0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  }.      if( zCol
30df0 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  list==0 ){.     
30e00 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
30e10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
30e20 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20  "%w\"", zCol);. 
30e30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30e40 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73      zCollist = s
30e50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
30e60 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c  %z,\"%w\"", zCol
30e70 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  list, zCol);.   
30e80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
30e90 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
30ea0 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c  pStmt);.    zSql
30eb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30ec0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43  tf(.          "C
30ed0 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77  REATE TABLE \"%w
30ee0 5c 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45  \"(%s,PRIMARY KE
30ef0 59 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f  Y(%s))WITHOUT RO
30f00 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20  WID",.          
30f10 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69  azArg[2], zColli
30f20 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20  st, zCollist);. 
30f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30f40 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72  zCollist);.    r
30f50 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
30f60 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
30f70 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
30f80 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  R, p->db, "main"
30f90 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
30fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30fb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
30fc0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
30fd0 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
30fe0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
30ff0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
31000 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
31010 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20  MPOSTER, p->db, 
31020 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20  "main", 0, 0);. 
31030 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
31040 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31050 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
31060 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22  r in [%s]: %s\n"
31070 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f  , zSql, sqlite3_
31080 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
31090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
310a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
310b0 28 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (stdout, "%s;\n"
310c0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
310d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f   raw_printf(stdo
310e0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  ut,.           "
310f0 57 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67  WARNING: writing
31100 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20   to an imposter 
31110 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75  table will corru
31120 70 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22  pt the index!\n"
31130 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
31140 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
31150 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31160 73 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f  stderr, "SQLITE_
31170 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
31180 52 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  R returns %d\n",
31190 20 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc);.      rc =
311a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
311b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
311c0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
311d0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
311e0 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f  ITE_OMIT_TEST_CO
311f0 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65  NTROL) */..#ifde
31200 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31210 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d  IOTRACE.  if( c=
31220 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
31230 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61  azArg[0], "iotra
31240 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
31250 20 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74    SQLITE_API ext
31260 65 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45  ern void (SQLITE
31270 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49  _CDECL *sqlite3I
31280 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68  oTrace)(const ch
31290 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69  ar*, ...);.    i
312a0 66 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f  f( iotrace && io
312b0 74 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20  trace!=stdout ) 
312c0 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b  fclose(iotrace);
312d0 0a 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30  .    iotrace = 0
312e0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  ;.    if( nArg<2
312f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31300 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
31310 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
31320 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22  mp(azArg[1], "-"
31330 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
31340 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69  lite3IoTrace = i
31350 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20  otracePrintf;.  
31360 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74      iotrace = st
31370 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dout;.    }else{
31380 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d  .      iotrace =
31390 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
313a0 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
313b0 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20   iotrace==0 ){. 
313c0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
313d0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
313e0 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
313f0 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
31400 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
31410 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b  ite3IoTrace = 0;
31420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
31430 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31440 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
31450 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
31460 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  intf;.      }.  
31470 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
31480 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
31490 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e   && n>=5 && strn
314a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
314b0 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  imits", n)==0 ){
314c0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
314d0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
314e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
314f0 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  imitName;   /* N
31500 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a  ame of a limit *
31510 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  /.       int lim
31520 69 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  itCode;         
31530 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f     /* Integer co
31540 64 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69  de for that limi
31550 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69  t */.    } aLimi
31560 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  t[] = {.      { 
31570 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20  "length",       
31580 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
31590 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20  LIMIT_LENGTH    
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315b0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f  },.      { "sql_
315c0 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
315d0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
315e0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20  _SQL_LENGTH     
315f0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31600 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20      { "column", 
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
31620 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
31630 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MN              
31640 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
31650 20 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20   "expr_depth",  
31660 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
31670 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
31680 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
31690 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d   },.      { "com
316a0 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20  pound_select",  
316b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
316c0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
316d0 54 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  T           },. 
316e0 20 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22       { "vdbe_op"
316f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31700 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
31710 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  E_OP            
31720 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
31730 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22  { "function_arg"
31740 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
31750 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
31760 5f 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20  _ARG            
31770 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74    },.      { "at
31780 74 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20  tached",        
31790 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
317a0 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20  IT_ATTACHED     
317b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
317c0 20 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61        { "like_pa
317d0 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20  ttern_length",  
317e0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49   SQLITE_LIMIT_LI
317f0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
31800 48 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  H       },.     
31810 20 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d   { "variable_num
31820 62 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ber",       SQLI
31830 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
31840 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20  E_NUMBER        
31850 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74     },.      { "t
31860 72 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20  rigger_depth",  
31870 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
31880 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
31890 48 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  H             },
318a0 0a 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72  .      { "worker
318b0 5f 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20  _threads",      
318c0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57    SQLITE_LIMIT_W
318d0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20  ORKER_THREADS   
318e0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
318f0 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32  };.    int i, n2
31900 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
31910 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72   0);.    if( nAr
31920 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f  g==1 ){.      fo
31930 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
31940 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29  ze(aLimit); i++)
31950 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
31960 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c  ("%20s %d\n", aL
31970 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61  imit[i].zLimitNa
31980 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
31990 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
319a0 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
319b0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
319c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
319d0 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20  else if( nArg>3 
319e0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
319f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
31a00 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20  ge: .limit NAME 
31a10 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b  ?NEW-VALUE?\n");
31a20 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
31a30 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
31a40 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
31a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
31a60 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  t iLimit = -1;. 
31a70 20 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e       n2 = strlen
31a80 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  30(azArg[1]);.  
31a90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
31aa0 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29  rraySize(aLimit)
31ab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
31ac0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
31ad0 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a  icmp(aLimit[i].z
31ae0 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67  LimitName, azArg
31af0 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20  [1], n2)==0 ){. 
31b00 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69           if( iLi
31b10 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  mit<0 ){.       
31b20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b       iLimit = i;
31b30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
31b40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
31b50 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
31b60 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d  , "ambiguous lim
31b70 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  it: \"%s\"\n", a
31b80 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
31b90 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31ba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
31bb0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
31bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31be0 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
31bf0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  <0 ){.        ut
31c00 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
31c10 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74  , "unknown limit
31c20 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20  : \"%s\"\n".    
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c40 20 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69      "enter \".li
31c50 6d 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61  mits\" with no a
31c60 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c  rguments for a l
31c70 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ist.\n",.       
31c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c90 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20    azArg[1]);.   
31ca0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31cb0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
31cc0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
31cd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
31ce0 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
31cf0 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
31d00 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c  p->db, aLimit[iL
31d10 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  imit].limitCode,
31d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31d30 20 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65         (int)inte
31d40 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  gerValue(azArg[2
31d50 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
31d60 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20     printf("%20s 
31d70 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c  %d\n", aLimit[iL
31d80 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  imit].zLimitName
31d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
31da0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
31db0 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  db, aLimit[iLimi
31dc0 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31  t].limitCode, -1
31dd0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
31de0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  e..  if( c=='l' 
31df0 26 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  && n>2 && strncm
31e00 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e  p(azArg[0], "lin
31e10 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
31e20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
31e30 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61      lintDotComma
31e40 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
31e50 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  g);.  }else..#if
31e60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31e70 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
31e80 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
31e90 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31ea0 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20  , "load", n)==0 
31eb0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
31ec0 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63  r *zFile, *zProc
31ed0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
31ee0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
31ef0 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
31f00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31f10 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61  rr, "Usage: .loa
31f20 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49  d FILE ?ENTRYPOI
31f30 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  NT?\n");.      r
31f40 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
31f50 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
31f60 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
31f70 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
31f80 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72  .    zProc = nAr
31f90 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20  g>=3 ? azArg[2] 
31fa0 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  : 0;.    open_db
31fb0 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
31fc0 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
31fd0 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a  tension(p->db, z
31fe0 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
31ff0 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
32000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32010 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
32020 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
32030 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
32040 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
32050 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
32060 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
32070 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
32080 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c  dif..  if( c=='l
32090 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
320a0 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29  rg[0], "log", n)
320b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
320c0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
320d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
320e0 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20  r, "Usage: .log 
320f0 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  FILENAME\n");.  
32100 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
32120 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
32130 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20   azArg[1];.     
32140 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
32150 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20  se(p->pLog);.   
32160 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74     p->pLog = out
32170 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46  put_file_open(zF
32180 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ile, 0);.    }. 
32190 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
321a0 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='m' && strncmp(
321b0 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22  azArg[0], "mode"
321c0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
321d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
321e0 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
321f0 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20  rg[1] : "";.    
32200 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33  int n2 = strlen3
32210 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e  0(zMode);.    in
32220 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b  t c2 = zMode[0];
32230 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27  .    if( c2=='l'
32240 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
32250 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
32260 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  nes",n2)==0 ){. 
32270 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
32280 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20  ODE_Line;.      
32290 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
322a0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
322b0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
322c0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
322d0 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
322e0 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74  f( c2=='c' && st
322f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
32300 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20  columns",n2)==0 
32310 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
32320 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
32330 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
32340 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
32350 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
32360 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
32370 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
32380 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27  else if( c2=='l'
32390 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
323a0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
323b0 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  st",n2)==0 ){.  
323c0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
323d0 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
323e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
323f0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
32400 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
32410 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f  eparator, SEP_Co
32420 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
32430 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32440 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
32450 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
32460 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
32470 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
32480 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63  c2=='h' && strnc
32490 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d  mp(azArg[1],"htm
324a0 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
324b0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
324c0 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
324d0 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
324e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
324f0 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29  ],"tcl",n2)==0 )
32500 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
32510 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20  = MODE_Tcl;.    
32520 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32530 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
32540 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
32550 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
32560 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73  _Space);.      s
32570 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32580 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
32590 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
325a0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
325b0 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
325c0 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
325d0 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
325e0 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
325f0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
32600 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
32610 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32620 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
32630 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
32640 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d  parator, SEP_Com
32650 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
32660 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32670 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
32680 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
32690 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
326a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
326b0 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
326c0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
326d0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
326e0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
326f0 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
32700 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32710 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
32720 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
32730 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29  arator, SEP_Tab)
32740 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
32750 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63  c2=='i' && strnc
32760 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
32770 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
32780 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
32790 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
327a0 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
327b0 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  (p, nArg>=3 ? az
327c0 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22  Arg[2] : "table"
327d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
327e0 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e   c2=='q' && strn
327f0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75  cmp(azArg[1],"qu
32800 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ote",n2)==0 ){. 
32810 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
32820 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d  ODE_Quote;.    }
32830 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27  else if( c2=='a'
32840 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
32850 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29  g[1],"ascii",n2)
32860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
32870 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69  mode = MODE_Asci
32880 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
32890 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
328a0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
328b0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
328c0 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20  or, SEP_Unit);. 
328d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
328e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
328f0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
32900 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
32910 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20  SEP_Record);.   
32920 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
32930 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
32940 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
32950 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d  current output m
32960 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65  ode: %s\n", mode
32970 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
32980 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32990 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
329a0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64  err, "Error: mod
329b0 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  e should be one 
329c0 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22  of: ".         "
329d0 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76  ascii column csv
329e0 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e   html insert lin
329f0 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62  e list quote tab
32a00 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20  s tcl\n");.     
32a10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
32a20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
32a30 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a  >mode;.  }else..
32a40 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20    if( c=='n' && 
32a50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
32a60 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e  , "nullvalue", n
32a70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
32a80 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
32a90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32aa0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c  f(sizeof(p->null
32ab0 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56  Value), p->nullV
32ac0 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
32ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
32ae0 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
32af0 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ize(p->nullValue
32b00 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
32b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32b20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
32b30 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c  rr, "Usage: .nul
32b40 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22  lvalue STRING\n"
32b50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
32b60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
32b70 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
32b80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
32b90 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20  , "open", n)==0 
32ba0 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63  && n>=2 ){.    c
32bb0 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d  har *zNewFilenam
32bc0 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
32bd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32be0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
32bf0 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20  int iName = 1;  
32c00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
32c10 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20   azArg[] of the 
32c20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  filename */.    
32c30 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b  int newFlag = 0;
32c40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
32c50 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f  delete file befo
32c60 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  re opening */.  
32c70 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65    /* Close the e
32c80 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
32c90 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f   */.    session_
32ca0 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20  close_all(p);.  
32cb0 20 20 63 6c 6f 73 65 5f 64 62 28 70 2d 3e 64 62    close_db(p->db
32cc0 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  );.    p->db = 0
32cd0 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65  ;.    p->zDbFile
32ce0 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  name = 0;.    sq
32cf0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46  lite3_free(p->zF
32d00 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20  reeOnClose);.   
32d10 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65   p->zFreeOnClose
32d20 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65   = 0;.    p->ope
32d30 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
32d40 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 2f  EN_UNSPEC;.    /
32d50 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d  * Check for comm
32d60 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
32d70 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e  ts */.    for(iN
32d80 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72  ame=1; iName<nAr
32d90 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65  g && azArg[iName
32da0 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65  ][0]=='-'; iName
32db0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
32dc0 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
32dd0 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69  [iName];.      i
32de0 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
32df0 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20  ,"new") ){.     
32e00 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a     newFlag = 1;.
32e10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
32e20 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 7d 65  VE_ZLIB.      }e
32e30 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
32e40 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b  tch(z, "zip") ){
32e50 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
32e60 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
32e70 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69  N_ZIPFILE;.#endi
32e80 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
32e90 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
32ea0 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20   "append") ){.  
32eb0 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
32ec0 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  e = SHELL_OPEN_A
32ed0 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20  PPENDVFS;.      
32ee0 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
32ef0 4d 61 74 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e  Match(z, "readon
32f00 6c 79 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ly") ){.        
32f10 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
32f20 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
32f30 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
32f40 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
32f50 2c 20 22 64 65 73 65 72 69 61 6c 69 7a 65 22 29  , "deserialize")
32f60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
32f70 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
32f80 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
32f90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32fa0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
32fb0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32fc0 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
32fd0 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
32fe0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
32ff0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
33000 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33010 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
33020 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
33030 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73 70 65   filename is spe
33040 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f 20 6f  cified, try to o
33050 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a 2f 0a  pen it first */.
33060 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65      zNewFilename
33070 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20   = nArg>iName ? 
33080 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
33090 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d  "%s", azArg[iNam
330a0 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28  e]) : 0;.    if(
330b0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29 7b   zNewFilename ){
330c0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 46 6c  .      if( newFl
330d0 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65 74 65  ag ) shellDelete
330e0 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d  File(zNewFilenam
330f0 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62  e);.      p->zDb
33100 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46  Filename = zNewF
33110 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f  ilename;.      o
33120 70 65 6e 5f 64 62 28 70 2c 20 4f 50 45 4e 5f 44  pen_db(p, OPEN_D
33130 42 5f 4b 45 45 50 41 4c 49 56 45 29 3b 0a 20 20  B_KEEPALIVE);.  
33140 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
33150 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
33160 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33170 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
33180 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65  pen '%s'\n", zNe
33190 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
331a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
331b0 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a  (zNewFilename);.
331c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
331d0 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43       p->zFreeOnC
331e0 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e  lose = zNewFilen
331f0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
33200 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62   }.    if( p->db
33210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
33220 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f  As a fall-back o
33230 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74 61 62  pen a TEMP datab
33240 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  ase */.      p->
33250 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  zDbFilename = 0;
33260 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
33270 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
33280 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27  lse..  if( (c=='
33290 6f 27 0a 20 20 20 20 20 20 20 20 26 26 20 28 73  o'.        && (s
332a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
332b0 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30   "output", n)==0
332c0 7c 7c 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ||strncmp(azArg[
332d0 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d  0], "once", n)==
332e0 30 29 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 65  0)).   || (c=='e
332f0 27 20 26 26 20 6e 3d 3d 35 20 26 26 20 73 74 72  ' && n==5 && str
33300 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 65 78  cmp(azArg[0],"ex
33310 63 65 6c 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  cel")==0).  ){. 
33320 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33330 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  File = nArg>=2 ?
33340 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74 64   azArg[1] : "std
33350 6f 75 74 22 3b 0a 20 20 20 20 69 6e 74 20 62 54  out";.    int bT
33360 78 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  xtMode = 0;.    
33370 69 66 28 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d  if( azArg[0][0]=
33380 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='e' ){.      /*
33390 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 22   Transform the "
333a0 2e 65 78 63 65 6c 22 20 63 6f 6d 6d 61 6e 64 20  .excel" command 
333b0 69 6e 74 6f 20 22 2e 6f 6e 63 65 20 2d 78 22 20  into ".once -x" 
333c0 2a 2f 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  */.      nArg = 
333d0 32 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 30  2;.      azArg[0
333e0 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a 20 20 20 20  ] = "once";.    
333f0 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b    zFile = azArg[
33400 31 5d 20 3d 20 22 2d 78 22 3b 0a 20 20 20 20 20  1] = "-x";.     
33410 20 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20   n = 4;.    }.  
33420 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a    if( nArg>2 ){.
33430 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33440 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
33450 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c  : .%s [-e|-x|FIL
33460 45 5d 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  E]\n", azArg[0])
33470 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33480 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
33490 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
334a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31 20    }.    if( n>1 
334b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
334c0 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
334d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
334e0 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
334f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33500 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e  err, "Usage: .on
33510 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c  ce (-e|-x|FILE)\
33520 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
33530 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
33540 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33550 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
33560 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d     p->outCount =
33570 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
33580 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
33590 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
335a0 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
335b0 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30  .    if( zFile[0
335c0 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65 5b  ]=='-' && zFile[
335d0 31 5d 3d 3d 27 2d 27 20 29 20 7a 46 69 6c 65 2b  1]=='-' ) zFile+
335e0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
335f0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
33600 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
33610 46 69 6c 65 2c 20 22 2d 65 22 29 3d 3d 30 20 7c  File, "-e")==0 |
33620 7c 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  | strcmp(zFile, 
33630 22 2d 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "-x")==0 ){.    
33640 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
33650 20 31 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74   1;.      output
33660 4d 6f 64 65 50 75 73 68 28 70 29 3b 0a 20 20 20  ModePush(p);.   
33670 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 31 5d 3d     if( zFile[1]=
33680 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='x' ){.        
33690 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22  newTempFile(p, "
336a0 63 73 76 22 29 3b 0a 20 20 20 20 20 20 20 20 70  csv");.        p
336b0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  ->mode = MODE_Cs
336c0 76 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  v;.        sqlit
336d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
336e0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
336f0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
33700 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29  ator, SEP_Comma)
33710 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33720 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
33730 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
33740 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
33750 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a  tor, SEP_CrLf);.
33760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33770 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c 65       newTempFile
33780 28 70 2c 20 22 74 78 74 22 29 3b 0a 20 20 20 20  (p, "txt");.    
33790 20 20 20 20 62 54 78 74 4d 6f 64 65 20 3d 20 31      bTxtMode = 1
337a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
337b0 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70  zFile = p->zTemp
337c0 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  File;.    }.#end
337d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48  if /* SQLITE_NOH
337e0 41 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 20 20  AVE_SYSTEM */.  
337f0 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
33800 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51  '|' ){.#ifdef SQ
33810 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
33820 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33830 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
33840 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73   pipes are not s
33850 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73  upported in this
33860 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72   OS\n");.      r
33870 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  c = 1;.      p->
33880 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65  out = stdout;.#e
33890 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  lse.      p->out
338a0 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b   = popen(zFile +
338b0 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20   1, "w");.      
338c0 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
338d0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
338e0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
338f0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
33900 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  pipe \"%s\"\n", 
33910 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20  zFile + 1);.    
33920 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
33930 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  out;.        rc 
33940 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
33950 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33960 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
33970 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70  f(p->outfile), p
33980 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c  ->outfile, "%s",
33990 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d   zFile);.      }
339a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
339b0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  e{.      p->out 
339c0 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
339d0 65 6e 28 7a 46 69 6c 65 2c 20 62 54 78 74 4d 6f  en(zFile, bTxtMo
339e0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  de);.      if( p
339f0 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->out==0 ){.    
33a00 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
33a10 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20 29  File,"off")!=0 )
33a20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
33a30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
33a40 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
33a50 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
33a60 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
33a70 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f    }.        p->o
33a80 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ut = stdout;.   
33a90 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
33aa0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
33ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
33ac0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
33ad0 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
33ae0 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
33af0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33b00 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
33b10 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26  c=='p' && n>=3 &
33b20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33b30 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d  0], "print", n)=
33b40 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
33b50 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
33b60 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
33b70 20 20 69 66 28 20 69 3e 31 20 29 20 72 61 77 5f    if( i>1 ) raw_
33b80 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33b90 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   ");.      utf8_
33ba0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33bb0 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
33bc0 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
33bd0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
33be0 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ");.  }else..  i
33bf0 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72  f( c=='p' && str
33c00 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33c10 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29  prompt", n)==0 )
33c20 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  {.    if( nArg >
33c30 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 2) {.      str
33c40 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c  ncpy(mainPrompt,
33c50 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72  azArg[1],(int)Ar
33c60 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d  raySize(mainProm
33c70 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
33c80 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29    if( nArg >= 3)
33c90 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
33ca0 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c  (continuePrompt,
33cb0 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72  azArg[2],(int)Ar
33cc0 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65  raySize(continue
33cd0 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
33ce0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
33cf0 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63   c=='q' && strnc
33d00 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75  mp(azArg[0], "qu
33d10 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
33d20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
33d30 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
33d40 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
33d50 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
33d60 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
33d70 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20    FILE *alt;.   
33d80 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
33d90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33da0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
33db0 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b   .read FILE\n");
33dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
33dd0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
33de0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
33df0 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f 70   }.    alt = fop
33e00 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62  en(azArg[1], "rb
33e10 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d  ");.    if( alt=
33e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
33e30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
33e40 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
33e50 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
33e60 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
33e70 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
33e80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  {.      rc = pro
33e90 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c  cess_input(p, al
33ea0 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  t);.      fclose
33eb0 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (alt);.    }.  }
33ec0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
33ed0 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  r' && n>=3 && st
33ee0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
33ef0 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30  "restore", n)==0
33f00 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
33f10 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
33f20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
33f30 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
33f40 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
33f50 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
33f60 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
33f70 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
33f80 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
33f90 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
33fa0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[1];.      zD
33fb0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
33fc0 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
33fd0 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  3 ){.      zSrcF
33fe0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  ile = azArg[2];.
33ff0 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72        zDb = azAr
34000 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  g[1];.    }else{
34010 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
34020 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
34030 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20  : .restore ?DB? 
34040 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
34050 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
34060 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
34070 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
34080 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
34090 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  n(zSrcFile, &pSr
340a0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
340b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
340c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
340d0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
340e0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
340f0 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b  "\n", zSrcFile);
34100 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  .      close_db(
34110 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
34120 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
34130 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
34140 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
34150 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
34160 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
34170 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
34180 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
34190 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
341a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
341b0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
341c0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
341d0 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  ));.      close_
341e0 64 62 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  db(pSrc);.      
341f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
34200 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
34210 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
34220 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
34230 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
34240 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
34250 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20  QLITE_BUSY  ){. 
34260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34270 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
34280 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
34290 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
342a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
342b0 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
342c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
342d0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
342e0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
342f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34300 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
34310 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
34320 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
34330 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
34340 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
34350 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
34360 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
34370 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69  ource database i
34380 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20  s busy\n");.    
34390 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
343a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
343b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
343c0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
343d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
343e0 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  db));.      rc =
343f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c   1;.    }.    cl
34400 6f 73 65 5f 64 62 28 70 53 72 63 29 3b 0a 20 20  ose_db(pSrc);.  
34410 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
34420 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
34430 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
34440 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
34450 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
34460 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
34470 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f  tatsOn = (u8)boo
34480 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
34490 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
344a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
344b0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
344c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
344d0 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
344e0 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
344f0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
34500 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
34510 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
34520 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
34530 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
34540 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
34550 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
34560 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
34570 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
34580 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
34590 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
345a0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
345b0 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
345c0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
345d0 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
345e0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
345f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
34600 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
34610 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
34620 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
34630 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
34640 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
34650 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
34660 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
34670 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
34680 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
34690 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
346a0 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
346b0 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
346c0 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
346d0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
346e0 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
346f0 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
34700 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
34710 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
34720 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
34730 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
34740 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
34750 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
34760 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34770 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
34780 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
34790 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
347a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
347b0 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
347c0 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
347d0 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
347e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
347f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
34800 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
34810 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
34820 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
34830 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
34840 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
34850 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
34860 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
34870 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
34880 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
34890 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
348a0 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
348b0 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
348c0 22 2c 20 27 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20  ", '\\')==0;.   
348d0 20 20 20 69 66 28 20 69 73 4d 61 73 74 65 72 20     if( isMaster 
348e0 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  || sqlite3_strli
348f0 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65  ke(zName,"sqlite
34900 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c 20 27  _temp_master", '
34910 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  \\')==0 ){.     
34920 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
34930 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
34940 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
34950 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65  argv[0] = sqlite
34960 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
34970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34980 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
34990 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s (\n".         
349a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
349b0 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
349c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349d0 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
349e0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
349f0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
34a00 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
34a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
34a30 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
34a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a50 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
34a60 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
34a70 20 20 20 20 20 20 20 20 20 22 29 22 2c 20 69 73           ")", is
34a80 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65  Master ? "sqlite
34a90 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69  _master" : "sqli
34aa0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
34ab0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
34ac0 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
34ad0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
34ae0 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
34af0 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
34b00 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
34b10 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
34b20 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
34b30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34b40 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30  _free(new_argv[0
34b50 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
34b60 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20 29  }.    if( zDiv )
34b70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34b80 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
34b90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34ba0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
34bb0 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61  ->db, "SELECT na
34bc0 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  me FROM pragma_d
34bd0 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
34c00 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
34c10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34c20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34c30 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34c40 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
34c50 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
34c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
34c70 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
34c80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
34c90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
34ca0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
34cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34cc0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
34cd0 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20  ct, "SELECT sql 
34ce0 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20  FROM", 0);.     
34cf0 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20   iSchema = 0;.  
34d00 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
34d10 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
34d20 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
34d30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34d40 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63   *zDb = (const c
34d50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
34d60 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
34d70 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  0);.        char
34d80 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20   zScNum[30];.   
34d90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
34da0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63  rintf(sizeof(zSc
34db0 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25  Num), zScNum, "%
34dc0 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a  d", ++iSchema);.
34dd0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34de0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69  xt(&sSelect, zDi
34df0 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  v, 0);.        z
34e00 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c  Div = " UNION AL
34e10 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70  L ";.        app
34e20 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34e30 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  , "SELECT shell_
34e40 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22  add_schema(sql,"
34e50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
34e60 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
34e70 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d  p(zDb, "main")!=
34e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
34e90 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
34ea0 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20  ct, zDb, '"');. 
34eb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34ec0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34ed0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55  xt(&sSelect, "NU
34ee0 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
34ef0 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
34f00 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34f10 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20  ",name) AS sql, 
34f20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
34f30 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30  name, rowid,", 0
34f40 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
34f50 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34f60 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  zScNum, 0);.    
34f70 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34f80 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e  sSelect, " AS sn
34f90 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  um, ", 0);.     
34fa0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34fb0 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27  Select, zDb, '\'
34fc0 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
34fd0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
34fe0 20 22 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d   " AS sname FROM
34ff0 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
35000 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
35010 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a  ect, zDb, '"');.
35020 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
35030 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73  xt(&sSelect, ".s
35040 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
35050 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35060 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
35070 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66  e(pStmt);.#ifdef
35080 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
35090 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
350a0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
350b0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
350c0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20  ext(&sSelect,.  
350d0 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e           " UNION
350e0 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c   ALL SELECT shel
350f0 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28  l_module_schema(
35100 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20  name),".        
35110 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61     " 'table', na
35120 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  me, name, name, 
35130 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52  9e+99, 'main' FR
35140 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65  OM pragma_module
35150 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  _list", 0);.    
35160 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
35170 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
35180 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45 20 22  lect, ") WHERE "
35190 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
351a0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
351b0 20 63 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73   char *zQarg = s
351c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
351d0 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %Q", zName);.   
351e0 20 20 20 20 20 69 6e 74 20 62 47 6c 6f 62 20 3d       int bGlob =
351f0 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27   strchr(zName, '
35200 2a 27 29 20 21 3d 20 30 20 7c 7c 20 73 74 72 63  *') != 0 || strc
35210 68 72 28 7a 4e 61 6d 65 2c 20 27 3f 27 29 20 21  hr(zName, '?') !
35220 3d 20 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  = 0 ||.         
35230 20 20 20 20 20 20 20 20 20 20 20 73 74 72 63 68             strch
35240 72 28 7a 4e 61 6d 65 2c 20 27 5b 27 29 20 21 3d  r(zName, '[') !=
35250 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
35260 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2e  strchr(zName, '.
35270 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
35280 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
35290 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72 69 6e  ect, "lower(prin
352a0 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61 6d 65  tf('%s.%s',sname
352b0 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20 30 29  ,tbl_name))", 0)
352c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
352d0 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
352e0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
352f0 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29  "lower(tbl_name)
35300 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 0);.        }
35310 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
35320 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 62 47  ext(&sSelect, bG
35330 6c 6f 62 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a  lob ? " GLOB " :
35340 20 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20   " LIKE ", 0);. 
35350 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
35360 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72  t(&sSelect, zQar
35370 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
35380 66 28 20 21 62 47 6c 6f 62 20 29 7b 0a 20 20 20  f( !bGlob ){.   
35390 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
353a0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 45 53  t(&sSelect, " ES
353b0 43 41 50 45 20 27 5c 5c 27 20 22 2c 20 30 29 3b  CAPE '\\' ", 0);
353c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
353d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
353e0 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c  Select, " AND ",
353f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
35400 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29  ite3_free(zQarg)
35410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35420 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
35430 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74  ect, "type!='met
35440 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f  a' AND sql IS NO
35450 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
35460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35470 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e     " ORDER BY sn
35480 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a  um, rowid", 0);.
35490 20 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67        if( bDebug
354a0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
354b0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
354c0 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53  "SQL: %s;\n", sS
354d0 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20  elect.z);.      
354e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
354f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
35500 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
35510 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  z, callback, &da
35520 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
35530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
35540 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
35550 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
35560 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
35570 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35580 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
35590 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
355a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
355b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
355c0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
355d0 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54   if( rc != SQLIT
355e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
355f0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35600 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67  "Error: querying
35610 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
35620 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ion\n");.      r
35630 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
35640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
35650 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
35660 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35670 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
35680 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
35690 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
356a0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
356b0 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28  ==11 && strncmp(
356c0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63  azArg[0], "selec
356d0 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  ttrace", n)==0 )
356e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
356f0 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29  ectTrace = (int)
35700 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
35710 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
35720 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
35730 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
35740 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28  E_SESSION).  if(
35750 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
35760 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73  mp(azArg[0],"ses
35770 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e  sion",n)==0 && n
35780 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53  >=3 ){.    OpenS
35790 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
357a0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
357b0 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  0];.    char **a
357c0 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d  zCmd = &azArg[1]
357d0 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d  ;.    int iSes =
357e0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64   0;.    int nCmd
357f0 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20   = nArg - 1;.   
35800 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
35810 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73  nArg<=1 ) goto s
35820 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
35830 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  ror;.    open_db
35840 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
35850 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20  nArg>=3 ){.     
35860 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65   for(iSes=0; iSe
35870 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  s<p->nSession; i
35880 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Ses++){.        
35890 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
358a0 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61  ession[iSes].zNa
358b0 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30  me, azArg[1])==0
358c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
358d0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73  }.      if( iSes
358e0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a  <p->nSession ){.
358f0 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
35900 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
35910 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61  iSes];.        a
35920 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zCmd++;.        
35930 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  nCmd--;.      }e
35940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65  lse{.        pSe
35950 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
35960 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20  sion[0];.       
35970 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   iSes = 0;.     
35980 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
35990 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68   .session attach
359a0 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e   TABLE.    ** In
359b0 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
359c0 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
359d0 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74   interface to at
359e0 74 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61  tach a particula
359f0 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73  r.    ** table s
35a00 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
35a10 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20  er filtered..   
35a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
35a30 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74  mp(azCmd[0],"att
35a40 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ach")==0 ){.    
35a50 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20    if( nCmd!=2 ) 
35a60 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
35a70 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
35a80 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70   if( pSession->p
35a90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
35aa0 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a  ession_not_open:
35ab0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
35ac0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
35ad0 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20  OR: No sessions 
35ae0 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20  are open\n");.  
35af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
35b10 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53  ession_attach(pS
35b20 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64  ession->p, azCmd
35b30 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
35b40 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
35b50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35b60 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c  err, "ERROR: sql
35b70 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
35b80 63 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c  ch() returns %d\
35b90 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
35ba0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
35bb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35bc0 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
35bd0 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  session changese
35be0 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73  t FILE.    ** .s
35bf0 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20  ession patchset 
35c00 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74  FILE.    ** Writ
35c10 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  e a changeset or
35c20 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61   patchset into a
35c30 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65   file.  The file
35c40 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
35c50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35c60 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
35c70 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20  "changeset")==0 
35c80 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  || strcmp(azCmd[
35c90 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d  0],"patchset")==
35ca0 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  0 ){.      FILE 
35cb0 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  *out = 0;.      
35cc0 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f  if( nCmd!=2 ) go
35cd0 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
35ce0 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
35cf0 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d  f( pSession->p==
35d00 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  0 ) goto session
35d10 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20  _not_open;.     
35d20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43   out = fopen(azC
35d30 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20  md[1], "wb");.  
35d40 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29      if( out==0 )
35d50 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
35d60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35d70 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  RROR: cannot ope
35d80 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69  n \"%s\" for wri
35d90 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31  ting\n", azCmd[1
35da0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
35db0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43  .        int szC
35dc0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  hng;.        voi
35dd0 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20  d *pChng;.      
35de0 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30    if( azCmd[0][0
35df0 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
35e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35e10 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
35e20 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
35e30 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
35e40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35e50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35e60 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61  qlite3session_pa
35e70 74 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  tchset(pSession-
35e80 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
35e90 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
35ea0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
35ec0 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72  tf("Error: error
35ed0 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29   code %d\n", rc)
35ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
35ef0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
35f00 20 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a        if( pChng.
35f10 20 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72            && fwr
35f20 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e  ite(pChng, szChn
35f30 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b  g, 1, out)!=1 ){
35f40 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
35f50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35f60 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20  RROR: Failed to 
35f70 77 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d  write entire %d-
35f80 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a  byte output\n",.
35f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fa0 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20    szChng);.     
35fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
35fc0 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29  ite3_free(pChng)
35fd0 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
35fe0 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (out);.      }. 
35ff0 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
36000 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a   .session close.
36010 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65      ** Close the
36020 20 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73   identified sess
36030 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ion.    */.    i
36040 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
36050 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20  0], "close")==0 
36060 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  ){.      if( nCm
36070 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
36080 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
36090 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
360a0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
360b0 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
360c0 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20  (pSession);.    
360d0 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b      p->aSession[
360e0 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73  iSes] = p->aSess
360f0 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f  ion[--p->nSessio
36100 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n];.      }.    
36110 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
36120 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42  ession enable ?B
36130 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51  OOLEAN?.    ** Q
36140 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
36150 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20  enable flag.    
36160 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
36170 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61  p(azCmd[0], "ena
36180 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
36190 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
361a0 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74  if( nCmd>2 ) got
361b0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
361c0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69  _error;.      ii
361d0 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20   = nCmd==1 ? -1 
361e0 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  : booleanValue(a
361f0 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
36200 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
36210 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
36220 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
36230 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e  nable(pSession->
36240 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
36250 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36260 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
36270 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64  enable flag = %d
36280 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36290 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
362a0 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
362b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
362c0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
362d0 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e  n filter GLOB ..
362e0 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20  ...    ** Set a 
362f0 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74  list of GLOB pat
36300 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e  terns of table n
36310 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75  ames to be exclu
36320 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ded..    */.    
36330 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
36340 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d  [0], "filter")==
36350 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
36360 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  i, nByte;.      
36370 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74  if( nCmd<2 ) got
36380 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
36390 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
363a0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
363b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
363c0 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  0; ii<pSession->
363d0 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a  nFilter; ii++){.
363e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
363f0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
36400 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a  >azFilter[ii]);.
36410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
36430 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
36440 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  r);.        nByt
36450 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73  e = sizeof(pSess
36460 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d  ion->azFilter[0]
36470 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20  )*(nCmd-1);.    
36480 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
36490 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
364a0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
364b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
364c0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
364d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
364e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
364f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
36500 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  or memory\n");. 
36510 20 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29           exit(1)
36520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36530 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
36540 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nCmd; ii++){.  
36550 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
36560 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d  ->azFilter[ii-1]
36570 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
36580 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69  tf("%s", azCmd[i
36590 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
365a0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
365b0 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b  >nFilter = ii-1;
365c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
365d0 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
365e0 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f  ion indirect ?BO
365f0 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
36600 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69  ery or set the i
36610 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20  ndirect flag.   
36620 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
36630 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e  mp(azCmd[0], "in
36640 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20  direct")==0 ){. 
36650 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
36660 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20     if( nCmd>2 ) 
36670 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
36680 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
36690 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20   ii = nCmd==1 ? 
366a0 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  -1 : booleanValu
366b0 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  e(azCmd[1]);.   
366c0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
366d0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
366e0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
366f0 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73  n_indirect(pSess
36700 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
36710 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36720 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
36730 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c  n %s indirect fl
36740 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36760 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
36770 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
36780 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
36790 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79  .session isempty
367a0 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e  .    ** Determin
367b0 65 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e  e if the session
367c0 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f   is empty.    */
367d0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
367e0 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70  azCmd[0], "isemp
367f0 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ty")==0 ){.     
36800 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
36810 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74  f( nCmd!=1 ) got
36820 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
36830 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
36840 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
36850 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
36860 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65  lite3session_ise
36870 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70  mpty(pSession->p
36880 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
36890 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
368a0 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70  session %s isemp
368b0 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ty flag = %d\n",
368c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
368d0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
368e0 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
368f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
36900 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69    /* .session li
36910 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61  st.    ** List a
36920 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ll currently ope
36930 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a  n sessions.    *
36940 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
36950 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22  (azCmd[0],"list"
36960 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )==0 ){.      fo
36970 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
36980 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
36990 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
369a0 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e  p->out, "%d %s\n
369b0 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f  ", i, p->aSessio
369c0 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  n[i].zName);.   
369d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
369e0 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
369f0 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20  open DB NAME.   
36a00 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73   ** Open a new s
36a10 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  ession called NA
36a20 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68  ME on the attach
36a30 65 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a  ed database DB..
36a40 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72      ** DB is nor
36a50 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20  mally "main"..  
36a60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
36a70 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70  cmp(azCmd[0],"op
36a80 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
36a90 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
36aa0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20      if( nCmd!=3 
36ab0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
36ac0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
36ad0 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64     zName = azCmd
36ae0 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [2];.      if( z
36af0 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74  Name[0]==0 ) got
36b00 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
36b10 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f  _error;.      fo
36b20 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
36b30 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
36b40 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
36b50 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
36b60 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ame,zName)==0 ){
36b70 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
36b80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36b90 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61  Session \"%s\" a
36ba0 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22  lready exists\n"
36bb0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
36bc0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36bd0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36be0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36bf0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
36c00 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70  ion>=ArraySize(p
36c10 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20  ->aSession) ){. 
36c20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
36c30 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d  f(stderr, "Maxim
36c40 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e  um of %d session
36c50 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28  s\n", ArraySize(
36c60 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20  p->aSession));. 
36c70 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
36c80 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
36c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
36ca0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
36cb0 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e  sion[p->nSession
36cc0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ];.      rc = sq
36cd0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65  lite3session_cre
36ce0 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64  ate(p->db, azCmd
36cf0 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e  [1], &pSession->
36d00 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
36d10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
36d20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36d30 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73  Cannot open sess
36d40 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d  ion: error code=
36d50 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
36d60 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
36d70 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36d80 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36d90 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69    }.      pSessi
36da0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b  on->nFilter = 0;
36db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65  .      sqlite3se
36dc0 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74  ssion_table_filt
36dd0 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  er(pSession->p, 
36de0 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20  session_filter, 
36df0 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
36e00 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a   p->nSession++;.
36e10 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
36e20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
36e30 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
36e40 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ame);.    }else.
36e50 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d      /* If no com
36e60 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65  mand name matche
36e70 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78  s, show a syntax
36e80 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65   error */.    se
36e90 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
36ea0 6f 72 3a 0a 20 20 20 20 73 68 6f 77 48 65 6c 70  or:.    showHelp
36eb0 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
36ec0 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  n");.  }else.#en
36ed0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
36ee0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e  TE_DEBUG.  /* Un
36ef0 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61  documented comma
36f00 6e 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  nds for internal
36f10 20 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65   testing.  Subje
36f20 63 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a  ct to change.  *
36f30 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65  * without notice
36f40 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73  . */.  if( c=='s
36f50 27 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74  ' && n>=10 && st
36f60 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
36f70 22 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d  "selftest-", 9)=
36f80 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  =0 ){.    if( st
36f90 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39  rncmp(azArg[0]+9
36fa0 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39  , "boolean", n-9
36fb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
36fc0 74 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f  t i, v;.      fo
36fd0 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
36fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  ++){.        v =
36ff0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
37000 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
37010 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
37020 6f 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25  out, "%s: %d 0x%
37030 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  x\n", azArg[i], 
37040 76 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v, v);.      }. 
37050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
37060 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
37070 20 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29   "integer", n-9)
37080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
37090 20 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   i; sqlite3_int6
370a0 34 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4 v;.      for(i
370b0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
370c0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
370d0 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20  Buf[200];.      
370e0 20 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c    v = integerVal
370f0 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ue(azArg[i]);.  
37100 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
37110 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
37120 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c  uf),zBuf,"%s: %l
37130 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a  ld 0x%llx\n", az
37140 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20  Arg[i],v,v);.   
37150 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
37160 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
37170 42 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Buf);.      }.  
37180 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
37190 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  if..  if( c=='s'
371a0 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e   && n>=4 && strn
371b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65  cmp(azArg[0],"se
371c0 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b  lftest",n)==0 ){
371d0 0a 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74  .    int bIsInit
371e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
371f0 20 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c   True to initial
37200 69 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54  ize the SELFTEST
37210 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
37220 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20  t bVerbose = 0; 
37230 20 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73         /* Verbos
37240 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
37250 69 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69  int bSelftestExi
37260 73 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  sts;     /* True
37270 20 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72   if SELFTEST alr
37280 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
37290 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20     int i, k;    
372a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
372b0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
372c0 20 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20      int nTest = 
372d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
372e0 4e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20  Number of tests 
372f0 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  runs */.    int 
37300 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nErr = 0;       
37310 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37320 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
37330 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
37340 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tr;           /*
37350 20 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75   Answer for a qu
37360 65 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ery */.    sqlit
37370 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
37380 20 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61   0; /* Query aga
37390 69 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53  inst the SELFTES
373a0 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  T table */..    
373b0 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20  open_db(p,0);.  
373c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
373d0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; i++){.      c
373e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
373f0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
37400 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
37410 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
37420 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
37430 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  p(z,"-init")==0 
37440 29 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e  ){.        bIsIn
37450 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  it = 1;.      }e
37460 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
37470 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20  rcmp(z,"-v")==0 
37480 29 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62  ){.        bVerb
37490 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ose++;.      }el
374a0 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  se.      {.     
374b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
374c0 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tderr, "Unknown 
374d0 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  option \"%s\" on
374e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
374f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37500 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
37510 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  0]);.        raw
37520 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
37530 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f  "Should be one o
37540 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29  f: --init -v\n")
37550 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
37560 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
37570 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
37580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37590 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
375a0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
375b0 61 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69  adata(p->db,"mai
375c0 6e 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c  n","selftest",0,
375d0 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20  0,0,0,0,0).     
375e0 20 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f        != SQLITE_
375f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c  OK ){.      bSel
37600 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b  ftestExists = 0;
37610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37620 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74    bSelftestExist
37630 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
37640 20 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a   if( bIsInit ){.
37650 20 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66        createSelf
37660 74 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20  testTable(p);.  
37670 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69      bSelftestExi
37680 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  sts = 1;.    }. 
37690 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72     initText(&str
376a0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
376b0 74 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b  t(&str, "x", 0);
376c0 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66  .    for(k=bSelf
376d0 74 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30  testExists; k>=0
376e0 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; k--){.      if
376f0 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( k==1 ){.      
37700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
37710 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
37720 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
37730 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  LECT tno,op,cmd,
37740 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73  ans FROM selftes
37750 74 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c  t ORDER BY tno",
37760 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  .            -1,
37770 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
37780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
377a0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
377b0 0a 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55  .