/ Hex Artifact Content
Login

Artifact d2465e7747a014bd48a75c1bcf648e8e6cb46832dcc6e1293c5f285bc5542e8b:


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 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6300: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6310: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
6320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
6330: 41 47 45 5f 56 54 41 42 29 0a 49 4e 43 4c 55 44  AGE_VTAB).INCLUD
6340: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 64 62  E ../ext/misc/db
6350: 64 61 74 61 2e 63 0a 23 65 6e 64 69 66 0a 0a 23  data.c.#endif..#
6360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6370: 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
6380: 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  )./*.** State in
6390: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
63a0: 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73  single open sess
63b0: 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ion.*/.typedef s
63c0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63d0: 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73  n OpenSession;.s
63e0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63f0: 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  n {.  char *zNam
6400: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
6410: 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  * Symbolic name 
6420: 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e  for this session
6430: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65   */.  int nFilte
6440: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
6450: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c  * Number of xFil
6460: 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c  ter rejection GL
6470: 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20  OB patterns */. 
6480: 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72   char **azFilter
6490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ;         /* Arr
64a0: 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  ay of xFilter re
64b0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
64c0: 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74  terns */.  sqlit
64d0: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20  e3_session *p;  
64e0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
64f0: 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65  session */.};.#e
6500: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c  ndif../*.** Shel
6510: 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e  l output mode in
6520: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62  formation from b
6530: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
6540: 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f  on",.** saved so
6550: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
6560: 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78  restored by ".ex
6570: 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79  plain off".*/.ty
6580: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61 76  pedef struct Sav
6590: 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64  edModeInfo Saved
65a0: 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74  ModeInfo;.struct
65b0: 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b   SavedModeInfo {
65c0: 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20  .  int valid;   
65d0: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65         /* Is the
65e0: 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e  re legit data in
65f0: 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   here? */.  int 
6600: 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  mode;           
6610: 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f  /* Mode prior to
6620: 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a   ".explain on" *
6630: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
6640: 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22  er;     /* The "
6650: 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e 67  .header" setting
6660: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6670: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
6680: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
6690: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68   /* Column width
66a0: 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  s prior to ".exp
66b0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a  lain on" */.};..
66c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
66d0: 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74  xpertInfo Expert
66e0: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70  Info;.struct Exp
66f0: 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69  ertInfo {.  sqli
6700: 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65  te3expert *pExpe
6710: 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f  rt;.  int bVerbo
6720: 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e  se;.};../* A sin
6730: 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20  gle line in the 
6740: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79  EQP output */.ty
6750: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50  pedef struct EQP
6760: 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61 70  GraphRow EQPGrap
6770: 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50  hRow;.struct EQP
6780: 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74  GraphRow {.  int
6790: 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20 20   iEqpId;        
67a0: 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69     /* ID for thi
67b0: 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  s row */.  int i
67c0: 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20  ParentId;       
67d0: 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61   /* ID of the pa
67e0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51  rent row */.  EQ
67f0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74  PGraphRow *pNext
6800: 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20  ;   /* Next row 
6810: 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  in sequence */. 
6820: 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20   char zText[1]; 
6830: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
6840: 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68  o display for th
6850: 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  is row */.};../*
6860: 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20   All EQP output 
6870: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
6880: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6890: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
68a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
68b0: 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72 61   EQPGraph EQPGra
68c0: 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ph;.struct EQPGr
68d0: 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68  aph {.  EQPGraph
68e0: 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a  Row *pRow;    /*
68f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
6900: 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
6910: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
6920: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61  EQPGraphRow *pLa
6930: 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c  st;   /* Last el
6940: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f  ement of the pRo
6950: 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  w list */.  char
6960: 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20   zPrefix[100];  
6970: 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69    /* Graph prefi
6980: 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  x */.};../*.** S
6990: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
69a0: 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
69b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
69c0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  s contained in a
69d0: 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  n.** instance of
69e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
6a00: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
6a10: 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74  lState ShellStat
6a20: 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53  e;.struct ShellS
6a30: 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tate {.  sqlite3
6a40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
6a50: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
6a60: 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c  */.  u8 autoExpl
6a70: 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ain;        /* A
6a80: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72  utomatically tur
6a90: 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f  n on .explain mo
6aa0: 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45  de */.  u8 autoE
6ab0: 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  QP;            /
6ac0: 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55  * Run EXPLAIN QU
6ad0: 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74  ERY PLAN prior t
6ae0: 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74  o seach SQL stmt
6af0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6b00: 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  test;        /* 
6b10: 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65  autoEQP is in te
6b20: 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20  st mode */.  u8 
6b30: 61 75 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20  autoEQPtrace;   
6b40: 20 20 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69      /* autoEQP i
6b50: 73 20 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20  s in trace mode 
6b60: 2a 2f 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b  */.  u8 statsOn;
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6b80: 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d  rue to display m
6b90: 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f  emory stats befo
6ba0: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
6bb0: 20 2a 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61   */.  u8 scansta
6bc0: 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  tsOn;        /* 
6bd0: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
6be0: 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72  scan stats befor
6bf0: 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20  e each finalize 
6c00: 2a 2f 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65  */.  u8 openMode
6c10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
6c20: 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
6c30: 2c 20 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72  , _APPENDVFS, or
6c40: 20 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75   _ZIPFILE */.  u
6c50: 38 20 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20  8 doXdgOpen;    
6c60: 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
6c70: 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
6c80: 70 65 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65  pen in output_re
6c90: 73 65 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45  set() */.  u8 nE
6ca0: 71 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  qpLevel;        
6cb0: 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68    /* Depth of th
6cc0: 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72 61  e EQP output gra
6cd0: 70 68 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63  ph */.  u8 eTrac
6ce0: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  eType;         /
6cf0: 2a 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20  * SHELL_TRACE_* 
6d00: 76 61 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f  value for type o
6d10: 66 20 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73  f trace */.  uns
6d20: 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b  igned mEqpLines;
6d30: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
6d40: 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69  eritical lines i
6d50: 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75 74  n the EQP output
6d60: 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20   graph */.  int 
6d70: 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  outCount;       
6d80: 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20     /* Revert to 
6d90: 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63  stdout when reac
6da0: 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69  hing zero */.  i
6db0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
6dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6dd0: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
6de0: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
6df0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20   int lineno;    
6e00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c  number of last l
6e20: 69 6e 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e  ine read from in
6e30: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e50: 52 65 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72  Read commands fr
6e60: 6f 6d 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a  om this stream *
6e70: 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20  /.  FILE *out;  
6e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6e90: 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ite results here
6ea0: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63   */.  FILE *trac
6eb0: 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  eOut;        /* 
6ec0: 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74  Output for sqlit
6ed0: 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20  e3_trace() */.  
6ee0: 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
6ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6f00: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
6f10: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6f30: 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65  n output mode se
6f40: 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d  tting */.  int m
6f50: 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20  odePrior;       
6f60: 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20    /* Saved mode 
6f70: 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20  */.  int cMode; 
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6f90: 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20  emporary output 
6fa0: 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72  mode for the cur
6fb0: 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20  rent query */.  
6fc0: 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20  int normalMode; 
6fd0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6fe0: 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65   mode before ".e
6ff0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
7000: 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65  int writableSche
7010: 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ma;    /* True i
7020: 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  f PRAGMA writabl
7030: 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20  e_schema=ON */. 
7040: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
7050: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7060: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
7070: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
7080: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
7090: 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20   int nCheck;    
70a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70b0: 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f  r of ".check" co
70c0: 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20  mmands run */.  
70d0: 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65  unsigned nProgre
70e0: 73 73 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ss;    /* Number
70f0: 20 6f 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c   of progress cal
7100: 6c 62 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72  lbacks encounter
7110: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
7120: 20 6d 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f   mxProgress;   /
7130: 2a 20 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65  * Maximum progre
7140: 73 73 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66  ss callbacks bef
7150: 6f 72 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20  ore failing */. 
7160: 20 75 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f   unsigned flgPro
7170: 67 72 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73  gress;  /* Flags
7180: 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73   for the progres
7190: 73 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  s callback */.  
71a0: 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c  unsigned shellFl
71b0: 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  gs;    /* Variou
71c0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  s flags */.  sql
71d0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78  ite3_int64 szMax
71e0: 3b 20 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65  ;   /* --maxsize
71f0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70   argument to .op
7200: 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  en */.  char *zD
7210: 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f  estTable;      /
7220: 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e  * Name of destin
7230: 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e  ation table when
7240: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a   MODE_Insert */.
7250: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c    char *zTempFil
7260: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  e;       /* Temp
7270: 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20  orary file that 
7280: 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74  might need delet
7290: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ing */.  char zT
72a0: 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20  estcase[30];    
72b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65  /* Name of curre
72c0: 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a  nt test case */.
72d0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61    char colSepara
72e0: 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75  tor[20]; /* Colu
72f0: 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
7300: 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72  racter for sever
7310: 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68  al modes */.  ch
7320: 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  ar rowSeparator[
7330: 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61  20]; /* Row sepa
7340: 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20  rator character 
7350: 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a  for MODE_Ascii *
7360: 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50  /.  char colSepP
7370: 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61  rior[20];  /* Sa
7380: 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ved column separ
7390: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72  ator */.  char r
73a0: 6f 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  owSepPrior[20]; 
73b0: 20 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65   /* Saved row se
73c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  parator */.  int
73d0: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
73e0: 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64      /* Requested
73f0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
7400: 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f  olumn when in co
7410: 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e  lumn mode*/.  in
7420: 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30  t actualWidth[10
7430: 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77  0];  /* Actual w
7440: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7450: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75  umn */.  char nu
7460: 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20  llValue[20];    
7470: 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70  /* The text to p
7480: 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c  rint when a NULL
7490: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
74a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
74c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
74d0: 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45  har outfile[FILE
74e0: 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69  NAME_MAX]; /* Fi
74f0: 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20  lename for *out 
7500: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7510: 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20  *zDbFilename;   
7520: 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
7530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7540: 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e  .  char *zFreeOn
7550: 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Close;         /
7560: 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72  * Filename to fr
7570: 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  ee when closing 
7580: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7590: 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *zVfs;          
75a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
75b0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  to use */.  sqli
75c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
75d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
75e0: 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20  atement if any. 
75f0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b  */.  FILE *pLog;
7600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
7610: 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20  rite log output 
7620: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  here */.  int *a
7630: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
7640: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64   /* Array of ind
7650: 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44  ents used in MOD
7660: 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69  E_Explain */.  i
7670: 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt nIndent;     
7680: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7690: 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b   array aiIndent[
76a0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  ] */.  int iInde
76b0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
76c0: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
76d0: 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74  t op in aiIndent
76e0: 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68  [] */.  EQPGraph
76f0: 20 73 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f   sGraph;       /
7700: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  * Information fo
7710: 72 20 74 68 65 20 67 72 61 70 68 69 63 61 6c 20  r the graphical 
7720: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
7730: 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  AN */.#if define
7740: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
7750: 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e  SESSION).  int n
7760: 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Session;        
7770: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7780: 66 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e  f active session
7790: 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69  s */.  OpenSessi
77a0: 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20  on aSession[4]; 
77b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73   /* Array of ses
77c0: 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69  sions.  [0] is i
77d0: 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64  n focus. */.#end
77e0: 69 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20  if.  ExpertInfo 
77f0: 65 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f  expert;        /
7800: 2a 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69  * Valid if previ
7810: 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  ous command was 
7820: 22 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22  ".expert OPT..."
7830: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f   */.};.../* Allo
7840: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53  wed values for S
7850: 68 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51  hellState.autoEQ
7860: 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  P.*/.#define AUT
7870: 4f 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20  OEQP_off      0 
7880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74            /* Aut
7890: 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
78a0: 55 45 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66  UERY PLAN is off
78b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f   */.#define AUTO
78c0: 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20  EQP_on       1  
78d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f           /* Auto
78e0: 6d 61 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20  matic EQP is on 
78f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7900: 51 50 5f 74 72 69 67 67 65 72 20 20 32 20 20 20  QP_trigger  2   
7910: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e          /* On an
7920: 64 20 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e  d also show plan
7930: 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a  s for triggers *
7940: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7950: 50 5f 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20  P_full     3    
7960: 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66         /* Show f
7970: 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  ull EXPLAIN */..
7980: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7990: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
79a0: 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65  .openMode.*/.#de
79b0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79c0: 55 4e 53 50 45 43 20 20 20 20 20 20 30 20 20 20  UNSPEC      0   
79d0: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
79e0: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
79f0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7a00: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31  EN_NORMAL      1
7a10: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
7a20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7a30: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7a40: 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20  PEN_APPENDVFS   
7a50: 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70  2      /* Use ap
7a60: 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69  pendvfs */.#defi
7a70: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  ne SHELL_OPEN_ZI
7a80: 50 46 49 4c 45 20 20 20 20 20 33 20 20 20 20 20  PFILE     3     
7a90: 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66   /* Use the zipf
7aa0: 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
7ab0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7ac0: 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
7ad0: 20 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70      4      /* Op
7ae0: 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61  en a normal data
7af0: 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  base read-only *
7b00: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7b10: 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
7b20: 20 35 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   5      /* Open 
7b30: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65  using sqlite3_de
7b40: 73 65 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23  serialize() */.#
7b50: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7b60: 4e 5f 48 45 58 44 42 20 20 20 20 20 20 20 36 20  N_HEXDB       6 
7b70: 20 20 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74       /* Use "dbt
7b80: 6f 74 78 74 22 20 6f 75 74 70 75 74 20 61 73 20  otxt" output as 
7b90: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a  data source */..
7ba0: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7bb0: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
7bc0: 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23  .eTraceType.*/.#
7bd0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7be0: 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20  CE_PLAIN      0 
7bf0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70       /* Show inp
7c00: 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23  ut SQL text */.#
7c10: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7c20: 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20  CE_EXPANDED   1 
7c30: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70       /* Show exp
7c40: 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a  anded SQL text *
7c50: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7c60: 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44  TRACE_NORMALIZED
7c70: 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20   2      /* Show 
7c80: 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74  normalized SQL t
7c90: 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20  ext */../* Bits 
7ca0: 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  in the ShellStat
7cb0: 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61  e.flgProgress va
7cc0: 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  riable */.#defin
7cd0: 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  e SHELL_PROGRESS
7ce0: 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20  _QUIET 0x01  /* 
7cf0: 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20  Omit announcing 
7d00: 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20 63  every progress c
7d10: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69  allback */.#defi
7d20: 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53  ne SHELL_PROGRES
7d30: 53 5f 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a  S_RESET 0x02  /*
7d40: 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74   Reset the count
7d50: 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65   when the progre
7d60: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b       ** callback
7d90: 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65   limit is reache
7da0: 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  d, and for each.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
7de0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
7df0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50  .#define SHELL_P
7e00: 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78  ROGRESS_ONCE  0x
7e10: 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68  04  /* Cancel th
7e20: 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20  e --limit after 
7e30: 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a  firing once */..
7e40: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7e50: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
7e60: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
7e70: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7e80: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7e90: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7ea0: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7eb0: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7ec0: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7ed0: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7ee0: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7ef0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7f00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7f10: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7f20: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7f30: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7f40: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7f50: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7f60: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7f70: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7f80: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7f90: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7fa0: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7fb0: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7fc0: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7fd0: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7fe0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7ff0: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
8000: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
8010: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
8020: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
8030: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
8040: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
8050: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
8060: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
8070: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
8080: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
8090: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
80a0: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
80b0: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
80c0: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
80d0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
80e0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
80f0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
8100: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
8110: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
8120: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
8130: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
8140: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
8150: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
8160: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
8170: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
8180: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
8190: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
81a0: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
81b0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
81c0: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
81d0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
81e0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
81f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8200: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
8210: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
8220: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
8230: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
8240: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
8250: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
8260: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
8270: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
8280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8290: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
82a0: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
82b0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
82c0: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
82d0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
82e0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
82f0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
8300: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
8310: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
8320: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
8330: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
8340: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
8350: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
8360: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
8370: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
8380: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
8390: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
83a0: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
83b0: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
83c0: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
83d0: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
83e0: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
83f0: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
8400: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
8410: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
8420: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
8430: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
8440: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
8450: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
8460: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
8470: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8480: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8490: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
84a0: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
84b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
84c0: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
84d0: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
84e0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
84f0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8500: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8510: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
8520: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8530: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8540: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8550: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8560: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8570: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8580: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8590: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
85a0: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
85b0: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
85c0: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
85d0: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
85e0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
85f0: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
8600: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
8610: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
8620: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
8630: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
8640: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
8650: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
8660: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
8670: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8680: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8690: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
86a0: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
86b0: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
86c0: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
86d0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
86e0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
86f0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
8700: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
8710: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
8720: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
8730: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
8740: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8750: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
8760: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
8770: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8780: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8790: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
87a0: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
87b0: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
87c0: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
87d0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
87e0: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
87f0: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
8800: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
8810: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
8820: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
8830: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
8840: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
8850: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
8860: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
8870: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8880: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8890: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
88a0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
88b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
88c0: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
88d0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
88e0: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
88f0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
8900: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
8910: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
8920: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
8930: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8940: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
8950: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8960: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
8970: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8980: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8990: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
89b0: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
89c0: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
89d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
89e0: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
89f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
8a00: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
8a10: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
8a20: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
8a30: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
8a40: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
8a50: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
8a60: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
8a70: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8a80: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8a90: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8aa0: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8ab0: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8ac0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
8ad0: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
8ae0: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
8af0: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
8b00: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
8b10: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
8b20: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
8b30: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
8b40: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
8b50: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
8b60: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
8b70: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8b80: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8b90: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8ba0: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8bb0: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8bc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8bd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8be0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8bf0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8c10: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
8c20: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8c30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
8c40: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
8c50: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
8c60: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
8c70: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8c80: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8c90: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8ca0: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8cc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
8cd0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
8ce0: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
8cf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8d00: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
8d20: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
8d30: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
8d40: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
8d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8d60: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8d70: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8d80: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8da0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8db0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8dc0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8dd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8de0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8df0: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
8e00: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
8e10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8e20: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
8e30: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8e40: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
8e50: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
8e60: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
8e70: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8e80: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8e90: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8ea0: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8eb0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8ec0: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8ed0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8ee0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8ef0: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8f00: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8f10: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8f20: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8f30: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f50: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8f60: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8f70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8f80: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8fa0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8fb0: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8fc0: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8fd0: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8fe0: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8ff0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
9000: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
9010: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
9020: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
9030: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
9040: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
9050: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
9060: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9070: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9080: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
9090: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
90a0: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
90b0: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
90c0: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
90d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
90e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
90f0: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
9100: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
9110: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
9120: 30 5d 29 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29  0]), 1, (size_t)
9130: 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  sz, f);.  }else{
9140: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9150: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
9160: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9170: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
9180: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 77     /* Remember w
9190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
91a0: 65 20 76 61 6c 75 65 20 6f 72 69 67 69 6e 61 6c  e value original
91b0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 5c 72 5c  ly contained \r\
91c0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 20 26  n */.    if( z &
91d0: 26 20 73 74 72 73 74 72 28 7a 2c 22 5c 72 5c 6e  & strstr(z,"\r\n
91e0: 22 29 21 3d 30 20 29 20 68 61 73 43 52 4e 4c 20  ")!=0 ) hasCRNL 
91f0: 3d 20 31 3b 0a 20 20 20 20 78 20 3d 20 66 77 72  = 1;.    x = fwr
9200: 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ite(sqlite3_valu
9210: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
9220: 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a 2c 20   1, (size_t)sz, 
9230: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
9240: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
9250: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
9260: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9270: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9280: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
9290: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
92a0: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
92b0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
92c0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
92d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92e0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
92f0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
9300: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
9310: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9320: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
9330: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
9340: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9350: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
9360: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
9370: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9380: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
9390: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
93a0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
93b0: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
93c0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
93d0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
93e0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
93f0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
9400: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
9410: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
9420: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9430: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9440: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9450: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9460: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9470: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9480: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9490: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
94a0: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
94b0: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
94c0: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
94d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
94e0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
94f0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
9500: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9510: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
9520: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
9530: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9540: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9550: 70 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a  p, 1, (size_t)sz
9560: 2c 20 66 29 3b 0a 20 20 66 63 6c 6f 73 65 28 66  , f);.  fclose(f
9570: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
9580: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
9590: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
95a0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f  ror(context, "co
95b0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 62 61 63  uld not read bac
95c0: 6b 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  k the whole file
95d0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
95e0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
95f0: 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e 20 29    }.  if( bBin )
9600: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9610: 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74  sult_blob64(cont
9620: 65 78 74 2c 20 70 2c 20 73 7a 2c 20 73 71 6c 69  ext, p, sz, sqli
9630: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c  te3_free);.  }el
9640: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
9650: 69 6e 74 36 34 20 69 2c 20 6a 3b 0a 20 20 20 20  int64 i, j;.    
9660: 69 66 28 20 68 61 73 43 52 4e 4c 20 29 7b 0a 20  if( hasCRNL ){. 
9670: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
9680: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  riginal contains
9690: 20 5c 72 5c 6e 20 74 68 65 6e 20 64 6f 20 6e 6f   \r\n then do no
96a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62 61 63   conversions bac
96b0: 6b 20 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20 20  k to \n */.     
96c0: 20 6a 20 3d 20 73 7a 3b 0a 20 20 20 20 7d 65 6c   j = sz;.    }el
96d0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
96e0: 74 68 65 20 66 69 6c 65 20 64 69 64 20 6e 6f 74  the file did not
96f0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74   originally cont
9700: 61 69 6e 20 5c 72 5c 6e 20 74 68 65 6e 20 63 6f  ain \r\n then co
9710: 6e 76 65 72 74 20 61 6e 79 20 6e 65 77 0a 20 20  nvert any new.  
9720: 20 20 20 20 2a 2a 20 5c 72 5c 6e 20 62 61 63 6b      ** \r\n back
9730: 20 69 6e 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20   into \n */.    
9740: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73    for(i=j=0; i<s
9750: 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
9760: 20 69 66 28 20 70 5b 69 5d 3d 3d 27 5c 72 27 20   if( p[i]=='\r' 
9770: 26 26 20 70 5b 69 2b 31 5d 3d 3d 27 5c 6e 27 20  && p[i+1]=='\n' 
9780: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  ) i++;.        p
9790: 5b 6a 2b 2b 5d 20 3d 20 70 5b 69 5d 3b 0a 20 20  [j++] = p[i];.  
97a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d      }.      sz =
97b0: 20 6a 3b 0a 20 20 20 20 20 20 70 5b 73 7a 5d 20   j;.      p[sz] 
97c0: 3d 20 30 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20  = 0;.    } .    
97d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
97e0: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
97f0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73  const char*)p, s
9800: 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
9820: 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54  ite3_free, SQLIT
9830: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70  E_UTF8);.  }.  p
9840: 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63   = 0;..edit_func
9850: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20  _end:.  if( f ) 
9860: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c  fclose(f);.  unl
9870: 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ink(zTempFile);.
9880: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9890: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
98a0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
98b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98c0: 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
98d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72  /../*.** Save or
98e0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
98f0: 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
9900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9910: 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53  outputModePush(S
9920: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
9930: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20   p->modePrior = 
9940: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70  p->mode;.  memcp
9950: 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  y(p->colSepPrior
9960: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9970: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
9980: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
9990: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50  emcpy(p->rowSepP
99a0: 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61  rior, p->rowSepa
99b0: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
99c0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
99d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  .}.static void o
99e0: 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65  utputModePop(She
99f0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70  llState *p){.  p
9a00: 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  ->mode = p->mode
9a10: 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28  Prior;.  memcpy(
9a20: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
9a30: 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c   p->colSepPrior,
9a40: 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65   sizeof(p->colSe
9a50: 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d  parator));.  mem
9a60: 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cpy(p->rowSepara
9a70: 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72  tor, p->rowSepPr
9a80: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72  ior, sizeof(p->r
9a90: 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d  owSeparator));.}
9aa0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9ab0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9ac0: 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64  as a hex-encoded
9ad0: 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33   blob (eg. X'123
9ae0: 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  4' ).*/.static v
9af0: 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62  oid output_hex_b
9b00: 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  lob(FILE *out, c
9b10: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
9b20: 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20  , int nBlob){.  
9b30: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
9b40: 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70  Blob = (char *)p
9b50: 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e  Blob;.  raw_prin
9b60: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
9b70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
9b80: 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e  ; i++){ raw_prin
9b90: 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42  tf(out,"%02x",zB
9ba0: 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a  lob[i]&0xff); }.
9bb0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9bc0: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
9bd0: 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68  Find a string th
9be0: 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  at is not found 
9bf0: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e  anywhere in z[].
9c00: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
9c10: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74  er.** to that st
9c20: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20  ring..**.** Try 
9c30: 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42  to use zA and zB
9c40: 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68   first.  If both
9c50: 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c   of those are al
9c60: 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a  ready found in z
9c70: 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  [].** then make 
9c80: 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61  up some string a
9c90: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  nd store it in t
9ca0: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  he buffer zBuf..
9cb0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9cc0: 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72  char *unused_str
9cd0: 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ing(.  const cha
9ce0: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
9cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9d00: 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65  lt must not appe
9d10: 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a  ar anywhere in z
9d20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9d30: 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72   *zA, const char
9d40: 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74   *zB,   /* Try t
9d50: 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  hese first */.  
9d60: 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20  char *zBuf      
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74    /* Space to st
9d90: 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20  ore a generated 
9da0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  string */.){.  u
9db0: 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20  nsigned i = 0;. 
9dc0: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
9dd0: 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  A)==0 ) return z
9de0: 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  A;.  if( strstr(
9df0: 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75  z, zB)==0 ) retu
9e00: 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20  rn zB;.  do{.   
9e10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9e20: 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75  f(20,zBuf,"(%s%u
9e30: 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20  )", zA, i++);.  
9e40: 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a  }while( strstr(z
9e50: 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72  ,zBuf)!=0 );.  r
9e60: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f  eturn zBuf;.}../
9e70: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
9e80: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
9e90: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9ea0: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9eb0: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9ec0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f  *.** See also: o
9ed0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9ee0: 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f  aped_string().*/
9ef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9f00: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
9f10: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9f20: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9f30: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9f40: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9f50: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9f60: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9f70: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
9f80: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
9f90: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9fa0: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
9fb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9fc0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9fd0: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
9fe0: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
9ff0: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
a000: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
a010: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
a020: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
a030: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
a040: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
a050: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
a060: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
a070: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
a080: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a090: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
a0a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a0b0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
a0c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
a0d0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
a0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0f0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
a100: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
a110: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a120: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
a130: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
a140: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
a150: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
a160: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
a170: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
a180: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20  conventions..** 
a190: 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20  Additionallly , 
a1a0: 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20  escape the "\n" 
a1b0: 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
a1c0: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
a1d0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63   do not.** get c
a1e0: 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d  orrupted by end-
a1f0: 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  of-line translat
a200: 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69  ion facilities i
a210: 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  n some operating
a220: 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  .** systems..**.
a230: 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  ** This is like 
a240: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
a250: 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20  ring() but with 
a260: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
a270: 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61  the \r\n.** esca
a280: 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  pe mechanism..*/
a290: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a2a0: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
a2b0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
a2c0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
a2d0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
a2e0: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
a2f0: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
a300: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
a310: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
a320: 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\'' && c!='\n' 
a330: 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  && c!='\r'; i++)
a340: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
a350: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
a360: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
a370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
a380: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
a390: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
a3a0: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
a3b0: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
a3c0: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
a3d0: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
a3e0: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
a3f0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
a400: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
a410: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
a420: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
a430: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
a450: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  NL ){.      raw_
a460: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70  printf(out, "rep
a470: 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a  lace(");.      z
a480: 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
a490: 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  ng(z, "\\n", "\\
a4a0: 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
a4b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20    }.    if( nCR 
a4c0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a4d0: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
a4e0: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20  e(");.      zCR 
a4f0: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
a500: 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  z, "\\r", "\\015
a510: 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d  ", zBuf2);.    }
a520: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
a530: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
a540: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a550: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
a560: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
a570: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26  \n' && c!='\r' &
a580: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
a590: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a5a0: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
a5b0: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
a5c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
a5d0: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
a5e0: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
a5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a600: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
a610: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
a620: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
a630: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a650: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
a660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a670: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
a680: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
a690: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
a6a0: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e  tf(out, "%s", zN
a6b0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  L);.        cont
a6c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
a6d0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a6e0: 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a  ut, "%s", zCR);.
a6f0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a700: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a710: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
a720: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a730: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
a740: 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20  (13))", zCR);.  
a750: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
a760: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a770: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
a780: 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29  char(10))", zNL)
a790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
a7a0: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
a7b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
a7c0: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
a7d0: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
a7e0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f  according to C o
a7f0: 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75  r TCL quoting ru
a800: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
a810: 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72  oid output_c_str
a820: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a840: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
a850: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a860: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20  t);.  while( (c 
a870: 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a  = *(z++))!=0 ){.
a880: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
a890: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  ){.      fputc(c
a8a0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a8b0: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a8c0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
a8d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a8e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a8f0: 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75     fputc('"', ou
a900: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a910: 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20  ( c=='\t' ){.   
a920: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a930: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a940: 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('t', out);.    
a950: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e  }else if( c=='\n
a960: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a970: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a980: 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75     fputc('n', ou
a990: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a9a0: 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  ( c=='\r' ){.   
a9b0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a9c0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a9d0: 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('r', out);.    
a9e0: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69  }else if( !ispri
a9f0: 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20  nt(c&0xff) ){.  
aa00: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
aa10: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
aa20: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
aa30: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
aa40: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
aa50: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
aa60: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
aa70: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
aa80: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
aa90: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
aaa0: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
aab0: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
aac0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
aad0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
aae0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
aaf0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
ab00: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
ab10: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
ab20: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
ab30: 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20     z[i].        
ab40: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27      && z[i]!='<'
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
ab60: 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20  z[i]!='&'.      
ab70: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
ab80: 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  >'.            &
ab90: 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20  & z[i]!='\"'.   
aba0: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
abb0: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
abc0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
abd0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >0 ){.      utf8
abe0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  _printf(out,"%.*
abf0: 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20  s",i,z);.    }. 
ac00: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27     if( z[i]=='<'
ac10: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
ac20: 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29  intf(out,"&lt;")
ac30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ac40: 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[i]=='&' ){.   
ac50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ac60: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
ac70: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
ac80: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '>' ){.      raw
ac90: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74  _printf(out,"&gt
aca0: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
acb0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b  f( z[i]=='\"' ){
acc0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
acd0: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
ace0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
acf0: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
ad00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ad10: 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20  t,"&#39;");.    
ad20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
ad30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
ad40: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
ad50: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c  ./*.** If a fiel
ad60: 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63  d contains any c
ad70: 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66  haracter identif
ad80: 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68  ied by a 1 in th
ad90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61  e following.** a
ada0: 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73  rray, then the s
adb0: 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75  tring must be qu
adc0: 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f  oted for CSV..*/
add0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ade0: 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  ar needCsvQuote[
adf0: 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c  ] = {.  1, 1, 1,
ae00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae10: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ae20: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
ae30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ae40: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ae50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
ae60: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
ae70: 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20  , 0, 1,   0, 0, 
ae80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae90: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aea0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
aeb0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aec0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
aed0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aee0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
aef0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
af00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af10: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
af20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
af30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af40: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
af50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af60: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
af70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
af80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af90: 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  0, 1,.  1, 1, 1,
afa0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afb0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
afc0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
afd0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
afe0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
aff0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b000: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b010: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b020: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b030: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b040: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b050: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b060: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b070: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b080: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b090: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b0a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0b0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b0c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b0d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b0e0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b0f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b100: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b110: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b120: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b130: 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1, 1,.};../*.** 
b140: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
b150: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
b160: 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65  tually, p->colSe
b170: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
b180: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
b190: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
b1a0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
b1b0: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56  comma.  p->nullV
b1c0: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
b1d0: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
b1e0: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69  ngs are quoted i
b1f0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
b200: 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69  e separator.** i
b210: 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66  s only issued if
b220: 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a   bSep is true..*
b230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
b240: 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74  tput_csv(ShellSt
b250: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
b260: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
b270: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
b280: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
b290: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
b2a0: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
b2b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
b2c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
b2d0: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d  ;.    int nSep =
b2e0: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
b2f0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
b300: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
b310: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
b320: 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e  eedCsvQuote[((un
b330: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
b340: 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  i]].         || 
b350: 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70  (z[i]==p->colSep
b360: 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20  arator[0] &&.   
b370: 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d            (nSep=
b380: 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20  =1 || memcmp(z, 
b390: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
b3a0: 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20   nSep)==0)) ){. 
b3b0: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
b3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b3e0: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
b3f0: 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d   char *zQuoted =
b400: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b410: 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20  ("\"%w\"", z);. 
b420: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
b430: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f  (out, "%s", zQuo
b440: 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
b450: 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64  te3_free(zQuoted
b460: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b470: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b480: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
b490: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
b4a0: 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Sep ){.    utf8_
b4b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b4c0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
b4d0: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ator);.  }.}../*
b4e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b4f0: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
b500: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
b510: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
b520: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
b530: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
b540: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
b550: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
b560: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b   seenInterrupt++
b570: 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65  ;.  if( seenInte
b580: 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31  rrupt>2 ) exit(1
b590: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44  );.  if( globalD
b5a0: 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  b ) sqlite3_inte
b5b0: 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b  rrupt(globalDb);
b5c0: 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64  .}..#if (defined
b5d0: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
b5e0: 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21  ned(WIN32)) && !
b5f0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
b600: 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CE)./*.** This r
b610: 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20  outine runs for 
b620: 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28  console events (
b630: 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20  e.g. Ctrl-C) on 
b640: 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20  Win32.*/.static 
b650: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73  BOOL WINAPI Cons
b660: 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a  oleCtrlHandler(.
b670: 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79    DWORD dwCtrlTy
b680: 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  pe /* One of the
b690: 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f   CTRL_*_EVENT co
b6a0: 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
b6b0: 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d  if( dwCtrlType==
b6c0: 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a  CTRL_C_EVENT ){.
b6d0: 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61      interrupt_ha
b6e0: 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65  ndler(0);.    re
b6f0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20  turn TRUE;.  }. 
b700: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
b710: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
b720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b730: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
b740: 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68   When the ".auth
b750: 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65   ON" is set, the
b760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f   following autho
b770: 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  rizer callback i
b780: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49  s.** invoked.  I
b790: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
b7a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
b7b0: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41  tatic int shellA
b7c0: 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  uth(.  void *pCl
b7d0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20  ientData,.  int 
b7e0: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
b7f0: 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA1,.  const c
b800: 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73  har *zA2,.  cons
b810: 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63  t char *zA3,.  c
b820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29  onst char *zA4.)
b830: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
b840: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
b850: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
b860: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b870: 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20  r *azAction[] = 
b880: 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54  { 0,.     "CREAT
b890: 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  E_INDEX",       
b8a0: 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22    "CREATE_TABLE"
b8b0: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b8c0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  E_TEMP_INDEX",. 
b8d0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b8e0: 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45  _TABLE",    "CRE
b8f0: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
b900: 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50  ",  "CREATE_TEMP
b910: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52  _VIEW",.     "CR
b920: 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20  EATE_TRIGGER",  
b930: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45       "CREATE_VIE
b940: 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45  W",          "DE
b950: 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f  LETE",.     "DRO
b960: 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  P_INDEX",       
b970: 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22      "DROP_TABLE"
b980: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b990: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  P_TEMP_INDEX",. 
b9a0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b9b0: 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f  ABLE",      "DRO
b9c0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  P_TEMP_TRIGGER",
b9d0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56      "DROP_TEMP_V
b9e0: 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  IEW",.     "DROP
b9f0: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
ba00: 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20     "DROP_VIEW", 
ba10: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
ba20: 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d  RT",.     "PRAGM
ba30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
ba40: 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20    "READ",       
ba50: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
ba60: 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41  T",.     "TRANSA
ba70: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
ba80: 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20   "UPDATE",      
ba90: 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48           "ATTACH
baa0: 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22  ",.     "DETACH"
bab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bac0: 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20  "ALTER_TABLE",  
bad0: 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58          "REINDEX
bae0: 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45  ",.     "ANALYZE
baf0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
bb00: 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c  "CREATE_VTABLE",
bb10: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54          "DROP_VT
bb20: 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e  ABLE",.     "FUN
bb30: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
bb40: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c      "SAVEPOINT",
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43              "REC
bb60: 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69  URSIVE".  };.  i
bb70: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
bb80: 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b  ar *az[4];.  az[
bb90: 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31  0] = zA1;.  az[1
bba0: 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d  ] = zA2;.  az[2]
bbb0: 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20   = zA3;.  az[3] 
bbc0: 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72  = zA4;.  utf8_pr
bbd0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75  intf(p->out, "au
bbe0: 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61  thorizer: %s", a
bbf0: 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20  zAction[op]);.  
bc00: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
bc10: 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  +){.    raw_prin
bc20: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
bc30: 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29  .    if( az[i] )
bc40: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  {.      output_c
bc50: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
bc60: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  az[i]);.    }els
bc70: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
bc80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c  ntf(p->out, "NUL
bc90: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
bca0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bcb0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74  ut, "\n");.  ret
bcc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bcd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
bce0: 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74  rint a schema st
bcf0: 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f  atement.  Part o
bd00: 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20  f MODE_Semi and 
bd10: 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70  MODE_Pretty outp
bd20: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ut..**.** This r
bd30: 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20  outine converts 
bd40: 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c  some CREATE TABL
bd50: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  E statements for
bd60: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a   shadow tables.*
bd70: 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e  * in FTS3/4/5 in
bd80: 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
bd90: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
bda0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
bdb0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63  tic void printSc
bdc0: 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f  hemaLine(FILE *o
bdd0: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
bde0: 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  z, const char *z
bdf0: 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 7a 3d 3d  Tail){.  if( z==
be00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
be10: 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72 65 74  ( zTail==0 ) ret
be20: 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
be30: 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41  e3_strglob("CREA
be40: 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22  TE TABLE ['\"]*"
be50: 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , z)==0 ){.    u
be60: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
be70: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
be80: 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25 73   NOT EXISTS %s%s
be90: 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b  ", z+13, zTail);
bea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
beb0: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
bec0: 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29  %s%s", z, zTail)
bed0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
bee0: 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  oid printSchemaL
bef0: 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ineN(FILE *out, 
bf00: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
bf10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
bf20: 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a  l){.  char c = z
bf30: 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  [n];.  z[n] = 0;
bf40: 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  .  printSchemaLi
bf50: 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c  ne(out, z, zTail
bf60: 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d  );.  z[n] = c;.}
bf70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bf80: 72 75 65 20 69 66 20 73 74 72 69 6e 67 20 7a 5b  rue if string z[
bf90: 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20 62 75  ] has nothing bu
bfa0: 74 20 77 68 69 74 65 73 70 61 63 65 20 61 6e 64  t whitespace and
bfb0: 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65   comments to the
bfc0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
bfd0: 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74  irst line..*/.st
bfe0: 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c  atic int wsToEol
bff0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
c000: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c010: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
c020: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
c030: 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  \n' ) return 1;.
c040: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
c050: 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  z[i]) ) continue
c060: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ;.    if( z[i]==
c070: 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27  '-' && z[i+1]=='
c080: 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  -' ) return 1;. 
c090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c0a0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
c0b0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
c0c0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45 58 50  entry to the EXP
c0d0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
c0e0: 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  data.*/.static v
c0f0: 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64 28 53  oid eqp_append(S
c100: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
c110: 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20 70 32  t iEqpId, int p2
c120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
c130: 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61 70 68  ext){.  EQPGraph
c140: 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  Row *pNew;.  int
c150: 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65 6e 33   nText = strlen3
c160: 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20  0(zText);.  if( 
c170: 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 29  p->autoEQPtest )
c180: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
c190: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c 25 64  f(p->out, "%d,%d
c1a0: 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64 2c 20  ,%s\n", iEqpId, 
c1b0: 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  p2, zText);.  }.
c1c0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
c1d0: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
c1e0: 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65 78 74  f(*pNew) + nText
c1f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
c200: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
c210: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70 4e 65  _memory();.  pNe
c220: 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45 71 70  w->iEqpId = iEqp
c230: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50 61 72  Id;.  pNew->iPar
c240: 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20 6d 65  entId = p2;.  me
c250: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65 78 74  mcpy(pNew->zText
c260: 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74 2b 31  , zText, nText+1
c270: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  );.  pNew->pNext
c280: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 73   = 0;.  if( p->s
c290: 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b 0a 20  Graph.pLast ){. 
c2a0: 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61     p->sGraph.pLa
c2b0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  st->pNext = pNew
c2c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c2d0: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20  ->sGraph.pRow = 
c2e0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73  pNew;.  }.  p->s
c2f0: 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20 70 4e  Graph.pLast = pN
c300: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
c310: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
c320: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
c330: 41 4e 20 64 61 74 61 20 74 68 61 74 20 68 61 73  AN data that has
c340: 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65 64 0a   been collected.
c350: 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70 68 2e  ** in p->sGraph.
c360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c370: 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c 6c 53  eqp_reset(ShellS
c380: 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47  tate *p){.  EQPG
c390: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a  raphRow *pRow, *
c3a0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 52 6f  pNext;.  for(pRo
c3b0: 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e 70 52  w = p->sGraph.pR
c3c0: 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d  ow; pRow; pRow =
c3d0: 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65   pNext){.    pNe
c3e0: 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  xt = pRow->pNext
c3f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
c400: 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a 20 20  ee(pRow);.  }.  
c410: 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72 61 70  memset(&p->sGrap
c420: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  h, 0, sizeof(p->
c430: 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f 2a 20  sGraph));.}../* 
c440: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  Return the next 
c450: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
c460: 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69 45 71  AN line with iEq
c470: 70 49 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  pId that occurs 
c480: 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c 20 6f  after.** pOld, o
c490: 72 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  r return the fir
c4a0: 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69 66 20  st such line if 
c4b0: 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a 2f 0a  pOld is NULL.*/.
c4c0: 73 74 61 74 69 63 20 45 51 50 47 72 61 70 68 52  static EQPGraphR
c4d0: 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72 6f 77  ow *eqp_next_row
c4e0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
c4f0: 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51 50 47  int iEqpId, EQPG
c500: 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29 7b 0a  raphRow *pOld){.
c510: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c520: 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70 4f 6c  Row = pOld ? pOl
c530: 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e 73 47  d->pNext : p->sG
c540: 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77 68 69  raph.pRow;.  whi
c550: 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52 6f 77  le( pRow && pRow
c560: 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69 45 71  ->iParentId!=iEq
c570: 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70 52 6f  pId ) pRow = pRo
c580: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  w->pNext;.  retu
c590: 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52  rn pRow;.}../* R
c5a0: 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65 20 6c  ender a single l
c5b0: 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72 61 70  evel of the grap
c5c0: 68 20 74 68 61 74 20 68 61 73 20 69 45 71 70 49  h that has iEqpI
c5d0: 64 20 61 73 20 69 74 73 20 70 61 72 65 6e 74 2e  d as its parent.
c5e0: 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65 63 75    Called.** recu
c5f0: 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e 64 65  rsively to rende
c600: 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a 2f 0a  r sublevels..*/.
c610: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c620: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53 68 65  render_level(She
c630: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
c640: 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50 47 72  iEqpId){.  EQPGr
c650: 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a 70  aphRow *pRow, *p
c660: 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Next;.  int n = 
c670: 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47 72 61  strlen30(p->sGra
c680: 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20 20 63  ph.zPrefix);.  c
c690: 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 70 52  har *z;.  for(pR
c6a0: 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f  ow = eqp_next_ro
c6b0: 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30 29 3b  w(p, iEqpId, 0);
c6c0: 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e   pRow; pRow = pN
c6d0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
c6e0: 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70  = eqp_next_row(p
c6f0: 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77 29 3b  , iEqpId, pRow);
c700: 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d 3e 7a  .    z = pRow->z
c710: 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38 5f 70  Text;.    utf8_p
c720: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c730: 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73 47 72  s%s%s\n", p->sGr
c740: 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70 4e 65  aph.zPrefix, pNe
c750: 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22 60 2d  xt ? "|--" : "`-
c760: 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20  -", z);.    if( 
c770: 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  n<(int)sizeof(p-
c780: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 29  >sGraph.zPrefix)
c790: 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -7 ){.      memc
c7a0: 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e 7a 50  py(&p->sGraph.zP
c7b0: 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78 74 20  refix[n], pNext 
c7c0: 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20 22 2c  ? "|  " : "   ",
c7d0: 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72   4);.      eqp_r
c7e0: 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20 70  ender_level(p, p
c7f0: 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a 20 20  Row->iEqpId);.  
c800: 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50      p->sGraph.zP
c810: 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20 20  refix[n] = 0;.  
c820: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c830: 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72 65 73   Display and res
c840: 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  et the EXPLAIN Q
c850: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
c860: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c870: 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c 53 74  p_render(ShellSt
c880: 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47 72  ate *p){.  EQPGr
c890: 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70  aphRow *pRow = p
c8a0: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20  ->sGraph.pRow;. 
c8b0: 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20 20 20   if( pRow ){.   
c8c0: 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74   if( pRow->zText
c8d0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
c8e0: 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78    if( pRow->pNex
c8f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
c900: 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  eqp_reset(p);.  
c910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c920: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
c930: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c940: 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54  "%s\n", pRow->zT
c950: 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d  ext+3);.      p-
c960: 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20 70  >sGraph.pRow = p
c970: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
c980: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c990: 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Row);.    }else{
c9a0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
c9b0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55 45 52  tf(p->out, "QUER
c9c0: 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20 20  Y PLAN\n");.    
c9d0: 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e  }.    p->sGraph.
c9e0: 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a  zPrefix[0] = 0;.
c9f0: 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c      eqp_render_l
ca00: 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20 20 20  evel(p, 0);.    
ca10: 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  eqp_reset(p);.  
ca20: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
ca30: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
ca40: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
ca50: 20 50 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65   Progress handle
ca60: 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  r callback..*/.s
ca70: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67 72 65  tatic int progre
ca80: 73 73 5f 68 61 6e 64 6c 65 72 28 76 6f 69 64 20  ss_handler(void 
ca90: 2a 70 43 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a  *pClientData) {.
caa0: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
cab0: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
cac0: 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 70 2d  ClientData;.  p-
cad0: 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
cae0: 69 66 28 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73  if( p->nProgress
caf0: 3e 3d 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73 20  >=p->mxProgress 
cb00: 26 26 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73  && p->mxProgress
cb10: 3e 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  >0 ){.    raw_pr
cb20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 72  intf(p->out, "Pr
cb30: 6f 67 72 65 73 73 20 6c 69 6d 69 74 20 72 65 61  ogress limit rea
cb40: 63 68 65 64 20 28 25 75 29 5c 6e 22 2c 20 70 2d  ched (%u)\n", p-
cb50: 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20  >nProgress);.   
cb60: 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f 67 72   if( p->flgProgr
cb70: 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47  ess & SHELL_PROG
cb80: 52 45 53 53 5f 52 45 53 45 54 20 29 20 70 2d 3e  RESS_RESET ) p->
cb90: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
cba0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f     if( p->flgPro
cbb0: 67 72 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52  gress & SHELL_PR
cbc0: 4f 47 52 45 53 53 5f 4f 4e 43 45 20 29 20 70 2d  OGRESS_ONCE ) p-
cbd0: 3e 6d 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  >mxProgress = 0;
cbe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
cbf0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 67   }.  if( (p->flg
cc00: 50 72 6f 67 72 65 73 73 20 26 20 53 48 45 4c 4c  Progress & SHELL
cc10: 5f 50 52 4f 47 52 45 53 53 5f 51 55 49 45 54 29  _PROGRESS_QUIET)
cc20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  ==0 ){.    raw_p
cc30: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
cc40: 72 6f 67 72 65 73 73 20 25 75 5c 6e 22 2c 20 70  rogress %u\n", p
cc50: 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->nProgress);.  
cc60: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
cc70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cc80: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
cc90: 41 4c 4c 42 41 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a  ALLBACK */../*.*
cca0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
ccb0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
ccc0: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
ccd0: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
cce0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
ccf0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
cd00: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
cd10: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
cd20: 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  Arg,.  int nArg,
cd30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cd40: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
cd50: 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mns */.  char **
cd60: 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78  azArg,    /* Tex
cd70: 74 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74  t of each result
cd80: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
cd90: 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a  r **azCol,    /*
cda0: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   Column names */
cdb0: 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20  .  int *aiType  
cdc0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79      /* Column ty
cdd0: 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  pes */.){.  int 
cde0: 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  i;.  ShellState 
cdf0: 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
ce00: 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61  *)pArg;..  if( a
ce10: 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  zArg==0 ) return
ce20: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d   0;.  switch( p-
ce30: 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  >cMode ){.    ca
ce40: 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a  se MODE_Line: {.
ce50: 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b        int w = 5;
ce60: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
ce70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ce80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
ce90: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
cea0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
ceb0: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
cec0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
ced0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
cee0: 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20  w ) w = len;.   
cef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
cf00: 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38  ->cnt++>0 ) utf8
cf10: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
cf20: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
cf30: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f  rator);.      fo
cf40: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
cf50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ++){.        utf
cf60: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cf70: 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c  "%*s = %s%s", w,
cf80: 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20   azCol[i],.     
cf90: 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
cfa0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
cfb0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70   p->nullValue, p
cfc0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
cfd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cfe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cff0: 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69  case MODE_Explai
d000: 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  n:.    case MODE
d010: 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20  _Column: {.     
d020: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
d030: 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  t aExplainWidths
d040: 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20  [] = {4, 13, 4, 
d050: 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d  4, 4, 13, 2, 13}
d060: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
d070: 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  t *colWidth;.   
d080: 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a     int showHdr;.
d090: 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53        char *rowS
d0a0: 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ep;.      if( p-
d0b0: 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c  >cMode==MODE_Col
d0c0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  umn ){.        c
d0d0: 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c  olWidth = p->col
d0e0: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73  Width;.        s
d0f0: 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77  howHdr = p->show
d100: 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  Header;.        
d110: 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53  rowSep = p->rowS
d120: 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20  eparator;.      
d130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
d140: 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61  olWidth = aExpla
d150: 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20  inWidths;.      
d160: 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20    showHdr = 1;. 
d170: 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20         rowSep = 
d180: 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d  SEP_Row;.      }
d190: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
d1a0: 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t++==0 ){.      
d1b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d1c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d1d0: 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20     int w, n;.   
d1e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
d1f0: 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
d200: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
d210: 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b     w = colWidth[
d220: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  i];.          }e
d230: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d240: 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   w = 0;.        
d250: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
d260: 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( w==0 ){.      
d270: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
d280: 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  Char(azCol[i] ? 
d290: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d2b0: 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20  w<10 ) w = 10;. 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73             n = s
d2d0: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20  trlenChar(azArg 
d2e0: 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  && azArg[i] ? az
d2f0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
d300: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
d310: 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20      if( w<n ) w 
d320: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = n;.          }
d330: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
d340: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
d350: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
d360: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74            p->act
d370: 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b  ualWidth[i] = w;
d380: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d390: 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48         if( showH
d3a0: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
d3b0: 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69    utf8_width_pri
d3c0: 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a  nt(p->out, w, az
d3d0: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
d3e0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d3f0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69  (p->out, "%s", i
d400: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
d410: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
d420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d430: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f  .        if( sho
d440: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
d450: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d460: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d470: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
d480: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d490: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
d4a0: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
d4b0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
d4c0: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d4e0: 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77  if( w<0 ) w = -w
d4f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
d500: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d510: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
d520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d530: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d540: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
d550: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
d560: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20  -------".       
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5f0: 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20  -------",.      
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d                i=
d610: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
d620: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
d630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d650: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
d660: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
d670: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d680: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a  .        int w;.
d690: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d6a0: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
d6b0: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
d6c0: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
d6d0: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
d6e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d6f0: 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20         w = 10;. 
d700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d710: 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d   if( p->cMode==M
d720: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61  ODE_Explain && a
d730: 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65  zArg[i] && strle
d740: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e  nChar(azArg[i])>
d750: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  w ){.          w
d760: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
d770: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
d780: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
d790: 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65  ==1 && p->aiInde
d7a0: 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  nt && p->pStmt )
d7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
d7c0: 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49  p->iIndent<p->nI
d7d0: 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ndent ){.       
d7e0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d7f0: 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c  (p->out, "%*.s",
d800: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e   p->aiIndent[p->
d810: 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20  iIndent], "");. 
d820: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d830: 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b       p->iIndent+
d840: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
d850: 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f       utf8_width_
d860: 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c  print(p->out, w,
d870: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
d880: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
d890: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74  lue);.        ut
d8a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d8b0: 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d  , "%s", i==nArg-
d8c0: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
d8d0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
d8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d8f0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d     case MODE_Sem
d900: 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d  i: {   /* .schem
d910: 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d  a and .fullschem
d920: 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  a output */.    
d930: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d940: 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  e(p->out, azArg[
d950: 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  0], ";\n");.    
d960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d970: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65     case MODE_Pre
d980: 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65  tty: {  /* .sche
d990: 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65  ma and .fullsche
d9a0: 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74  ma with --indent
d9b0: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
d9c0: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  z;.      int j;.
d9d0: 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e        int nParen
d9e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
d9f0: 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20   cEnd = 0;.     
da00: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69   char c;.      i
da10: 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20  nt nLine = 0;.  
da20: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
da30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
da40: 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62   azArg[0]==0 ) b
da50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
da60: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
da70: 22 43 52 45 41 54 45 20 56 49 45 57 25 22 2c 20  "CREATE VIEW%", 
da80: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
da90: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
daa0: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
dab0: 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b  E TRIG%", azArg[
dac0: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
dad0: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
dae0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
daf0: 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  %s;\n", azArg[0]
db00: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
db10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
db20: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
db30: 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
db40: 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  0]);.      j = 0
db50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
db60: 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20   IsSpace(z[i]); 
db70: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72  i++){}.      for
db80: 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  (; (c = z[i])!=0
db90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
dba0: 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
dbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
dbc0: 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a  z[j-1]=='\r' ) z
dbd0: 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20  [j-1] = '\n';.  
dbe0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
dbf0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a  ace(z[j-1]) || z
dc00: 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e  [j-1]=='(' ) con
dc10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
dc20: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27  else if( (c=='('
dc30: 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a   || c==')') && j
dc40: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
dc50: 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  j-1]) ){.       
dc60: 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
dc70: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
dc80: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
dc90: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
dca0: 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  & IsSpace(z[j-1]
dcb0: 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ) ){ j--; }.    
dcc0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
dcd0: 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a    if( strlen30(z
dce0: 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20  )>=79 ){.       
dcf0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
dd00: 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b   z[i])!=0; i++){
dd10: 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e 67 65    /* Copy change
dd20: 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b  s from z[i] back
dd30: 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20 20   to z[j] */.    
dd40: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45 6e        if( c==cEn
dd50: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
dd60: 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20   cEnd = 0;.     
dd70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
dd80: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27 27  =='"' || c=='\''
dd90: 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20 20   || c=='`' ){.  
dda0: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
ddb0: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   c;.          }e
ddc0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
ddd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
dde0: 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20  nd = ']';.      
ddf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
de00: 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d  ='-' && z[i+1]==
de10: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
de20: 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b 0a     cEnd = '\n';.
de30: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
de40: 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20  if( c=='(' ){.  
de50: 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
de60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
de70: 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20 29  lse if( c==')' )
de80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
de90: 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20  aren--;.        
dea0: 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20      if( nLine>0 
deb0: 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20  && nParen==0 && 
dec0: 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j>0 ){.         
ded0: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
dee0: 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c  LineN(p->out, z,
def0: 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20   j, "\n");.     
df00: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a           j = 0;.
df10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
df20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df30: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
df40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50            if( nP
df50: 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64 3d  aren==1 && cEnd=
df60: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
df70: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
df80: 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20 26  \n' || (c==',' &
df90: 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b 31  & !wsToEol(z+i+1
dfa0: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ))).          ){
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
dfc0: 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a   c=='\n' ) j--;.
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
dfe0: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e  tSchemaLineN(p->
dff0: 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20  out, z, j, "\n  
e000: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
e010: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
e020: 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20     nLine++;.    
e030: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
e040: 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20 29  sSpace(z[i+1]) )
e050: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { i++; }.       
e060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e070: 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b         z[j] = 0;
e080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e090: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70  rintSchemaLine(p
e0a0: 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29  ->out, z, ";\n")
e0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e0c0: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 62  free(z);.      b
e0d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e0e0: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20  case MODE_List: 
e0f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e100: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e110: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e120: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e130: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e140: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e150: 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61  (p->out,"%s%s",a
e160: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
e170: 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41             i==nA
e180: 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65 70  rg-1 ? p->rowSep
e190: 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53  arator : p->colS
e1a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e1b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e1c0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e1d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
e1e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e1f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
e200: 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
e210: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d  ;.        if( z=
e220: 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c  =0 ) z = p->null
e230: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 75  Value;.        u
e240: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e250: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
e260: 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d       if( i<nArg-
e270: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  1 ){.          u
e280: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e290: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e2a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e2b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e2d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e2e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
e2f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e300: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e310: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e320: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
e330: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e340: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e350: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  r ){.        raw
e360: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e370: 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TR>");.        
e380: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e390: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e3a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e3b0: 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20  ut,"<TH>");.    
e3c0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d        output_htm
e3d0: 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  l_string(p->out,
e3e0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
e3f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e400: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e  (p->out,"</TH>\n
e410: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
e420: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e430: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
e440: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
e450: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
e460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 61   break;.      ra
e470: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e480: 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 66  "<TR>");.      f
e490: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e4a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61  i++){.        ra
e4b0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e4c0: 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20  "<TD>");.       
e4d0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
e4e0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e4f0: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
e500: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
e510: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
e520: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44  ntf(p->out,"</TD
e530: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
e540: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e550: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
e560: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e570: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e580: 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20  ODE_Tcl: {.     
e590: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e5a0: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e5b0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
e5c0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e5d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  +){.          ou
e5e0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
e5f0: 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  >out,azCol[i] ? 
e600: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
e610: 20 20 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e            if(i<n
e620: 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e  Arg-1) utf8_prin
e630: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e640: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e650: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e660: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e670: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e680: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
e690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e6a0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
e6b0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
e6c0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e6d0: 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  {.        output
e6e0: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
e6f0: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
e700: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
e710: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69  alue);.        i
e720: 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38  f(i<nArg-1) utf8
e730: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e740: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
e750: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e760: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e770: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e780: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e790: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e7a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e7b0: 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20  DE_Csv: {.      
e7c0: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d  setBinaryMode(p-
e7d0: 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
e7e0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e7f0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e800: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e810: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
e830: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c  put_csv(p, azCol
e840: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
e850: 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a   "", i<nArg-1);.
e860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e870: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e880: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e890: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e8a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e8b0: 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nArg>0 ){.      
e8c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e8d0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e8e0: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
e8f0: 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72   azArg[i], i<nAr
e900: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
e910: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e920: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e930: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e940: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e950: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d    setTextMode(p-
e960: 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
e970: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e980: 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72   case MODE_Inser
e990: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61  t: {.      if( a
e9a0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e9b0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
e9c0: 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52  tf(p->out,"INSER
e9d0: 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a 44  T INTO %s",p->zD
e9e0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  estTable);.     
e9f0: 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64   if( p->showHead
ea00: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  er ){.        ra
ea10: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ea20: 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  "(");.        fo
ea30: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ea40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
ea50: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
ea60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
ea70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ea80: 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b  quoteChar(azCol[
ea90: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i]) ){.         
eaa0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
eab0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
eac0: 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29  %w\"", azCol[i])
ead0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  ;.            ut
eae0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eaf0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
eb00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eb10: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  free(z);.       
eb20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eb30: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
eb40: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
eb50: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
eb60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
eb70: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
eb80: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a  tf(p->out,")");.
eb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
eba0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
ebb0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ebc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ++){.        raw
ebd0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ebe0: 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56 41  i>0 ? "," : " VA
ebf0: 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20 20  LUES(");.       
ec00: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
ec10: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
ec20: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ec30: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
ec40: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ec50: 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29  f(p->out,"NULL")
ec60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ec70: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
ec80: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ec90: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
eca0: 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c    if( ShellHasFl
ecb0: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
ecc0: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
ecd0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
ece0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
ecf0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
ed00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ed10: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
ed20: 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f  _quoted_escaped_
ed30: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
ed40: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
ed50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
ed60: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
ed70: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
ed80: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
ed90: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
eda0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
edb0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
edc0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
edd0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ede0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  i]==SQLITE_FLOAT
edf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
ee00: 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20  ar z[50];.      
ee10: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
ee20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
ee30: 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69  uble(p->pStmt, i
ee40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ee50: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 72 3b 0a  ite3_uint64 ur;.
ee60: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
ee70: 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66 28 72  (&ur,&r,sizeof(r
ee80: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
ee90: 28 20 75 72 3d 3d 30 78 37 66 66 30 30 30 30 30  ( ur==0x7ff00000
eea0: 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20  00000000LL ){.  
eeb0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
eec0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 31 65  intf(p->out, "1e
eed0: 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20  999");.         
eee0: 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d 3d 30   }else if( ur==0
eef0: 78 66 66 66 30 30 30 30 30 30 30 30 30 30 30 30  xfff000000000000
ef00: 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0LL ){.         
ef10: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
ef20: 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39 22 29 3b  >out, "-1e999");
ef30: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ef40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ef50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
ef60: 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29  0,z,"%!.20g", r)
ef70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  ;.            ra
ef80: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ef90: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
efa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
efb0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
efc0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
efd0: 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e  LITE_BLOB && p->
efe0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
eff0: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70     const void *p
f000: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
f010: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53  olumn_blob(p->pS
f020: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
f030: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
f040: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
f050: 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  tes(p->pStmt, i)
f060: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
f070: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f  ut_hex_blob(p->o
f080: 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ut, pBlob, nBlob
f090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f0a0: 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a   if( isNumber(az
f0b0: 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20  Arg[i], 0) ){.  
f0c0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
f0d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
f0e0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
f0f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 68      }else if( Sh
f100: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
f110: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
f120: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f130: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f140: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
f150: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f160: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
f170: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
f180: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
f190: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
f1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f1b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f1c0: 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20  ->out,");\n");. 
f1d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f1e0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
f1f0: 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20 69  Quote: {.      i
f200: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
f210: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
f220: 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73  ->cnt==0 && p->s
f230: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
f240: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f250: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
f260: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
f270: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
f280: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
f290: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f2a0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f2b0: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
f2c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
f2d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f2e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
f2f0: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
f300: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f310: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f320: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
f330: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f340: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ",");.        if
f350: 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20  ( (azArg[i]==0) 
f360: 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69  || (aiType && ai
f370: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
f380: 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
f390: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f3a0: 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  ->out,"NULL");. 
f3b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f3c0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f3d0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58  e[i]==SQLITE_TEX
f3e0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  T ){.          o
f3f0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f400: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f410: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f420: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f430: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f440: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
f450: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f460: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f470: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
f480: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f490: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
f4a0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  [i]==SQLITE_FLOA
f4b0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
f4c0: 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20  har z[50];.     
f4d0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
f4e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
f4f0: 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20  ouble(p->pStmt, 
f500: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  i);.          sq
f510: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
f520: 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29  0,z,"%!.20g", r)
f530: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
f540: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f550: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
f560: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f570: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f580: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
f590: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
f5a0: 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
f5b0: 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *pBlob = sqlite3
f5c0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e  _column_blob(p->
f5d0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f5e0: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
f5f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f600: 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20  bytes(p->pStmt, 
f610: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  i);.          ou
f620: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d  tput_hex_blob(p-
f630: 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  >out, pBlob, nBl
f640: 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ob);.        }el
f650: 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28  se if( isNumber(
f660: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a  azArg[i], 0) ){.
f670: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f680: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f690: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
f6a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f6b0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f6c0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f6d0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f6f0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
f700: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
f710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f720: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f730: 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20 20  _Ascii: {.      
f740: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
f750: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
f760: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
f770: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f780: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
f790: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
f7a0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f7b0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
f7c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  );.          utf
f7d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f7e0: 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  "%s",azCol[i] ? 
f7f0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
f800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f810: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f820: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
f830: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
f840: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f850: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
f860: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f870: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
f880: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f890: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f8a0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
f8b0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
f8c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f8d0: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41  (p->out,"%s",azA
f8e0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
f8f0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
f900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f910: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f920: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
f930: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
f940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f950: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 51 50     case MODE_EQP
f960: 3a 20 7b 0a 20 20 20 20 20 20 65 71 70 5f 61 70  : {.      eqp_ap
f970: 70 65 6e 64 28 70 2c 20 61 74 6f 69 28 61 7a 41  pend(p, atoi(azA
f980: 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28 61 7a 41  rg[0]), atoi(azA
f990: 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67 5b 33 5d  rg[1]), azArg[3]
f9a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f9b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f9c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
f9d0: 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62  his is the callb
f9e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74  ack routine that
f9f0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
fa00: 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ary.** invokes f
fa10: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
fa20: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
fa30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c  /.static int cal
fa40: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
fa50: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
fa60: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
fa70: 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69  *azCol){.  /* si
fa80: 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68 61 76  nce we don't hav
fa90: 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c  e type info, cal
faa0: 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c  l the shell_call
fab0: 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c  back with a NULL
fac0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75   value */.  retu
fad0: 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  rn shell_callbac
fae0: 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a  k(pArg, nArg, az
faf0: 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c  Arg, azCol, NULL
fb00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
fb10: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
fb20: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73 71   routine from sq
fb30: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74 68 61  lite3_exec() tha
fb40: 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a  t appends all.**
fb50: 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74 68 65   output onto the
fb60: 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c 54   end of a ShellT
fb70: 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ext object..*/.s
fb80: 74 61 74 69 63 20 69 6e 74 20 63 61 70 74 75 72  tatic int captur
fb90: 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 28  eOutputCallback(
fba0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
fbb0: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
fbc0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b 0a  rg, char **az){.
fbd0: 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70 20 3d    ShellText *p =
fbe0: 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70 41 72   (ShellText*)pAr
fbf0: 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e  g;.  int i;.  UN
fc00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
fc10: 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67 3d  z);.  if( azArg=
fc20: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fc30: 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70 70 65   if( p->n ) appe
fc40: 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c 20 30  ndText(p, "|", 0
fc50: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
fc60: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
fc70: 69 66 28 20 69 20 29 20 61 70 70 65 6e 64 54 65  if( i ) appendTe
fc80: 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  xt(p, ",", 0);. 
fc90: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 20     if( azArg[i] 
fca0: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
fcb0: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20 20  azArg[i], 0);.  
fcc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
fcd0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
fce0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 53  an appropriate S
fcf0: 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 69 6e  ELFTEST table in
fd00: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
fd10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
fd20: 69 64 20 63 72 65 61 74 65 53 65 6c 66 74 65 73  id createSelftes
fd30: 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74 61 74  tTable(ShellStat
fd40: 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  e *p){.  char *z
fd50: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71  ErrMsg = 0;.  sq
fd60: 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
fd70: 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54  ,.    "SAVEPOINT
fd80: 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b 5c   selftest_init;\
fd90: 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  n".    "CREATE T
fda0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
fdb0: 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e 22 0a  TS selftest(\n".
fdc0: 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54 45 47      "  tno INTEG
fdd0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c  ER PRIMARY KEY,\
fde0: 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e 75 6d  n"   /* Test num
fdf0: 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f 70  ber */.    "  op
fe00: 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20   TEXT,\n"       
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fe20: 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20 72  perator:  memo r
fe30: 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d 64  un */.    "  cmd
fe40: 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20   TEXT,\n"       
fe50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fe60: 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20 20  mmand text */.  
fe70: 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c 6e 22    "  ans TEXT\n"
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 61 6e     /* Desired an
fea0: 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b 22  swer */.    ");"
feb0: 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d  .    "CREATE TEM
fec0: 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24  P TABLE [_shell$
fed0: 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73  self](op,cmd,ans
fee0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
fef0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
ff00: 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63 6d  elf](rowid,op,cm
ff10: 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c  d)\n".    "  VAL
ff20: 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28 53 45  UES(coalesce((SE
ff30: 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b 31  LECT (max(tno)+1
ff40: 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c 66  00)/10 FROM self
ff50: 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20 20  test),10),\n".  
ff60: 20 20 22 20 20 20 20 20 20 20 20 20 27 6d 65 6d    "         'mem
ff70: 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65 72 61  o','Tests genera
ff80: 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27 29 3b  ted by --init');
ff90: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
ffa0: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
ffb0: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
ffc0: 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20 20  ECT 'run',\n".  
ffd0: 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68    "    'SELECT h
ffe0: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27  ex(sha3_query(''
fff0: 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
10000 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
10040 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27  ster ORDER BY 2'
10050 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20  ',224))',\n".   
10060 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71   "    hex(sha3_q
10070 75 65 72 79 28 27 53 45 4c 45 43 54 20 74 79 70  uery('SELECT typ
10080 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
10090 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73  "FROM sqlite_mas
100c0 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27 2c  ter ORDER BY 2',
100d0 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22 49  224));\n".    "I
100e0 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
100f0 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
10100 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
10110 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45  ".    "    'SELE
10120 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72  CT hex(sha3_quer
10130 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46 52 4f  y(''SELECT * FRO
10140 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22 20  M \"' ||".    " 
10150 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 27 25         printf('%
10160 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22 20  w',name) || '\" 
10170 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c 32 32  NOT INDEXED'',22
10180 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  4))',\n".    "  
10190 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79    hex(sha3_query
101a0 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43 54 20  (printf('SELECT 
101b0 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f  * FROM \"%w\" NO
101c0 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65 29  T INDEXED',name)
101d0 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20 22 20  ,224))\n".    " 
101e0 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22   FROM (\n".    "
101f0 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
10200 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
10210 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  er\n".    "     
10220 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
10230 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  e'\n".    "     
10240 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65 6c    AND name<>'sel
10250 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20 22 20  ftest'\n".    " 
10260 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65 73        AND coales
10270 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 30  ce(rootpage,0)>0
10280 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a  \n".    "  )\n".
10290 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
102a0 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ame;\n".    "INS
102b0 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
102c0 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
102d0 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c 27 50   VALUES('run','P
102e0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
102f0 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22  check','ok');\n"
10300 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
10310 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c 6f  O selftest(tno,o
10320 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20 20  p,cmd,ans)".    
10330 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2a  "  SELECT rowid*
10340 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52  10,op,cmd,ans FR
10350 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  OM [_shell$self]
10360 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50 20 54  ;\n".    "DROP T
10370 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  ABLE [_shell$sel
10380 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26 7a  f];".    ,0,0,&z
10390 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
103a0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 74  ErrMsg ){.    ut
103b0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
103c0 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e 69 74  , "SELFTEST init
103d0 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75  ialization failu
103e0 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  re: %s\n", zErrM
103f0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
10400 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
10410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78    }.  sqlite3_ex
10420 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
10430 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  SE selftest_init
10440 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a  ",0,0,0);.}.../*
10450 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
10460 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69  ination table fi
10470 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65 6c 6c  eld of the Shell
10480 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  State structure 
10490 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
104a0 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76 65  f the table give
104b0 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20 71  n.  Escape any q
104c0 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
104d0 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  in the.** table 
104e0 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
104f0 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e  void set_table_n
10500 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ame(ShellState *
10510 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
10520 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Name){.  int i, 
10530 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65  n;.  char cQuote
10540 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
10550 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  if( p->zDestTabl
10560 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d  e ){.    free(p-
10570 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zDestTable);.  
10580 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
10590 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
105a0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
105b0 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f  ;.  cQuote = quo
105c0 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20  teChar(zName);. 
105d0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e   n = strlen30(zN
105e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51 75 6f  ame);.  if( cQuo
105f0 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20  te ) n += n+2;. 
10600 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62   z = p->zDestTab
10610 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31  le = malloc( n+1
10620 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   );.  if( z==0 )
10630 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
10640 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d 20 30 3b  mory();.  n = 0;
10650 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20  .  if( cQuote ) 
10660 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
10670 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d  .  for(i=0; zNam
10680 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e[i]; i++){.    
10690 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69  z[n++] = zName[i
106a0 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  ];.    if( zName
106b0 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b  [i]==cQuote ) z[
106c0 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
106d0 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20   }.  if( cQuote 
106e0 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
106f0 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d  e;.  z[n] = 0;.}
10700 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
10710 20 61 20 71 75 65 72 79 20 73 74 61 74 65 6d 65   a query stateme
10720 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e  nt that will gen
10730 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74  erate SQL output
10740 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20  .  Print.** the 
10750 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20  result columns, 
10760 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c  comma-separated,
10770 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74   on a line and t
10780 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d  hen add a.** sem
10790 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f  icolon terminato
107a0 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
107b0 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
107c0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
107d0 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61  f columns is 1 a
107e0 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63  nd that column c
107f0 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d  ontains text "--
10800 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ".** then write 
10810 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e  the semicolon on
10820 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65   a separate line
10830 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69 66 20  .  That way, if 
10840 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e  a.** "--" commen
10850 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
10860 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61 74 65  end of the state
10870 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e  ment, the commen
10880 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75  t.** won't consu
10890 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e  me the semicolon
108a0 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
108b0 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74  static int run_t
108c0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
108d0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
108e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ,           /* Q
108f0 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  uery context */.
10900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
10910 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45  elect,     /* SE
10920 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10930 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e  o extract conten
10940 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
10950 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20  r *zFirstRow    
10960 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20  /* Print before 
10970 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f  first row, if no
10980 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  t NULL */.){.  s
10990 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
109a0 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lect;.  int rc;.
109b0 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20    int nResult;. 
109c0 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
109d0 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20  char *z;.  rc = 
109e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
109f0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63  v2(p->db, zSelec
10a00 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c  t, -1, &pSelect,
10a10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
10a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65  QLITE_OK || !pSe
10a30 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74 66 38  lect ){.    utf8
10a40 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10a50 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
10a60 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
10a70 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20   rc,.           
10a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
10a90 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
10aa0 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d   if( (rc&0xff)!=
10ab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
10ac0 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20   p->nErr++;.    
10ad0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
10af0 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e  ep(pSelect);.  n
10b00 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
10b10 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
10b20 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28  elect);.  while(
10b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
10b40 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73  ){.    if( zFirs
10b50 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 75 74  tRow ){.      ut
10b60 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
10b70 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f  , "%s", zFirstRo
10b80 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74  w);.      zFirst
10b90 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Row = 0;.    }. 
10ba0 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68     z = (const ch
10bb0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
10bc0 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
10bd0 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72   0);.    utf8_pr
10be0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
10bf0 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  ", z);.    for(i
10c00 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69  =1; i<nResult; i
10c10 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ++){.      utf8_
10c20 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10c30 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ,%s", sqlite3_co
10c40 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
10c50 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20  t, i));.    }.  
10c60 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
10c70 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20   "";.    while( 
10c80 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27  z[0] && (z[0]!='
10c90 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29  -' || z[1]!='-')
10ca0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
10cb0 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 72 61  z[0] ){.      ra
10cc0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
10cd0 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d   "\n;\n");.    }
10ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
10cf0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10d00 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ;\n");.    }.   
10d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
10d20 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  ep(pSelect);.  }
10d30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10d40 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74  finalize(pSelect
10d50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74  ITE_OK ){.    ut
10d70 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
10d80 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
10d90 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
10da0 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
10db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10dc0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
10dd0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
10de0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
10df0 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
10e00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10e10 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
10e20 20 73 70 61 63 65 20 61 6e 64 20 73 61 76 65 20   space and save 
10e30 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f  off current erro
10e40 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  r string..*/.sta
10e50 74 69 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65  tic char *save_e
10e60 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65  rr_msg(.  sqlite
10e70 33 20 2a 64 62 20 20 20 20 20 20 20 20 20 20 20  3 *db           
10e80 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
10e90 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  query */.){.  in
10ea0 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74  t nErrMsg = 1+st
10eb0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65  rlen30(sqlite3_e
10ec0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68  rrmsg(db));.  ch
10ed0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71  ar *zErrMsg = sq
10ee0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
10ef0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
10f00 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65  ErrMsg ){.    me
10f10 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71  mcpy(zErrMsg, sq
10f20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
10f30 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  , nErrMsg);.  }.
10f40 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67    return zErrMsg
10f50 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69  ;.}..#ifdef __li
10f60 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65  nux__./*.** Atte
10f70 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79 20 49  mpt to display I
10f80 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75  /O stats on Linu
10f90 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49  x using /proc/PI
10fa0 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76  D/io.*/.static v
10fb0 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e 75 78  oid displayLinux
10fc0 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a 6f 75  IoStats(FILE *ou
10fd0 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  t){.  FILE *in;.
10fe0 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20    char z[200];. 
10ff0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11000 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
11010 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67  "/proc/%d/io", g
11020 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d  etpid());.  in =
11030 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b   fopen(z, "rb");
11040 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
11050 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
11060 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28  fgets(z, sizeof(
11070 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20  z), in)!=0 ){.  
11080 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
11090 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63 6f  truct {.      co
110a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65  nst char *zPatte
110b0 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rn;.      const 
110c0 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20  char *zDesc;.   
110d0 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a   } aTrans[] = {.
110e0 20 20 20 20 20 20 7b 20 22 72 63 68 61 72 3a 20        { "rchar: 
110f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11100 20 20 20 20 22 42 79 74 65 73 20 72 65 63 65 69      "Bytes recei
11110 76 65 64 20 62 79 20 72 65 61 64 28 29 3a 22 20  ved by read():" 
11120 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63 68 61  },.      { "wcha
11130 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  r: ",           
11140 20 20 20 20 20 20 20 22 42 79 74 65 73 20 73 65         "Bytes se
11150 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a 22 20  nt to write():" 
11160 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73     },.      { "s
11170 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20 20 20  yscr: ",        
11180 20 20 20 20 20 20 20 20 20 20 22 52 65 61 64 28            "Read(
11190 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22  ) system calls:"
111a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
111b0 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20 20 20   "syscw: ",     
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57 72               "Wr
111d0 69 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ite() system cal
111e0 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20 20  ls:"     },.    
111f0 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65 73 3a    { "read_bytes:
11200 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
11210 22 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d  "Bytes read from
11220 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20   storage:"  },. 
11230 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f 62 79       { "write_by
11240 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20  tes: ",         
11250 20 20 20 22 42 79 74 65 73 20 77 72 69 74 74 65     "Bytes writte
11260 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d  n to storage:" }
11270 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e 63 65  ,.      { "cance
11280 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74 65 73  lled_write_bytes
11290 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64  : ",  "Cancelled
112a0 20 77 72 69 74 65 20 62 79 74 65 73 3a 22 20 20   write bytes:"  
112b0 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
112c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
112d0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
112e0 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20  aTrans); i++){. 
112f0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
11300 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d 2e  len30(aTrans[i].
11310 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
11320 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72   if( strncmp(aTr
11330 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c  ans[i].zPattern,
11340 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   z, n)==0 ){.   
11350 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11360 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 22  (out, "%-36s %s"
11370 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73  , aTrans[i].zDes
11380 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20  c, &z[n]);.     
11390 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
113a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63  }.    }.  }.  fc
113b0 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64  lose(in);.}.#end
113c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  if../*.** Displa
113d0 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  y a single line 
113e0 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e 67 20  of status using 
113f0 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a  64-bit values..*
11400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
11410 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a 20  splayStatLine(. 
11420 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
11430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11440 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20  e shell context 
11450 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65  */.  char *zLabe
11460 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11470 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69 73  * Label for this
11480 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63   one line */.  c
11490 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20  har *zFormat,   
114a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d           /* Form
114b0 61 74 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  at for the resul
114c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74  t */.  int iStat
114d0 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20 20  usCtrl,         
114e0 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75 73   /* Which status
114f0 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20   to display */. 
11500 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20   int bReset     
11510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11520 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ue to reset the 
11530 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  stats */.){.  sq
11540 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72  lite3_int64 iCur
11550 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33   = -1;.  sqlite3
11560 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d 20  _int64 iHiwtr = 
11570 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65  -1;.  int i, nPe
11580 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c  rcent;.  char zL
11590 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69  ine[200];.  sqli
115a0 74 65 33 5f 73 74 61 74 75 73 36 34 28 69 53 74  te3_status64(iSt
115b0 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72 2c  atusCtrl, &iCur,
115c0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
115d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50  );.  for(i=0, nP
115e0 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61  ercent=0; zForma
115f0 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t[i]; i++){.    
11600 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d  if( zFormat[i]==
11610 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b  '%' ) nPercent++
11620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65 72  ;.  }.  if( nPer
11630 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71  cent>1 ){.    sq
11640 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
11650 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c  izeof(zLine), zL
11660 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43  ine, zFormat, iC
11670 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d  ur, iHiwtr);.  }
11680 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11690 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
116a0 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c  f(zLine), zLine,
116b0 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74 72   zFormat, iHiwtr
116c0 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69  );.  }.  raw_pri
116d0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33  ntf(p->out, "%-3
116e0 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c  6s %s\n", zLabel
116f0 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zLine);.}../*.
11700 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72  ** Display memor
11710 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74  y stats..*/.stat
11720 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f 73  ic int display_s
11730 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
11740 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11750 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11760 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68  to query */.  Sh
11770 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
11780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
11790 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
117a0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73  te */.  int bRes
117b0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
117c0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
117d0 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a  eset the stats *
117e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  /.){.  int iCur;
117f0 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a 20  .  int iHiwtr;. 
11800 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 69 66   FILE *out;.  if
11810 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20 70 41 72  ( pArg==0 || pAr
11820 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72 65 74 75  g->out==0 ) retu
11830 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d 20 70 41  rn 0;.  out = pA
11840 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69 66 28 20  rg->out;..  if( 
11850 70 41 72 67 2d 3e 70 53 74 6d 74 20 26 26 20 28  pArg->pStmt && (
11860 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 26 20  pArg->statsOn & 
11870 32 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  2) ){.    int nC
11880 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20 20 73 71  ol, i, x;.    sq
11890 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
118a0 74 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b  t = pArg->pStmt;
118b0 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  .    char z[100]
118c0 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c  ;.    nCol = sql
118d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
118e0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 61  t(pStmt);.    ra
118f0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
11900 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22 4e 75 6d  -36s %d\n", "Num
11910 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
11920 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c 29 3b 0a  lumns:", nCol);.
11930 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11940 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11950 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11960 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a 2c 22 43  f(sizeof(z),z,"C
11970 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61 6d 65 3a  olumn %d %nname:
11980 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20 20 20 20  ", i, &x);.     
11990 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
119a0 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
119b0 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  z, sqlite3_colum
119c0 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  n_name(pStmt,i))
119d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
119e0 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
119f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11a00 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22  rintf(30, z+x, "
11a10 64 65 63 6c 61 72 65 64 20 74 79 70 65 3a 22 29  declared type:")
11a20 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
11a30 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
11a40 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
11a50 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
11a60 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 23 65  e(pStmt, i));.#e
11a70 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
11a80 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
11a90 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
11aa0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11ab0 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61 74 61 62  (30, z+x, "datab
11ac0 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20  ase name:");.   
11ad0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11ae0 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11af0 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11b00 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
11b10 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
11b20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11b30 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 74 61  ntf(30, z+x, "ta
11b40 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20  ble name:");.   
11b50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11b60 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11b70 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11b80 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  umn_table_name(p
11b90 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
11ba0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11bb0 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72 69 67 69  (30, z+x, "origi
11bc0 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20  n name:");.     
11bd0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
11be0 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
11bf0 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  z, sqlite3_colum
11c00 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28 70 53  n_origin_name(pS
11c10 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64 69 66 0a  tmt,i));.#endif.
11c20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 69 73      }.  }..  dis
11c30 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11c40 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a  g, "Memory Used:
11c50 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11c60 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c  ax %lld) bytes",
11c70 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11c80 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65 73  EMORY_USED, bRes
11c90 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
11ca0 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11cb0 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64  mber of Outstand
11cc0 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a  ing Allocations:
11cd0 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11ce0 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54  ax %lld)", SQLIT
11cf0 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
11d00 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a  COUNT, bReset);.
11d10 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
11d20 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61  lFlgs & SHFLG_Pa
11d30 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 64  gecache ){.    d
11d40 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11d50 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11d60 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73 65  Pcache Pages Use
11d70 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  d:",.       "%ll
11d80 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 70 61 67  d (max %lld) pag
11d90 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
11da0 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45  US_PAGECACHE_USE
11db0 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 7d 0a  D, bReset);.  }.
11dc0 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11dd0 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
11de0 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
11df0 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20  ow Bytes:",.    
11e00 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
11e10 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
11e20 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
11e30 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65 73  E_OVERFLOW, bRes
11e40 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
11e50 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61  atLine(pArg, "La
11e60 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e  rgest Allocation
11e70 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62  :",.     "%lld b
11e80 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
11e90 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45  ATUS_MALLOC_SIZE
11ea0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
11eb0 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11ec0 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61 63  g, "Largest Pcac
11ed0 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c  he Allocation:",
11ee0 0a 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65  .     "%lld byte
11ef0 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11f00 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a 45  S_PAGECACHE_SIZE
11f10 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64 65  , bReset);.#ifde
11f20 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41 43  f YYTRACKMAXSTAC
11f30 4b 44 45 50 54 48 0a 20 20 64 69 73 70 6c 61 79  KDEPTH.  display
11f40 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11f50 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20 53  Deepest Parser S
11f60 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tack:",.     "%l
11f70 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20  ld (max %lld)", 
11f80 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
11f90 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65 73  RSER_STACK, bRes
11fa0 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  et);.#endif..  i
11fb0 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28  f( db ){.    if(
11fc0 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73   pArg->shellFlgs
11fd0 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69   & SHFLG_Lookasi
11fe0 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48 69 77  de ){.      iHiw
11ff0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12010 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12020 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12030 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20 20 20  ASIDE_USED,.    
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
12060 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
12070 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12080 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20  rg->out,.       
12090 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69 64         "Lookasid
120a0 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20  e Slots Used:   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
120c0 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20  (max %d)\n",.   
120d0 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 2c             iCur,
120e0 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
120f0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
12100 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
12110 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
12120 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  HIT,.           
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
12140 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
12150 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
12160 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12170 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f  , "Successful lo
12180 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73  okaside attempts
12190 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  :       %d\n",. 
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
121b0 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
121c0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
121d0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
121e0 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
121f0 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
12210 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12220 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
12230 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12240 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
12250 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73  ailures due to s
12260 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c  ize:      %d\n",
12270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12280 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
12290 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
122a0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
122b0 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
122c0 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20  SS_FULL,.       
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
122f0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
12300 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12310 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
12320 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
12330 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e   OOM:       %d\n
12340 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12350 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a   iHiwtr);.    }.
12360 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12370 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12380 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12390 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
123a0 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69  S_CACHE_USED, &i
123b0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
123c0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
123d0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
123e0 20 22 50 61 67 65 72 20 48 65 61 70 20 55 73 61   "Pager Heap Usa
123f0 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
12400 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
12410 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12420 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12430 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12440 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12450 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12460 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
12470 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  IT, &iCur, &iHiw
12480 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f  tr, 1);.    raw_
12490 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
124a0 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68 69  , "Page cache hi
124b0 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
124c0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
124d0 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
124e0 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
124f0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12500 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12510 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49  BSTATUS_CACHE_MI
12520 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  SS, &iCur, &iHiw
12530 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f  tr, 1);.    raw_
12540 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12550 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d 69  , "Page cache mi
12560 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20 20  sses:           
12570 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12580 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
12590 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
125a0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
125b0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
125c0 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52  BSTATUS_CACHE_WR
125d0 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69  ITE, &iCur, &iHi
125e0 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
125f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12600 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 77  t, "Page cache w
12610 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20 20  rites:          
12620 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12630 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12640 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12650 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12660 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12670 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 53  DBSTATUS_CACHE_S
12680 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20 26 69 48  PILL, &iCur, &iH
12690 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
126a0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
126b0 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
126c0 73 70 69 6c 6c 73 3a 20 20 20 20 20 20 20 20 20  spills:         
126d0 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
126e0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
126f0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12700 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12710 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12720 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41  _DBSTATUS_SCHEMA
12730 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
12740 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12750 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12760 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d  Arg->out, "Schem
12770 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  a Heap Usage:   
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
127a0 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
127b0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
127c0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
127d0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
127e0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
127f0 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69 43  S_STMT_USED, &iC
12800 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
12810 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12820 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12830 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70 2f  "Statement Heap/
12840 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65 3a  Lookaside Usage:
12850 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
12860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
12870 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
12880 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a   pArg->pStmt ){.
12890 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
128a0 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
128b0 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
128c0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
128d0 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20  LLSCAN_STEP,.   
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65 73              bRes
12900 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12910 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12920 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20  Fullscan Steps: 
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12950 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12960 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12970 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12980 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12990 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a  _SORT, bReset);.
129a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
129b0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20  Arg->out, "Sort 
129c0 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20  Operations:     
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
129f0 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
12a00 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12a10 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12a20 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
12a30 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a 20  INDEX,bReset);. 
12a40 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12a50 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e  rg->out, "Autoin
12a60 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20 20  dex Inserts:    
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12a80 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12a90 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12aa0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12ab0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12ac0 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
12ad0 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EP, bReset);.   
12ae0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12af0 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c 20  ->out, "Virtual 
12b00 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20 20  Machine Steps:  
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12b20 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12b30 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12b40 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12b50 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12b60 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 41  MTSTATUS_REPREPA
12b70 52 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  RE, bReset);.   
12b80 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12b90 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65 70 61 72  ->out, "Reprepar
12ba0 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  e operations:   
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12bc0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12bd0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12be0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12bf0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12c00 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c 20 62 52  MTSTATUS_RUN, bR
12c10 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12c20 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12c30 20 22 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65   "Number of time
12c40 73 20 72 75 6e 3a 20 20 20 20 20 20 20 20 20 20  s run:          
12c50 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12c60 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12c70 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12c80 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12c90 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12ca0 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62 52 65 73  US_MEMUSED, bRes
12cb0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12cc0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12cd0 4d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 70  Memory used by p
12ce0 72 65 70 61 72 65 64 20 73 74 6d 74 3a 20 20 20  repared stmt:   
12cf0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12d00 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  );.  }..#ifdef _
12d10 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c  _linux__.  displ
12d20 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 70  ayLinuxIoStats(p
12d30 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  Arg->out);.#endi
12d40 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72  f..  /* Do not r
12d50 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69  emove this machi
12d60 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d  ne readable comm
12d70 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73  ent: extra-stats
12d80 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a  -output-here */.
12d90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12da0 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63  /*.** Display sc
12db0 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  an stats..*/.sta
12dc0 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
12dd0 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71  _scanstats(.  sq
12de0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e00 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
12e10 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
12e20 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  te *pArg        
12e30 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12e40 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
12e50 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
12e60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
12e70 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55  T_SCANSTATUS.  U
12e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e90 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
12ea0 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23  RAMETER(pArg);.#
12eb0 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  else.  int i, k,
12ec0 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70 72   n, mx;.  raw_pr
12ed0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12ee0 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74  "-------- scanst
12ef0 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ats --------\n")
12f00 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66 6f  ;.  mx = 0;.  fo
12f10 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b  r(k=0; k<=mx; k+
12f20 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  +){.    double r
12f30 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20  EstLoop = 1.0;. 
12f40 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b     for(i=n=0; 1;
12f50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
12f60 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70  ite3_stmt *p = p
12f70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
12f80 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12f90 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a 20  nLoop, nVisit;. 
12fa0 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74       double rEst
12fb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69 64  ;.      int iSid
12fc0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
12fd0 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20  ar *zExplain;.  
12fe0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
12ff0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13000 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13010 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
13020 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20  id*)&nLoop) ){. 
13030 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13040 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13050 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
13060 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
13070 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43 54  _SCANSTAT_SELECT
13080 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69 64  ID, (void*)&iSid
13090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
130a0 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69 64  d>mx ) mx = iSid
130b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 64  ;.      if( iSid
130c0 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=k ) continue;.
130d0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
130e0 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c 6f  {.        rEstLo
130f0 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 6f  op = (double)nLo
13100 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
13110 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  k>0 ) raw_printf
13120 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
13130 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20 25  ----- subquery %
13140 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29  d -------\n", k)
13150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13160 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n++;.      sqlit
13170 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
13180 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
13190 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
131a0 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
131b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
131c0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
131d0 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
131e0 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64  NSTAT_EST, (void
131f0 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20 20  *)&rEst);.      
13200 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
13210 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
13220 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58  LITE_SCANSTAT_EX
13230 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a  PLAIN, (void*)&z
13240 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
13250 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
13260 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32 64  ->out, "Loop %2d
13270 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70  : %s\n", n, zExp
13280 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45 73  lain);.      rEs
13290 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a 20  tLoop *= rEst;. 
132a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
132b0 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
132c0 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
132d0 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77  Loop=%-8lld nRow
132e0 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d 25  =%-8lld estRow=%
132f0 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f 6f  -8lld estRow/Loo
13300 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20 20  p=%-8g\n",.     
13310 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73       nLoop, nVis
13320 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  it, (sqlite3_int
13330 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e 35  64)(rEstLoop+0.5
13340 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29 3b  ), rEst.      );
13350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
13360 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
13370 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
13380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
13390 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n");.#endif.}../
133a0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
133b0 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f  zArray points to
133c0 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
133d0 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  ed array of stri
133e0 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69  ngs. zStr.** poi
133f0 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nts to a single 
13400 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
13410 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f  tring. Return no
13420 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a  n-zero if zStr.*
13430 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f  * is equal, acco
13440 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28  rding to strcmp(
13450 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ), to any of the
13460 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20   strings in the 
13470 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77  array..** Otherw
13480 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ise, return zero
13490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134a0 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e  str_in_array(con
134b0 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
134c0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
134d0 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ray){.  int i;. 
134e0 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61   for(i=0; azArra
134f0 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y[i]; i++){.    
13500 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53  if( 0==strcmp(zS
13510 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20  tr, azArray[i]) 
13520 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
13530 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
13540 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
13550 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20   statement pSql 
13560 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e  appears to be an
13570 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
13580 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20  nt, allocate.** 
13590 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
135a0 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e   ShellState.aiIn
135b0 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74  dent[] array wit
135c0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  h the number of.
135d0 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f  ** spaces each o
135e0 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20  pcode should be 
135f0 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20  indented before 
13600 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a 2a  it is output..**
13610 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
13620 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
13630 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
13640 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
13650 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
13660 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
13670 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
13680 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
13690 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
136a0 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
136b0 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
136c0 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
136d0 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
136e0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
136f0 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
13700 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
13710 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
13720 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
13730 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
13740 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
13750 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
13760 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
13770 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
13780 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
13790 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
137a0 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
137b0 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
137c0 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
137d0 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
137e0 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
137f0 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
13800 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
13810 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
13820 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13830 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
13840 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
13850 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
13860 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
13870 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
13880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13890 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
138a0 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
138b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
138e0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
138f0 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
13900 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13920 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
13930 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
13940 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13960 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
13970 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
13980 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
13990 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
139c0 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
139d0 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
139e0 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
139f0 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
13a00 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
13a10 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
13a20 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  ext", 0 };.  con
13a30 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64  st char *azYield
13a40 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20  [] = { "Yield", 
13a50 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47  "SeekLT", "SeekG
13a60 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22  T", "RowSetRead"
13a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
13a90 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
13aa0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
13ab0 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
13ac0 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
13ad0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
13ae0 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
13af0 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
13b00 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
13b10 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
13b20 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
13b30 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  ly.  */.  if( sq
13b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
13b50 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20  nt(pSql)!=8 ){. 
13b60 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
13b70 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
13b80 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  n;.  }.  zSql = 
13b90 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
13ba0 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
13bb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
13bc0 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27  (z=zSql; *z==' '
13bd0 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20   || *z=='\t' || 
13be0 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\n' || *z==
13bf0 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27  '\f' || *z=='\r'
13c00 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71  ; z++);.  if( sq
13c10 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
13c20 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20  , "explain", 7) 
13c30 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
13c40 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
13c50 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
13c60 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
13c70 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
13c80 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
13c90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13ca0 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13cb0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13cc0 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
13cd0 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
13ce0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13cf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
13d00 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
13d10 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
13d20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
13d30 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
13d40 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
13d50 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
13d60 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
13d70 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
13d80 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
13d90 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
13da0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
13db0 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
13dc0 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
13dd0 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
13de0 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
13df0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
13e00 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
13e10 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
13e20 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
13e30 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
13e40 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
13e50 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
13e60 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
13e70 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
13e80 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
13e90 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
13ea0 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
13eb0 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
13ec0 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
13ed0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
13ee0 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
13ef0 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d  .      if( iOp==
13f00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13f10 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69  Do further verfi
13f20 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73  cation that this
13f30 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70   is explain outp
13f40 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20  ut.  Abort if.  
13f50 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
13f60 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ot */.        st
13f70 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13f80 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d  *explainCols[] =
13f90 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   {.           "a
13fa0 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20  ddr", "opcode", 
13fb0 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22  "p1", "p2", "p3"
13fc0 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63  , "p4", "p5", "c
13fd0 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20  omment" };.     
13fe0 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
13ff0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
14000 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69  ArraySize(explai
14010 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  nCols); jj++){. 
14020 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
14030 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cmp(sqlite3_colu
14040 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29  mn_name(pSql,jj)
14050 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d  ,explainCols[jj]
14060 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14070 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
14080 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
14090 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
140a0 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSql);.       
140b0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
140c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
140d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
140e0 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a   nAlloc += 100;.
140f0 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e        p->aiInden
14100 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  t = (int*)sqlite
14110 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
14120 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a  iIndent, nAlloc*
14130 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
14140 20 20 20 20 69 66 28 20 70 2d 3e 61 69 49 6e 64      if( p->aiInd
14150 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ent==0 ) shell_o
14160 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
14170 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20        abYield = 
14180 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
14190 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c  alloc64(abYield,
141a0 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
141b0 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
141c0 61 62 59 69 65 6c 64 3d 3d 30 20 29 20 73 68 65  abYield==0 ) she
141d0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
141e0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62  ();.    }.    ab
141f0 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72  Yield[iOp] = str
14200 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
14210 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e  zYield);.    p->
14220 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20  aiIndent[iOp] = 
14230 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e  0;.    p->nInden
14240 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20  t = iOp+1;..    
14250 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
14260 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b  (zOp, azNext) ){
14270 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
14280 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
14290 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
142a0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
142b0 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
142c0 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70  Op, azGoto) && p
142d0 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20  2op<p->nIndent. 
142e0 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b      && (abYield[
142f0 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33  p2op] || sqlite3
14300 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
14310 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 2)).    ){.   
14320 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
14330 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
14340 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
14350 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
14360 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73  iIndent = 0;.  s
14370 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69  qlite3_free(abYi
14380 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  eld);.  sqlite3_
14390 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a  reset(pSql);.}..
143a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61  /*.** Free the a
143b0 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  rray allocated b
143c0 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  y explain_data_p
143d0 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
143e0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
143f0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65  _data_delete(She
14400 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73  llState *p){.  s
14410 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
14420 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61  iIndent);.  p->a
14430 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  iIndent = 0;.  p
14440 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->nIndent = 0;. 
14450 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
14460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
14470 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77  e and restore .w
14480 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73  heretrace and .s
14490 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69  electtrace setti
144a0 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ngs..*/.#if defi
144b0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
144c0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
144d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
144e0 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  TTRACE).extern i
144f0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
14500 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
14510 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  t savedSelectTra
14520 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
14530 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14540 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
14550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
14560 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ERETRACE).extern
14570 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72   int sqlite3Wher
14580 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  eTrace;.static i
14590 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61  nt savedWhereTra
145a0 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ce;.#endif.stati
145b0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64  c void disable_d
145c0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
145d0 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
145e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
145f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14600 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
14610 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53  TTRACE).  savedS
14620 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c  electTrace = sql
14630 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
14640 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14650 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
14660 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
14670 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
14680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14690 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
146a0 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61  .  savedWhereTra
146b0 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ce = sqlite3Wher
146c0 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  eTrace;.  sqlite
146d0 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
146e0 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
146f0 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65   void restore_de
14700 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
14710 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
14720 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14730 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
14740 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
14750 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
14760 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61  SelectTrace = sa
14770 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
14780 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
14790 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
147a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
147b0 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
147c0 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57  RACE).  sqlite3W
147d0 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65  hereTrace = save
147e0 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
147f0 64 69 66 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  dif.}../* Create
14800 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20   the TEMP table 
14810 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 70 61  used to store pa
14820 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
14830 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
14840 62 69 6e 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28  bind_table_init(
14850 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
14860 20 20 69 6e 74 20 77 72 53 63 68 65 6d 61 20 3d    int wrSchema =
14870 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62   0;.  sqlite3_db
14880 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
14890 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57  QLITE_DBCONFIG_W
148a0 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20  RITABLE_SCHEMA, 
148b0 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29 3b 0a  -1, &wrSchema);.
148c0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
148d0 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  fig(p->db, SQLIT
148e0 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
148f0 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31 2c 20 30  BLE_SCHEMA, 1, 0
14900 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
14910 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 43 52  c(p->db,.    "CR
14920 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
14930 54 20 45 58 49 53 54 53 20 74 65 6d 70 2e 73 71  T EXISTS temp.sq
14940 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73 28  lite_parameters(
14950 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79 20 54  \n".    "  key T
14960 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14970 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c 75 65  \n".    "  value
14980 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29 20 57   ANY\n".    ") W
14990 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 2c 0a  ITHOUT ROWID;",.
149a0 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
149b0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
149c0 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  g(p->db, SQLITE_
149d0 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c  DBCONFIG_WRITABL
149e0 45 5f 53 43 48 45 4d 41 2c 20 77 72 53 63 68 65  E_SCHEMA, wrSche
149f0 6d 61 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ma, 0);.}../*.**
14a00 20 42 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73   Bind parameters
14a10 20 6f 6e 20 61 20 70 72 65 70 61 72 65 64 20 73   on a prepared s
14a20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
14a30 50 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  Parameter bindin
14a40 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
14a50 6d 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 6f  m a TEMP table o
14a60 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
14a70 2a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50  *    CREATE TEMP
14a80 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 70 61   TABLE sqlite_pa
14a90 72 61 6d 65 74 65 72 73 28 6b 65 79 20 54 45 58  rameters(key TEX
14aa0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  T PRIMARY KEY, v
14ab0 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49 54 48  alue).**    WITH
14ac0 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a  OUT ROWID;.**.**
14ad0 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f 63 63   No bindings occ
14ae0 75 72 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ur if this table
14af0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
14b00 20 20 54 68 65 20 73 70 65 63 69 61 6c 20 63 68    The special ch
14b10 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a 20 69  aracter '$'.** i
14b20 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
14b30 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
14b40 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63 6f 6c  help prevent col
14b50 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61 63 74  lisions with act
14b60 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 54  ual tables..** T
14b70 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
14b80 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73 63 68   in the TEMP sch
14b90 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ema..*/.static v
14ba0 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61 72 65  oid bind_prepare
14bb0 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74 61 74  d_stmt(ShellStat
14bc0 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 33  e *pArg, sqlite3
14bd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
14be0 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69 6e 74   int nVar;.  int
14bf0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   i;.  int rc;.  
14c00 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
14c10 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20 3d 20   = 0;..  nVar = 
14c20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
14c30 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
14c40 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 3d  mt);.  if( nVar=
14c50 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
14c60 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   Nothing to do *
14c70 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
14c80 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
14c90 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62 2c 20  adata(pArg->db, 
14ca0 22 54 45 4d 50 22 2c 20 22 73 71 6c 69 74 65 5f  "TEMP", "sqlite_
14cb0 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 20 20 20  parameters",.   
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20 30 2c   "key", 0, 0, 0,
14cf0 20 30 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 4f   0, 0)!=SQLITE_O
14d00 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  K ){.    return;
14d10 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 74 61   /* Parameter ta
14d20 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
14d30 73 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d  st */.  }.  rc =
14d40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
14d50 5f 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a 20 20  _v2(pArg->db,.  
14d60 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
14d70 76 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d 70 2e  value FROM temp.
14d80 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
14d90 73 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  s".          " W
14da0 48 45 52 45 20 6b 65 79 3d 3f 31 22 2c 20 2d 31  HERE key=?1", -1
14db0 2c 20 26 70 51 2c 20 30 29 3b 0a 20 20 69 66 28  , &pQ, 0);.  if(
14dc0 20 72 63 20 7c 7c 20 70 51 3d 3d 30 20 29 20 72   rc || pQ==0 ) r
14dd0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31  eturn;.  for(i=1
14de0 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
14df0 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33  .    char zNum[3
14e00 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0];.    const ch
14e10 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
14e20 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
14e30 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
14e40 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 3d 3d  ;.    if( zVar==
14e50 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14e60 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
14e70 6f 66 28 7a 4e 75 6d 29 2c 7a 4e 75 6d 2c 22 3f  of(zNum),zNum,"?
14e80 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 7a 56  %d",i);.      zV
14e90 61 72 20 3d 20 7a 4e 75 6d 3b 0a 20 20 20 20 7d  ar = zNum;.    }
14ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
14eb0 64 5f 74 65 78 74 28 70 51 2c 20 31 2c 20 7a 56  d_text(pQ, 1, zV
14ec0 61 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  ar, -1, SQLITE_S
14ed0 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20  TATIC);.    if( 
14ee0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 29  sqlite3_step(pQ)
14ef0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
14f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
14f10 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20  nd_value(pStmt, 
14f20 69 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  i, sqlite3_colum
14f30 6e 5f 76 61 6c 75 65 28 70 51 2c 20 30 29 29 3b  n_value(pQ, 0));
14f40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14f50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
14f60 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ull(pStmt, i);. 
14f70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14f80 5f 72 65 73 65 74 28 70 51 29 3b 0a 20 20 7d 0a  _reset(pQ);.  }.
14f90 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
14fa0 7a 65 28 70 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ze(pQ);.}../*.**
14fb0 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20   Run a prepared 
14fc0 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61  statement.*/.sta
14fd0 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72  tic void exec_pr
14fe0 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53  epared_stmt(.  S
14ff0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
15030 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71  ellState */.  sq
15040 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15050 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15070 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75  * Statment to ru
15080 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
15090 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
150a0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
150b0 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
150c0 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
150d0 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
150e0 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
150f0 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
15100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
15110 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
15120 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
15130 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
15140 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
15150 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
15160 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
15170 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
15180 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
15190 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  type */.    int 
151a0 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
151b0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
151c0 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44  t);.    void *pD
151d0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
151e0 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
151f0 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
15200 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
15210 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
15220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15230 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
15240 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
15250 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
15260 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
15270 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
15280 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
15290 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
152a0 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
152b0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
152c0 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
152d0 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
152e0 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
152f0 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
15300 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20      int i, x;.  
15310 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
15320 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
15330 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
15340 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
15350 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
15360 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
15370 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15380 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73  {.        azCols
15390 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
153a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
153b0 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
153c0 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20     }.      do{. 
153d0 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
153e0 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
153f0 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
15400 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15410 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15420 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
15430 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
15440 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
15450 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
15460 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
15470 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
15480 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
15490 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
154a0 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
154b0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
154c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
154d0 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
154e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
154f0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
15500 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
15510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
15520 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
15530 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
15540 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
15550 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15560 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
15570 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
15580 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
15590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
155a0 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
155b0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
155c0 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
155d0 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
155e0 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
155f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
15600 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
15610 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
15620 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
15630 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
15640 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
15650 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c          if( shel
15660 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
15670 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61   nCol, azVals, a
15680 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20  zCols, aiTypes) 
15690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
156a0 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
156b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
156c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
156d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
156e0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
156f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15700 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
15710 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
15720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15730 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20  free(pData);.   
15740 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
15750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
15760 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
15770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15780 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
15790 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70  ess SQL if the p
157a0 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f  revious shell co
157b0 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65  mmand.** was ".e
157c0 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65  xpert". It passe
157d0 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65  s the SQL in the
157e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
157f0 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
15800 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72  the sqlite3exper
15810 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
15820 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
15830 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15840 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
15850 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
15860 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
15870 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
15880 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
15890 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
158a0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
158b0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
158c0 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
158d0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
158e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
158f0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
15900 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
15910 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
15920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
15930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
15940 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a  xpertHandleSQL(.
15950 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
15960 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tate, .  const c
15970 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68  har *zSql, .  ch
15980 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
15990 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
159a0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
159b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72  ;.  assert( pzEr
159c0 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d  r==0 || *pzErr==
159d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
159e0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
159f0 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e  (pState->expert.
15a00 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70  pExpert, zSql, p
15a10 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
15a20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15a30 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74   called either t
15a40 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e  o silently clean
15a50 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   up the object.*
15a60 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
15a70 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61   ".expert" comma
15a80 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  nd (if bCancel==
15a90 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61  1), or to genera
15aa0 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20  te a .** report 
15ab0 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e  from it and then
15ac0 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66   clean it up (if
15ad0 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a   bCancel==0)..**
15ae0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15af0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
15b00 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15b10 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
15b20 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e  rror.** code. In
15b30 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a   this case, (*pz
15b40 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20  Err) may be set 
15b50 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
15b60 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ffer containing.
15b70 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ** an English la
15b80 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
15b90 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
15ba0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15bb0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
15bc0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
15bd0 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
15be0 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
15bf0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
15c00 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28  nt expertFinish(
15c10 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15c20 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61  State,.  int bCa
15c30 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  ncel,.  char **p
15c40 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
15c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15c60 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
15c70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
15c80 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73  t.pExpert;.  ass
15c90 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
15ca0 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70  rt( bCancel || p
15cb0 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
15cc0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  r==0 );.  if( bC
15cd0 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ancel==0 ){.    
15ce0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
15cf0 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74  te->out;.    int
15d00 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61   bVerbose = pSta
15d10 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15d20 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ose;..    rc = s
15d30 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
15d40 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b  alyze(p, pzErr);
15d50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15d70 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c  int nQuery = sql
15d80 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e  ite3_expert_coun
15d90 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  t(p);.      int 
15da0 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56  i;..      if( bV
15db0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
15dc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
15dd0 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  and = sqlite3_ex
15de0 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c  pert_report(p,0,
15df0 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41  EXPERT_REPORT_CA
15e00 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20  NDIDATES);.     
15e10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15e20 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65  t, "-- Candidate
15e30 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s --------------
15e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
15e50 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  n");.        raw
15e60 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
15e70 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20  \n", zCand);.   
15e80 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
15e90 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b  =0; i<nQuery; i+
15ea0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
15eb0 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73  t char *zSql = s
15ec0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15ed0 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15ee0 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20  T_REPORT_SQL);. 
15ef0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15f00 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  r *zIdx = sqlite
15f10 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
15f20 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
15f30 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20  ORT_INDEXES);.  
15f40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15f50 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33   *zEQP = sqlite3
15f60 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
15f70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
15f80 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20  RT_PLAN);.      
15f90 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
15fa0 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20  zIdx = "(no new 
15fb0 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20  indexes)\n";.   
15fc0 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
15fd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
15fe0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15ff0 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d  -- Query %d ----
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  ------------\n",
16020 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
16030 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
16040 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b  "%s\n\n", zSql);
16050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16060 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
16070 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29  t, "%s\n", zIdx)
16080 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
16090 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
160a0 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d  , zEQP);.      }
160b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
160c0 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74  ite3_expert_dest
160d0 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65  roy(p);.  pState
160e0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
160f0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
16100 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
16110 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
16120 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d  expert" dot comm
16130 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
16140 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d  nt expertDotComm
16150 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
16160 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
16170 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
16180 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
16190 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
161a0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
161b0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
161c0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
161d0 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
161e0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
161f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
16200 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16210 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16220 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
16230 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16240 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  _OK;.  char *zEr
16250 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
16260 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20    int iSample = 
16270 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
16280 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
16290 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  pert==0 );.  mem
162a0 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70  set(&pState->exp
162b0 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ert, 0, sizeof(E
162c0 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20  xpertInfo));..  
162d0 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
162e0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
162f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
16300 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
16310 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
16320 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
16330 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
16340 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
16350 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  0(z);.    if( n>
16360 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
16370 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20  (z, "-verbose", 
16380 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  n) ){.      pSta
16390 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
163a0 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
163b0 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32     else if( n>=2
163c0 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
163d0 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20  , "-sample", n) 
163e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
163f0 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
16400 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
16410 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72  tderr, "option r
16420 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
16430 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ent: %s\n", z);.
16440 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16450 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16470 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69  iSample = (int)i
16480 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
16490 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20  g[++i]);.       
164a0 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c   if( iSample<0 |
164b0 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b  | iSample>100 ){
164c0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
164d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76  rintf(stderr, "v
164e0 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  alue out of rang
164f0 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  e: %s\n", azArg[
16500 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
16510 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
16540 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
16550 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
16560 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
16570 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  \n", z);.      r
16580 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
165a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
165b0 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e   ){.    pState->
165c0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
165d0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
165e0 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  new(pState->db, 
165f0 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
16600 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
16610 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Expert==0 ){.   
16620 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
16630 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65  derr, "sqlite3_e
16640 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22  xpert_new: %s\n"
16650 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72  , zErr);.      r
16660 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16680 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72     sqlite3_exper
16690 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20  t_config(.      
166a0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
166b0 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45  rt.pExpert, EXPE
166c0 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45  RT_CONFIG_SAMPLE
166d0 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20  , iSample.      
166e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
166f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16700 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
16710 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16720 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
16730 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
16740 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
16750 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
16760 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20  t.** any result 
16770 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70  rows/columns dep
16780 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75  ending on the cu
16790 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65  rrent mode.** se
167a0 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69  t via the suppli
167b0 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ed callback..**.
167c0 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20  ** This is very 
167d0 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
167e0 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c  e's built-in sql
167f0 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
16800 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69  unction except i
16810 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74  t takes a slight
16820 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c  ly different cal
16830 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c  lback.** and cal
16840 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d  lback data argum
16850 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
16860 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20  nt shell_exec(. 
16870 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
16880 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
16890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
168a0 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
168b0 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
168c0 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
168f0 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63  evaluated */.  c
16900 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16930 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65  r msg written he
16940 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
16950 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
16960 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74   NULL;     /* St
16970 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
16980 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  te. */.  int rc 
16990 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
169a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
169b0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
169c0 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rc2;.  const ch
169d0 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20  ar *zLeftover;  
169e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20          /* Tail 
169f0 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
16a00 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  QL */.  sqlite3 
16a10 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a  *db = pArg->db;.
16a20 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
16a30 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
16a40 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69   = NULL;.  }..#i
16a50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
16a70 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72   if( pArg->exper
16a80 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
16a90 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64   rc = expertHand
16aa0 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c  leSQL(pArg, zSql
16ab0 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
16ac0 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69   return expertFi
16ad0 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d  nish(pArg, (rc!=
16ae0 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72  SQLITE_OK), pzEr
16af0 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rMsg);.  }.#endi
16b00 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  f..  while( zSql
16b10 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
16b20 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
16b30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
16b40 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
16b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
16b60 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
16b70 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
16b80 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
16b90 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
16ba0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
16bb0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
16bc0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16bd0 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
16be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
16c00 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
16c10 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
16c20 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
16c30 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
16c40 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
16c50 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
16c60 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
16c70 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
16c80 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
16c90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
16ca0 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
16cb0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
16cc0 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
16cd0 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
16ce0 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
16cf0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
16d00 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
16d10 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
16d20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
16d30 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16d40 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
16d50 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
16d60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
16d70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
16d80 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
16d90 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
16da0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
16db0 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
16dc0 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
16dd0 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
16de0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
16df0 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
16e00 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
16e20 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
16e30 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
16e40 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
16e50 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
16e60 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
16e70 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
16e80 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
16e90 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16ea0 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
16eb0 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
16ec0 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e  3_stmt_isexplain
16ed0 28 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20  (pStmt)==0 ){.  
16ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
16ef0 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20  mt *pExplain;.  
16f00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50        char *zEQP
16f10 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 72  ;.        int tr
16f20 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20  iggerEQP = 0;.  
16f30 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65        disable_de
16f40 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
16f50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16f60 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
16f70 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
16f80 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31  _TRIGGER_EQP, -1
16f90 2c 20 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a  , &triggerEQP);.
16fa0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
16fb0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
16fc0 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20  QP_trigger ){.  
16fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16fe0 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
16ff0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
17000 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29  IGGER_EQP, 1, 0)
17010 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17020 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74      zEQP = sqlit
17030 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
17040 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25  AIN QUERY PLAN %
17050 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
17060 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17070 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
17080 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
17090 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
170a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
170b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
170c0 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
170d0 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
170e0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
170f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
17100 74 20 63 68 61 72 20 2a 7a 45 51 50 4c 69 6e 65  t char *zEQPLine
17110 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
17120 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
17130 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 33 29 3b  ext(pExplain,3);
17140 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
17150 20 69 45 71 70 49 64 20 3d 20 73 71 6c 69 74 65   iEqpId = sqlite
17160 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
17170 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
17180 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 65         int iPare
17190 6e 74 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ntId = sqlite3_c
171a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
171b0 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  in, 1);.        
171c0 20 20 20 20 69 66 28 20 7a 45 51 50 4c 69 6e 65      if( zEQPLine
171d0 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71 70 5f 72  [0]=='-' ) eqp_r
171e0 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 20 20 20  ender(pArg);.   
171f0 20 20 20 20 20 20 20 20 20 65 71 70 5f 61 70 70           eqp_app
17200 65 6e 64 28 70 41 72 67 2c 20 69 45 71 70 49 64  end(pArg, iEqpId
17210 2c 20 69 50 61 72 65 6e 74 49 64 2c 20 7a 45 51  , iParentId, zEQ
17220 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  PLine);.        
17230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 71    }.          eq
17240 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
17250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17260 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
17270 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
17280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
17290 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
172a0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
172b0 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c  EQP>=AUTOEQP_ful
172c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
172d0 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50  * Also do an EXP
172e0 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66  LAIN for ".eqp f
172f0 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  ull" mode */.   
17300 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
17310 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
17320 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d  XPLAIN %s", zStm
17330 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tSql);.         
17340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17350 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
17360 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
17370 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
17380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
173a0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
173b0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
173c0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
173d0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
173e0 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
173f0 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f             exec_
17400 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
17410 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
17420 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
17430 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17440 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
17450 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
17460 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
17470 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
17480 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17490 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EQP);.        }.
174a0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
174b0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
174c0 51 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72  QP_trigger && tr
174d0 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20  iggerEQP==0 ){. 
174e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
174f0 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
17500 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
17510 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30  RIGGER_EQP, 0, 0
17520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
17530 52 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20  Reprepare pStmt 
17540 62 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e  before reactivin
17550 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f  g trace modes */
17560 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17570 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17580 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
17590 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
175a0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
175b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
175c0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 20       if( pArg ) 
175d0 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53  pArg->pStmt = pS
175e0 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tmt;.        }. 
175f0 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64         restore_d
17600 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
17610 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ();.      }..   
17620 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
17630 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17640 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b  de = pArg->mode;
17650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
17660 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 29  g->autoExplain )
17670 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
17680 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
17690 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 31  xplain(pStmt)==1
176a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
176b0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
176c0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
176d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
176e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
176f0 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17700 6d 74 29 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  mt)==2 ){.      
17710 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17720 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20  e = MODE_EQP;.  
17730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17740 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
17750 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  If the shell is 
17760 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65  currently in ".e
17770 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61  xplain" mode, ga
17780 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20  ther the extra. 
17790 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72         ** data r
177a0 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20 69  equired to add i
177b0 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75  ndents to the ou
177c0 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20  tput.*/.        
177d0 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d  if( pArg->cMode=
177e0 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
177f0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
17800 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
17810 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
17820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17830 0a 20 20 20 20 20 20 62 69 6e 64 5f 70 72 65 70  .      bind_prep
17840 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
17850 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78  pStmt);.      ex
17860 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
17870 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
17880 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
17890 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
178a0 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
178b0 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f  (pArg);..      /
178c0 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
178d0 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
178e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
178f0 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
17900 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
17910 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
17920 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
17930 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  }..      /* prin
17940 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20  t loop-counters 
17950 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
17960 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
17970 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73   pArg->scanstats
17980 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
17990 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
179a0 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  db, pArg);.     
179b0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e   }..      /* Fin
179c0 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
179d0 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65  ent just execute
179e0 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  d. If this fails
179f0 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  , save a.      *
17a00 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72  * copy of the er
17a10 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68  ror message. Oth
17a20 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c  erwise, set zSql
17a30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
17a40 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73  .      ** next s
17a50 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
17a60 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ute. */.      rc
17a70 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
17a80 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
17a90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17aa0 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72  E_NOMEM ) rc = r
17ab0 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
17ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17ad0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
17ae0 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
17af0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
17b00 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
17b10 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
17b20 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
17b30 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
17b40 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
17b50 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  db);.      }..  
17b60 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76      /* clear sav
17b70 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a  ed stmt handle *
17b80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
17b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
17ba0 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a  ->pStmt = NULL;.
17bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17bc0 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a  } /* end while *
17bd0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
17be0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
17bf0 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
17c00 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
17c10 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
17c20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
17c30 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  d freeColumnList
17c40 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a  (char **azCol){.
17c50 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
17c60 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
17c70 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
17c80 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  free(azCol[i]);.
17c90 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30    }.  /* azCol[0
17ca0 5d 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74  ] is a static st
17cb0 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ring */.  sqlite
17cc0 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d  3_free(azCol);.}
17cd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17ce0 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72   list of pointer
17cf0 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69  s to strings whi
17d00 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73  ch are the names
17d10 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d   of all.** colum
17d20 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62  ns in table zTab
17d30 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74  .   The memory t
17d40 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
17d50 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
17d60 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
17d70 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
17d80 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
17d90 75 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65  using a subseque
17da0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72  nt call.** to fr
17db0 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a  eeColumnList()..
17dc0 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b  **.** The azCol[
17dd0 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61  0] entry is usua
17de0 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76  lly NULL.  Howev
17df0 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74  er, if zTab cont
17e00 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20  ains a rowid.** 
17e10 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73  value that needs
17e20 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64   to be preserved
17e30 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20  , then azCol[0] 
17e40 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
17e50 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  h the.** name of
17e60 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
17e70 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
17e80 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  st regular colum
17e90 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  n in the table i
17ea0 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65  s azCol[1].  The
17eb0 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61   list is termina
17ec0 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74  ted.** by an ent
17ed0 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d  ry with azCol[i]
17ee0 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ==0..*/.static c
17ef0 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d  har **tableColum
17f00 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65  nList(ShellState
17f10 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
17f20 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a  *zTab){.  char *
17f30 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71  *azCol = 0;.  sq
17f40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17f50 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  t;.  char *zSql;
17f60 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
17f70 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
17f80 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30  0;.  int nPK = 0
17f90 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
17fa0 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
17fb0 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f   columns seen */
17fc0 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30  .  int isIPK = 0
17fd0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
17fe0 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59   one PRIMARY KEY
17ff0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20   column of type 
18000 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74  INTEGER */.  int
18010 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
18020 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
18030 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
18040 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b  owid);.  int rc;
18050 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
18060 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
18070 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
18080 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d  ", zTab);.  rc =
18090 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
180a0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
180b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
180c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
180d0 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
180e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
180f0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
18100 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
18110 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
18120 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29  nCol>=nAlloc-2 )
18130 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d  {.      nAlloc =
18140 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c   nAlloc*2 + nCol
18150 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43   + 10;.      azC
18160 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ol = sqlite3_rea
18170 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c  lloc(azCol, nAll
18180 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  oc*sizeof(azCol[
18190 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
181a0 61 7a 43 6f 6c 3d 3d 30 20 29 20 73 68 65 6c 6c  azCol==0 ) shell
181b0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
181c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
181d0 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  l[++nCol] = sqli
181e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
181f0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
18200 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
18210 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18220 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
18230 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  mt, 5) ){.      
18240 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nPK++;.      if(
18250 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26   nPK==1.       &
18260 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
18270 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
18280 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
18290 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20  xt(pStmt,2),.   
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 22         "INTEGER"
182c0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
182d0 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31 3b        isIPK = 1;
182e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
182f0 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30 3b        isIPK = 0;
18300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18310 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
18320 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
18330 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
18340 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c  eturn 0;.  azCol
18350 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c  [0] = 0;.  azCol
18360 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20  [nCol+1] = 0;.. 
18370 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e   /* The decision
18380 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
18390 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c  ot a rowid reall
183a0 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  y needs to be pr
183b0 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20  eserved.  ** is 
183c0 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65  tricky.  We neve
183d0 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72  r need to preser
183e0 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61  ve a rowid for a
183f0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18400 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74  able.  ** or a t
18410 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54  able with an INT
18420 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
18430 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65  .  We are unable
18440 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a   to preserve.  *
18450 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c  * rowids on tabl
18460 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  es where the row
18470 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62  id is inaccessib
18480 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65  le because there
18490 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   are other.  ** 
184a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
184b0 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69  able named "rowi
184c0 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61  d", "_rowid_", a
184d0 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20  nd "oid"..  */. 
184e0 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
184f0 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20  id && isIPK ){. 
18500 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c     /* If a singl
18510 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
18520 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49  lumn with type I
18530 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c  NTEGER was seen,
18540 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
18550 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73  might be an alis
18560 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  e for the ROWID.
18570 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61    But it might a
18580 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54  lso be a WITHOUT
18590 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61   ROWID.    ** ta
185a0 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52  ble or a INTEGER
185b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53   PRIMARY KEY DES
185c0 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65  C column, neithe
185d0 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20  r of which are. 
185e0 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61     ** ROWID alia
185f0 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67  ses.  To disting
18600 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73  uish these cases
18610 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18620 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69  f.    ** there i
18630 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69  s a "pk" entry i
18640 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  n "PRAGMA index_
18650 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69  list".  There wi
18660 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20  ll be.    ** no 
18670 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68  "pk" index if th
18680 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65  e PRIMARY KEY re
18690 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73  ally is an alias
186a0 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a   for the ROWID..
186b0 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20      */.    zSql 
186c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
186d0 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  f("SELECT 1 FROM
186e0 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69   pragma_index_li
186f0 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20  st(%Q)".        
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18710 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69     " WHERE origi
18720 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a  n='pk'", zTab);.
18730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18740 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
18750 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
18760 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
18770 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
18780 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18790 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c       freeColumnL
187a0 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
187b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
187c0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
187d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
187e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
187f0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
18800 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
18810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b   rc==SQLITE_ROW;
18820 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65  .  }.  if( prese
18830 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  rveRowid ){.    
18840 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65  /* Only preserve
18850 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65   the rowid if we
18860 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65   can find a name
18870 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a   to use for the.
18880 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a      ** rowid */.
18890 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
188a0 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22  *azRowid[] = { "
188b0 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
188c0 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20  ", "oid" };.    
188d0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
188e0 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
188f0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  {.      for(i=1;
18900 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a   i<=nCol; i++){.
18910 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
18920 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f  te3_stricmp(azRo
18930 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29  wid[j],azCol[i])
18940 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
18950 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
18960 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
18970 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
18980 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
18990 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f  azRowid[j] is no
189a0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  t the name of an
189b0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64  y.        ** ord
189c0 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  inary column in 
189d0 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69  the table.  Veri
189e0 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  fy that azRowid[
189f0 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20  j] is a valid.  
18a00 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f        ** name fo
18a10 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f  r the rowid befo
18a20 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20  re adding it to 
18a30 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f  azCol[0].  WITHO
18a40 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT ROWID.       
18a50 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20   ** tables will 
18a60 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63  fail this last c
18a70 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
18a80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
18a90 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
18aa0 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c  ta(p->db,0,zTab,
18ab0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30  azRowid[j],0,0,0
18ac0 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ,0,0);.        i
18ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18ae0 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a   ) azCol[0] = az
18af0 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20  Rowid[j];.      
18b00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18b20 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a  urn azCol;.}../*
18b30 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72  .** Toggle the r
18b40 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
18b50 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67  _selects setting
18b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18b70 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18b80 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  er(sqlite3 *db){
18b90 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18ba0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
18bb0 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a  t iSetting = 0;.
18bc0 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30    char zStmt[100
18bd0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  ];.  sqlite3_pre
18be0 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41  pare_v2(db, "PRA
18bf0 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
18c00 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20  dered_selects", 
18c10 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
18c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
18c30 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
18c40 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65  E_ROW ){.    iSe
18c50 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  tting = sqlite3_
18c60 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
18c70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
18c80 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
18c90 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  mt);.  sqlite3_s
18ca0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
18cb0 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20  Stmt), zStmt,.  
18cc0 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76       "PRAGMA rev
18cd0 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73  erse_unordered_s
18ce0 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53  elects(%d)", !iS
18cf0 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  etting);.  sqlit
18d00 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d  e3_exec(db, zStm
18d10 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  t, 0, 0, 0);.}..
18d20 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
18d30 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61  different callba
18d40 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  ck routine used 
18d50 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20  for dumping the 
18d60 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63  database..** Eac
18d70 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62  h row received b
18d80 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  y this callback 
18d90 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61  consists of a ta
18da0 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  ble name,.** the
18db0 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e   table type ("in
18dc0 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29  dex" or "table")
18dd0 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61   and SQL to crea
18de0 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  te the table..**
18df0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
18e00 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20  ould print text 
18e10 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65  sufficient to re
18e20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
18e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18e40 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f  dump_callback(vo
18e50 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
18e60 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
18e70 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73  , char **azNotUs
18e80 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
18e90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
18ea0 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
18eb0 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73  r *zType;.  cons
18ec0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
18ed0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
18ee0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41  (ShellState *)pA
18ef0 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg;..  UNUSED_PA
18f00 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65  RAMETER(azNotUse
18f10 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  d);.  if( nArg!=
18f20 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20  3 || azArg==0 ) 
18f30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62  return 0;.  zTab
18f40 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  le = azArg[0];. 
18f50 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31   zType = azArg[1
18f60 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72  ];.  zSql = azAr
18f70 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72  g[2];..  if( str
18f80 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
18f90 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
18fa0 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
18fb0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c  ntf(p->out, "DEL
18fc0 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ETE FROM sqlite_
18fd0 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20  sequence;\n");. 
18fe0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
18ff0 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69  e3_strglob("sqli
19000 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c  te_stat?", zTabl
19010 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  e)==0 ){.    raw
19020 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19030 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
19040 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d  master;\n");.  }
19050 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
19060 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
19070 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
19080 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
19090 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
190a0 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52  Sql, "CREATE VIR
190b0 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29  TUAL TABLE", 20)
190c0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
190d0 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21  *zIns;.    if( !
190e0 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
190f0 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
19100 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
19110 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
19120 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20  chema=ON;\n");. 
19130 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
19140 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
19150 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c  }.    zIns = sql
19160 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
19170 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
19180 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28  O sqlite_master(
19190 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
191a0 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29  me,rootpage,sql)
191b0 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53  ".       "VALUES
191c0 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25  ('table','%q','%
191d0 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20  q',0,'%q');",.  
191e0 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61       zTable, zTa
191f0 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ble, zSql);.    
19200 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
19210 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
19220 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19230 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
19240 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
19250 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d  {.    printSchem
19260 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53  aLine(p->out, zS
19270 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a  ql, ";\n");.  }.
19280 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
19290 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
192a0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   ){.    ShellTex
192b0 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53  t sSelect;.    S
192c0 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b  hellText sTable;
192d0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
192e0 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  l;.    int i;.  
192f0 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73    char *savedDes
19300 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20  tTable;.    int 
19310 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20  savedMode;..    
19320 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c  azCol = tableCol
19330 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c  umnList(p, zTabl
19340 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f  e);.    if( azCo
19350 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  l==0 ){.      p-
19360 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
19370 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
19380 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75      /* Always qu
19390 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ote the table na
193a0 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61  me, even if it a
193b0 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72  ppears to be pur
193c0 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20  e ascii,.    ** 
193d0 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20  in case it is a 
193e0 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e  keyword. Ex:  IN
193f0 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65  SERT INTO "table
19400 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69  " ... */.    ini
19410 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  tText(&sTable);.
19420 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
19430 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20  sTable, zTable, 
19440 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65  quoteChar(zTable
19450 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72  ));.    /* If pr
19460 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77  eserving the row
19470 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e  id, add a column
19480 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20   list after the 
19490 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20  table name..    
194a0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
194b0 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  s:  "INSERT INTO
194c0 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63   tab(rowid,a,b,c
194d0 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e  ,...) VALUES(...
194e0 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61  )".    ** instea
194f0 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22  d of the usual "
19500 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20  INSERT INTO tab 
19510 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20  VALUES(...)"..  
19520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43    */.    if( azC
19530 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
19540 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
19550 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20  e, "(", 0);.    
19560 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19570 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  able, azCol[0], 
19580 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
19590 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
195a0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
195b0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
195c0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
195d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
195e0 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  le, azCol[i], qu
195f0 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
19600 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
19610 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19620 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20  able, ")", 0);. 
19630 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69     }..    /* Bui
19640 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ld an appropriat
19650 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19660 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65  nt */.    initTe
19670 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
19680 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
19690 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22  elect, "SELECT "
196a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
196b0 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
196c0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
196d0 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ect, azCol[0], 0
196e0 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
196f0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
19700 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
19710 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
19720 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
19730 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
19740 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ect, azCol[i], q
19750 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
19760 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
19770 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20  zCol[i+1] ){.   
19780 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
19790 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30  &sSelect, ",", 0
197a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
197b0 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  .    freeColumnL
197c0 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
197d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
197e0 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30  ect, " FROM ", 0
197f0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
19800 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62  t(&sSelect, zTab
19810 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
19820 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76  able));..    sav
19830 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d  edDestTable = p-
19840 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  >zDestTable;.   
19850 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e   savedMode = p->
19860 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  mode;.    p->zDe
19870 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65  stTable = sTable
19880 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  .z;.    p->mode 
19890 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44  = p->cMode = MOD
198a0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  E_Insert;.    rc
198b0 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c   = shell_exec(p,
198c0 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
198d0 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
198e0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )==SQLITE_CORRUP
198f0 54 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  T ){.      raw_p
19900 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
19910 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
19920 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
19930 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67  \n");.      togg
19940 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d  leSelectOrder(p-
19950 3e 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  >db);.      shel
19960 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63  l_exec(p, sSelec
19970 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 74  t.z, 0);.      t
19980 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72  oggleSelectOrder
19990 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  (p->db);.    }. 
199a0 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
199b0 20 3d 20 73 61 76 65 64 44 65 73 74 54 61 62 6c   = savedDestTabl
199c0 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  e;.    p->mode =
199d0 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20   savedMode;.    
199e0 66 72 65 65 54 65 78 74 28 26 73 54 61 62 6c 65  freeText(&sTable
199f0 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  );.    freeText(
19a00 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69  &sSelect);.    i
19a10 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b  f( rc ) p->nErr+
19a20 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
19a30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
19a40 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d  zQuery.  Use dum
19a50 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20  p_callback() as 
19a60 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
19a70 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20  tine so that.** 
19a80 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19a90 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f 75  the query are ou
19aa0 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61 74  tput as SQL stat
19ab0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
19ac0 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54 45   we get a SQLITE
19ad0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20  _CORRUPT error, 
19ae0 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79 20  rerun the query 
19af0 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a  after appending.
19b00 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  ** "ORDER BY row
19b10 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65 20  id DESC" to the 
19b20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  end..*/.static i
19b30 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75  nt run_schema_du
19b40 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c  mp_query(.  Shel
19b50 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e  lState *p,.  con
19b60 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a  st char *zQuery.
19b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
19b80 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
19b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
19ba0 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  ec(p->db, zQuery
19bb0 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c  , dump_callback,
19bc0 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   p, &zErr);.  if
19bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
19be0 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72  RUPT ){.    char
19bf0 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c   *zQ2;.    int l
19c00 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51  en = strlen30(zQ
19c10 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70  uery);.    raw_p
19c20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
19c30 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
19c40 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
19c50 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  \n");.    if( zE
19c60 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
19c70 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19c80 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a  "/****** %s ****
19c90 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
19ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19cb0 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a  e(zErr);.      z
19cc0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Err = 0;.    }. 
19cd0 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28     zQ2 = malloc(
19ce0 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20   len+100 );.    
19cf0 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74  if( zQ2==0 ) ret
19d00 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
19d10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e  te3_snprintf(len
19d20 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f  +100, zQ2, "%s O
19d30 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
19d40 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20  SC", zQuery);.  
19d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19d60 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20  xec(p->db, zQ2, 
19d70 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  dump_callback, p
19d80 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
19d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
19da0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
19db0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52  , "/****** ERROR
19dc0 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  : %s ******/\n",
19dd0 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73   zErr);.    }els
19de0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19df0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
19e00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
19e10 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
19e20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20  free(zQ2);.  }. 
19e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e40 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 68 65 6c  *.** Text of hel
19e50 70 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2a 0a 2a  p messages..**.*
19e60 2a 20 54 68 65 20 68 65 6c 70 20 74 65 78 74 20  * The help text 
19e70 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64  for each individ
19e80 75 61 6c 20 63 6f 6d 6d 61 6e 64 20 62 65 67 69  ual command begi
19e90 6e 73 20 77 69 74 68 20 61 20 6c 69 6e 65 20 74  ns with a line t
19ea0 68 61 74 20 73 74 61 72 74 73 0a 2a 2a 20 77 69  hat starts.** wi
19eb0 74 68 20 22 2e 22 2e 20 20 53 75 62 73 65 71 75  th ".".  Subsequ
19ec0 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 73 75  ent lines are su
19ed0 70 70 6c 69 6d 65 6e 74 61 6c 20 69 6e 66 6f 72  pplimental infor
19ee0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
19ef0 65 72 65 20 6d 75 73 74 20 62 65 20 74 77 6f 20  ere must be two 
19f00 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20 62  or more spaces b
19f10 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
19f20 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 6e  f the command an
19f30 64 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f  d the.** start o
19f40 66 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  f the descriptio
19f50 6e 20 6f 66 20 77 68 61 74 20 74 68 61 74 20 63  n of what that c
19f60 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e 0a 2a 2f 0a  ommand does..*/.
19f70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
19f80 72 20 2a 28 61 7a 48 65 6c 70 5b 5d 29 20 3d 20  r *(azHelp[]) = 
19f90 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
19fa0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
19fb0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19fc0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19fd0 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68 69 76  ABLE).  ".archiv
19fe0 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20  e ...           
19ff0 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72 63    Manage SQL arc
1a000 68 69 76 65 73 22 2c 0a 20 20 22 20 20 20 45 61  hives",.  "   Ea
1a010 63 68 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ch command must 
1a020 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
1a030 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a040 67 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22  g options:",.  "
1a050 20 20 20 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74       -c, --creat
1a060 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a070 43 72 65 61 74 65 20 61 20 6e 65 77 20 61 72 63  Create a new arc
1a080 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20 20 2d  hive",.  "     -
1a090 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20  u, --update     
1a0a0 20 20 20 20 20 20 20 20 20 20 41 64 64 20 66 69            Add fi
1a0b0 6c 65 73 20 6f 72 20 75 70 64 61 74 65 20 66 69  les or update fi
1a0c0 6c 65 73 20 77 69 74 68 20 63 68 61 6e 67 65 64  les with changed
1a0d0 20 6d 74 69 6d 65 22 2c 0a 20 20 22 20 20 20 20   mtime",.  "    
1a0e0 20 2d 69 2c 20 2d 2d 69 6e 73 65 72 74 20 20 20   -i, --insert   
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b 65              Like
1a100 20 2d 75 20 62 75 74 20 61 6c 77 61 79 73 20 61   -u but always a
1a110 64 64 20 65 76 65 6e 20 69 66 20 6d 74 69 6d 65  dd even if mtime
1a120 20 75 6e 63 68 61 6e 67 65 64 22 2c 0a 20 20 22   unchanged",.  "
1a130 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20       -t, --list 
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  List contents of
1a160 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
1a170 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74     -x, --extract
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1a190 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d  tract files from
1a1a0 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
1a1b0 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65   Optional argume
1a1c0 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d  nts:",.  "     -
1a1d0 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20  v, --verbose    
1a1e0 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1a1f0 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73  each filename as
1a200 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64   it is processed
1a210 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49  ",.  "     -f FI
1a220 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20  LE, --file FILE 
1a230 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e        Operate on
1a240 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64   archive FILE (d
1a250 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e  efault is curren
1a260 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20  t db)",.  "     
1a270 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e  -a FILE, --appen
1a280 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61  d FILE     Opera
1a290 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65  te on FILE opene
1a2a0 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64  d using the apnd
1a2b0 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20  vfs VFS",.  "   
1a2c0 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65    -C DIR, --dire
1a2d0 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61  ctory DIR    Cha
1a2e0 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
1a2f0 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74   DIR to read/ext
1a300 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22  ract files",.  "
1a310 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75       -n, --dryru
1a320 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1a330 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61  Show the SQL tha
1a340 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63  t would have occ
1a350 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78  urred",.  "   Ex
1a360 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20  amples:",.  "   
1a370 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76    .ar -cf archiv
1a380 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23  e.sar foo bar  #
1a390 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e   Create archive.
1a3a0 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66  sar from files f
1a3b0 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22  oo and bar",.  "
1a3c0 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63       .ar -tf arc
1a3d0 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20  hive.sar        
1a3e0 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73    # List members
1a3f0 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 22   of archive.sar"
1a400 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78  ,.  "     .ar -x
1a410 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  vf archive.sar  
1a420 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65         # Verbose
1a430 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73  ly extract files
1a440 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61   from archive.sa
1a450 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c  r",.  "   See al
1a460 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68  so:",.  "      h
1a470 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
1a480 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f  /cli.html#sqlar_
1a490 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22  archive_support"
1a4a0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
1a4b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a4c0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
1a4d0 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
1a4e0 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68         Show auth
1a4f0 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73  orizer callbacks
1a500 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  ",.#endif.  ".ba
1a510 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
1a520 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
1a530 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
1a540 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ") to FILE",.  "
1a550 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20         --append 
1a560 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1a570 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20  he appendvfs",. 
1a580 20 22 20 20 20 20 20 20 20 2d 2d 61 73 79 6e 63   "       --async
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
1a5a0 74 65 20 74 6f 20 46 49 4c 45 20 77 69 74 68 6f  te to FILE witho
1a5b0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ut a journal and
1a5c0 20 77 69 74 68 6f 75 74 20 66 73 79 6e 63 28 29   without fsync()
1a5d0 22 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f  ",.  ".bail on|o
1a5e0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ff             S
1a5f0 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e  top after hittin
1a600 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66  g an error.  Def
1a610 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62  ault OFF",.  ".b
1a620 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20  inary on|off    
1a630 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61         Turn bina
1a640 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20  ry output on or 
1a650 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  off.  Default OF
1a660 46 22 2c 0a 20 20 22 2e 63 64 20 44 49 52 45 43  F",.  ".cd DIREC
1a670 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 20 20  TORY            
1a680 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69  Change the worki
1a690 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ng directory to 
1a6a0 44 49 52 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e  DIRECTORY",.  ".
1a6b0 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20  changes on|off  
1a6c0 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d          Show num
1a6d0 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e  ber of rows chan
1a6e0 67 65 64 20 62 79 20 53 51 4c 22 2c 0a 20 20 22  ged by SQL",.  "
1a6f0 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20  .check GLOB     
1a700 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66           Fail if
1a710 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74   output since .t
1a720 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  estcase does not
1a730 20 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f   match",.  ".clo
1a740 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20  ne NEWDB        
1a750 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20       Clone data 
1a760 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20  into NEWDB from 
1a770 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
1a780 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 61 74 61  abase",.  ".data
1a790 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
1a7a0 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
1a7b0 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
1a7c0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 22 2c  ched databases",
1a7d0 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f  .  ".dbconfig ?o
1a7e0 70 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73  p? ?val?     Lis
1a7f0 74 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c 69  t or change sqli
1a800 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20  te3_db_config() 
1a810 6f 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62  options",.  ".db
1a820 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20  info ?DB?       
1a830 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 75        Show statu
1a840 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  s information ab
1a850 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65  out the database
1a860 22 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42  ",.  ".dump ?TAB
1a870 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20 52  LE? ...        R
1a880 65 6e 64 65 72 20 61 6c 6c 20 64 61 74 61 62 61  ender all databa
1a890 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 53 51  se content as SQ
1a8a0 4c 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e  L",.  "   Option
1a8b0 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70  s:",.  "     --p
1a8c0 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 20  reserve-rowids  
1a8d0 20 20 20 20 49 6e 63 6c 75 64 65 20 52 4f 57 49      Include ROWI
1a8e0 44 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  D values in the 
1a8f0 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20  output",.  "    
1a900 20 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20 20   --newlines     
1a910 20 20 20 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e          Allow un
1a920 65 73 63 61 70 65 64 20 6e 65 77 6c 69 6e 65 20  escaped newline 
1a930 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f 75  characters in ou
1a940 74 70 75 74 22 2c 0a 20 20 22 20 20 20 54 41 42  tput",.  "   TAB
1a950 4c 45 20 69 73 20 61 20 4c 49 4b 45 20 70 61 74  LE is a LIKE pat
1a960 74 65 72 6e 20 66 6f 72 20 74 68 65 20 74 61 62  tern for the tab
1a970 6c 65 73 20 74 6f 20 64 75 6d 70 22 2c 0a 20 20  les to dump",.  
1a980 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20  ".echo on|off   
1a990 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
1a9a0 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
1a9b0 72 20 6f 66 66 22 2c 0a 20 20 22 2e 65 71 70 20  r off",.  ".eqp 
1a9c0 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 7c 2e 2e 2e 20  on|off|full|... 
1a9d0 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69      Enable or di
1a9e0 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20  sable automatic 
1a9f0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1aa00 41 4e 22 2c 0a 20 20 22 20 20 20 4f 74 68 65 72  AN",.  "   Other
1aa10 20 4d 6f 64 65 73 3a 22 2c 0a 23 69 66 64 65 66   Modes:",.#ifdef
1aa20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1aa30 22 20 20 20 20 20 20 74 65 73 74 20 20 20 20 20  "      test     
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1aa50 77 20 72 61 77 20 45 58 50 4c 41 49 4e 20 51 55  w raw EXPLAIN QU
1aa60 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75 74 22  ERY PLAN output"
1aa70 2c 0a 20 20 22 20 20 20 20 20 20 74 72 61 63 65  ,.  "      trace
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62   Like \"full\" b
1aaa0 75 74 20 61 6c 73 6f 20 65 6e 61 62 6c 65 20 5c  ut also enable \
1aab0 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61  "PRAGMA vdbe_tra
1aac0 63 65 5c 22 22 2c 0a 23 65 6e 64 69 66 0a 20 20  ce\"",.#endif.  
1aad0 22 20 20 20 20 20 20 74 72 69 67 67 65 72 20 20  "      trigger  
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b               Lik
1aaf0 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20 61  e \"full\" but a
1ab00 6c 73 6f 20 73 68 6f 77 20 74 72 69 67 67 65 72  lso show trigger
1ab10 20 62 79 74 65 63 6f 64 65 22 2c 0a 20 20 22 2e   bytecode",.  ".
1ab20 65 78 63 65 6c 20 20 20 20 20 20 20 20 20 20 20  excel           
1ab30 20 20 20 20 20 20 20 20 44 69 73 70 6c 61 79 20          Display 
1ab40 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6e 65  the output of ne
1ab50 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61 20  xt command in a 
1ab60 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20  spreadsheet",.  
1ab70 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20 20 20  ".exit ?CODE?   
1ab80 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74            Exit t
1ab90 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69 74 68  his program with
1aba0 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43 4f 44   return-code COD
1abb0 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74 20 20  E",.  ".expert  
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75  EXPERIMENTAL. Su
1abe0 67 67 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f  ggest indexes fo
1abf0 72 20 73 70 65 63 69 66 69 65 64 20 71 75 65 72  r specified quer
1ac00 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75 73 65  ies",./* Because
1ac10 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f   explain mode co
1ac20 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63  mes on automatic
1ac30 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e  ally now, the ".
1ac40 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a  explain" mode.**
1ac50 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
1ac60 20 74 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e   the help screen
1ac70 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73  .  It is still s
1ac80 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67  upported for leg
1ac90 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a  acy, however */.
1aca0 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c  /*".explain ?on|
1acb0 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75 72 6e  off|auto?   Turn
1acc0 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 20   EXPLAIN output 
1acd0 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f  mode on or off o
1ace0 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 22 2c  r to automatic",
1acf0 2a 2f 0a 20 20 22 2e 66 69 6c 65 63 74 72 6c 20  */.  ".filectrl 
1ad00 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 20 52  CMD ...        R
1ad10 75 6e 20 76 61 72 69 6f 75 73 20 73 71 6c 69 74  un various sqlit
1ad20 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1ad30 29 20 6f 70 65 72 61 74 69 6f 6e 73 22 2c 0a 20  ) operations",. 
1ad40 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 52 75 6e               Run
1ad60 20 5c 22 2e 66 69 6c 65 63 74 72 6c 5c 22 20 77   \".filectrl\" w
1ad70 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
1ad80 20 66 6f 72 20 64 65 74 61 69 6c 73 22 2c 0a 20   for details",. 
1ad90 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d   ".fullschema ?-
1ada0 2d 69 6e 64 65 6e 74 3f 20 20 20 53 68 6f 77 20  -indent?   Show 
1adb0 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63  schema and the c
1adc0 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65  ontent of sqlite
1add0 5f 73 74 61 74 20 74 61 62 6c 65 73 22 2c 0a 20  _stat tables",. 
1ade0 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66   ".headers on|of
1adf0 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
1ae00 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65  display of heade
1ae10 72 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20  rs on or off",. 
1ae20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f 20 3f   ".help ?-all? ?
1ae30 50 41 54 54 45 52 4e 3f 20 20 20 53 68 6f 77 20  PATTERN?   Show 
1ae40 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20 50 41  help text for PA
1ae50 54 54 45 52 4e 22 2c 0a 20 20 22 2e 69 6d 70 6f  TTERN",.  ".impo
1ae60 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20  rt FILE TABLE   
1ae70 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20      Import data 
1ae80 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54  from FILE into T
1ae90 41 42 4c 45 22 2c 0a 23 69 66 6e 64 65 66 20 53  ABLE",.#ifndef S
1aea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f  QLITE_OMIT_TEST_
1aeb0 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f  CONTROL.  ".impo
1aec0 73 74 65 72 20 49 4e 44 45 58 20 54 41 42 4c 45  ster INDEX TABLE
1aed0 20 20 20 20 43 72 65 61 74 65 20 69 6d 70 6f 73      Create impos
1aee0 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45 20  ter table TABLE 
1aef0 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 22 2c  on index INDEX",
1af00 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64 65  .#endif.  ".inde
1af10 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  xes ?TABLE?     
1af20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
1af30 66 20 69 6e 64 65 78 65 73 22 2c 0a 20 20 22 20  f indexes",.  " 
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
1af60 4c 45 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  LE is specified,
1af70 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78   only show index
1af80 65 73 20 66 6f 72 22 2c 0a 20 20 22 20 20 20 20  es for",.  "    
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afa0 20 20 20 20 20 20 20 74 61 62 6c 65 73 20 6d 61         tables ma
1afb0 74 63 68 69 6e 67 20 54 41 42 4c 45 20 75 73 69  tching TABLE usi
1afc0 6e 67 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ng the LIKE oper
1afd0 61 74 6f 72 2e 22 2c 0a 23 69 66 64 65 66 20 53  ator.",.#ifdef S
1afe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
1aff0 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65  RACE.  ".iotrace
1b000 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1b010 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67   Enable I/O diag
1b020 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74  nostic logging t
1b030 6f 20 46 49 4c 45 22 2c 0a 23 65 6e 64 69 66 0a  o FILE",.#endif.
1b040 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54    ".limit ?LIMIT
1b050 3f 20 3f 56 41 4c 3f 20 20 20 20 20 44 69 73 70  ? ?VAL?     Disp
1b060 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74 68  lay or change th
1b070 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53 51  e value of an SQ
1b080 4c 49 54 45 5f 4c 49 4d 49 54 22 2c 0a 20 20 22  LITE_LIMIT",.  "
1b090 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20 20  .lint OPTIONS   
1b0a0 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74 20           Report 
1b0b0 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d 61  potential schema
1b0c0 20 69 73 73 75 65 73 2e 22 2c 0a 20 20 22 20 20   issues.",.  "  
1b0d0 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1b0e0 22 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e  "        fkey-in
1b0f0 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d  dexes     Find m
1b100 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b  issing foreign k
1b110 65 79 20 69 6e 64 65 78 65 73 22 2c 0a 23 69 66  ey indexes",.#if
1b120 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b130 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
1b140 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45    ".load FILE ?E
1b150 4e 54 52 59 3f 20 20 20 20 20 20 20 4c 6f 61 64  NTRY?       Load
1b160 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69   an extension li
1b170 62 72 61 72 79 22 2c 0a 23 65 6e 64 69 66 0a 20  brary",.#endif. 
1b180 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20   ".log FILE|off 
1b190 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1b1a0 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66  logging on or of
1b1b0 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20  f.  FILE can be 
1b1c0 73 74 64 65 72 72 2f 73 74 64 6f 75 74 22 2c 0a  stderr/stdout",.
1b1d0 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54    ".mode MODE ?T
1b1e0 41 42 4c 45 3f 20 20 20 20 20 20 20 53 65 74 20  ABLE?       Set 
1b1f0 6f 75 74 70 75 74 20 6d 6f 64 65 22 2c 0a 20 20  output mode",.  
1b200 22 20 20 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20  "   MODE is one 
1b210 6f 66 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 73  of:",.  "     as
1b220 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72  cii    Columns/r
1b230 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ows delimited by
1b240 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 22 2c   0x1F and 0x1E",
1b250 0a 20 20 22 20 20 20 20 20 63 73 76 20 20 20 20  .  "     csv    
1b260 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
1b270 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20  d values",.  "  
1b280 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74     column   Left
1b290 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73  -aligned columns
1b2a0 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29 22  .  (See .width)"
1b2b0 2c 0a 20 20 22 20 20 20 20 20 68 74 6d 6c 20 20  ,.  "     html  
1b2c0 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20     HTML <table> 
1b2d0 63 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20 69  code",.  "     i
1b2e0 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65  nsert   SQL inse
1b2f0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f  rt statements fo
1b300 72 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20  r TABLE",.  "   
1b310 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76    line     One v
1b320 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 22 2c 0a  alue per line",.
1b330 20 20 22 20 20 20 20 20 6c 69 73 74 20 20 20 20    "     list    
1b340 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65   Values delimite
1b350 64 20 62 79 20 5c 22 7c 5c 22 22 2c 0a 20 20 22  d by \"|\"",.  "
1b360 20 20 20 20 20 71 75 6f 74 65 20 20 20 20 45 73       quote    Es
1b370 63 61 70 65 20 61 6e 73 77 65 72 73 20 61 73 20  cape answers as 
1b380 66 6f 72 20 53 51 4c 22 2c 0a 20 20 22 20 20 20  for SQL",.  "   
1b390 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d 73    tabs     Tab-s
1b3a0 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 22  eparated values"
1b3b0 2c 0a 20 20 22 20 20 20 20 20 74 63 6c 20 20 20  ,.  "     tcl   
1b3c0 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d     TCL list elem
1b3d0 65 6e 74 73 22 2c 0a 20 20 22 2e 6e 75 6c 6c 76  ents",.  ".nullv
1b3e0 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
1b3f0 20 20 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e     Use STRING in
1b400 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76   place of NULL v
1b410 61 6c 75 65 73 22 2c 0a 20 20 22 2e 6f 6e 63 65  alues",.  ".once
1b420 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20 20   (-e|-x|FILE)   
1b430 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20 74      Output for t
1b440 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d  he next SQL comm
1b450 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45  and only to FILE
1b460 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46 49  ",.  "     If FI
1b470 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68 20 27  LE begins with '
1b480 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 61 73 20  |' then open as 
1b490 61 20 70 69 70 65 22 2c 0a 20 20 22 20 20 20 20  a pipe",.  "    
1b4a0 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73 3a 22   Other options:"
1b4b0 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 65 20 20  ,.  "       -e  
1b4c0 20 20 49 6e 76 6f 6b 65 20 73 79 73 74 65 6d 20    Invoke system 
1b4d0 74 65 78 74 20 65 64 69 74 6f 72 22 2c 0a 20 20  text editor",.  
1b4e0 22 20 20 20 20 20 20 20 2d 78 20 20 20 20 4f 70  "       -x    Op
1b4f0 65 6e 20 69 6e 20 61 20 73 70 72 65 61 64 73 68  en in a spreadsh
1b500 65 65 74 22 2c 0a 20 20 22 2e 6f 70 65 6e 20 3f  eet",.  ".open ?
1b510 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20  OPTIONS? ?FILE? 
1b520 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e 67    Close existing
1b530 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
1b540 6f 70 65 6e 20 46 49 4c 45 22 2c 0a 20 20 22 20  open FILE",.  " 
1b550 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1b560 20 22 20 20 20 20 20 20 20 20 2d 2d 61 70 70 65   "        --appe
1b570 6e 64 20 20 20 20 20 20 20 20 55 73 65 20 61 70  nd        Use ap
1b580 70 65 6e 64 76 66 73 20 74 6f 20 61 70 70 65 6e  pendvfs to appen
1b590 64 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  d database to th
1b5a0 65 20 65 6e 64 20 6f 66 20 46 49 4c 45 22 2c 0a  e end of FILE",.
1b5b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b5c0 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
1b5d0 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 64 65  .  "        --de
1b5e0 73 65 72 69 61 6c 69 7a 65 20 20 20 4c 6f 61 64  serialize   Load
1b5f0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 75 73 65   into memory use
1b600 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65  ing sqlite3_dese
1b610 72 69 61 6c 69 7a 65 28 29 22 2c 0a 20 20 22 20  rialize()",.  " 
1b620 20 20 20 20 20 20 20 2d 2d 68 65 78 64 62 20 20         --hexdb  
1b630 20 20 20 20 20 20 20 4c 6f 61 64 20 74 68 65 20         Load the 
1b640 6f 75 74 70 75 74 20 6f 66 20 5c 22 64 62 74 6f  output of \"dbto
1b650 74 78 74 5c 22 20 61 73 20 61 6e 20 69 6e 2d 6d  txt\" as an in-m
1b660 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 22 2c  emory database",
1b670 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6d 61  .  "        --ma
1b680 78 73 69 7a 65 20 4e 20 20 20 20 20 4d 61 78 69  xsize N     Maxi
1b690 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 2d 2d 68  mum size for --h
1b6a0 65 78 64 62 20 6f 72 20 2d 2d 64 65 73 65 72 69  exdb or --deseri
1b6b0 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73 65 22  alized database"
1b6c0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20  ,.#endif.  "    
1b6d0 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20 20 20      --new       
1b6e0 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 46      Initialize F
1b6f0 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ILE to an empty 
1b700 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20  database",.  "  
1b710 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c 79        --readonly
1b720 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c 45 20        Open FILE 
1b730 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20 20  readonly",.  "  
1b740 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20 20 20        --zip     
1b750 20 20 20 20 20 20 46 49 4c 45 20 69 73 20 61 20        FILE is a 
1b760 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a 20 20  ZIP archive",.  
1b770 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f 20  ".output ?FILE? 
1b780 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f            Send o
1b790 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20 6f 72  utput to FILE or
1b7a0 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c 45 20   stdout if FILE 
1b7b0 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20 22  is omitted",.  "
1b7c0 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65 67       If FILE beg
1b7d0 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68 65  ins with '|' the
1b7e0 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61 20 70  n open it as a p
1b7f0 69 70 65 2e 22 2c 0a 20 20 22 2e 70 61 72 61 6d  ipe.",.  ".param
1b800 65 74 65 72 20 43 4d 44 20 2e 2e 2e 20 20 20 20  eter CMD ...    
1b810 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 70 61     Manage SQL pa
1b820 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
1b830 22 2c 0a 20 20 22 20 20 20 63 6c 65 61 72 20 20  ",.  "   clear  
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 45 72 61 73 65 20 61 6c 6c 20 62 69 6e 64 69   Erase all bindi
1b860 6e 67 73 22 2c 0a 20 20 22 20 20 20 69 6e 69 74  ngs",.  "   init
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74      Initialize t
1b890 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68  he TEMP table th
1b8a0 61 74 20 68 6f 6c 64 73 20 62 69 6e 64 69 6e 67  at holds binding
1b8b0 73 22 2c 0a 20 20 22 20 20 20 6c 69 73 74 20 20  s",.  "   list  
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 4c 69 73 74 20 74 68 65 20 63 75 72 72 65    List the curre
1b8e0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e  nt parameter bin
1b8f0 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 73 65  dings",.  "   se
1b900 74 20 50 41 52 41 4d 45 54 45 52 20 56 41 4c 55  t PARAMETER VALU
1b910 45 20 20 20 20 20 47 69 76 65 6e 20 53 51 4c 20  E     Given SQL 
1b920 70 61 72 61 6d 65 74 65 72 20 50 41 52 41 4d 45  parameter PARAME
1b930 54 45 52 20 61 20 76 61 6c 75 65 20 6f 66 20 56  TER a value of V
1b940 41 4c 55 45 22 2c 0a 20 20 22 20 20 20 20 20 20  ALUE",.  "      
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 50 41 52 41 4d 45 54 45 52 20 73       PARAMETER s
1b970 68 6f 75 6c 64 20 73 74 61 72 74 20 77 69 74 68  hould start with
1b980 20 27 24 27 2c 20 27 3a 27 2c 20 27 40 27 2c 20   '$', ':', '@', 
1b990 6f 72 20 27 3f 27 22 2c 0a 20 20 22 20 20 20 75  or '?'",.  "   u
1b9a0 6e 73 65 74 20 50 41 52 41 4d 45 54 45 52 20 20  nset PARAMETER  
1b9b0 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20 50 41         Remove PA
1b9c0 52 41 4d 45 54 45 52 20 66 72 6f 6d 20 74 68 65  RAMETER from the
1b9d0 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65 22 2c   binding table",
1b9e0 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e  .  ".print STRIN
1b9f0 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50 72 69  G...         Pri
1ba00 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
1ba10 47 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  G",.#ifndef SQLI
1ba20 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
1ba30 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 22 2e 70 72  _CALLBACK.  ".pr
1ba40 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20 20 20  ogress N        
1ba50 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70 72 6f        Invoke pro
1ba60 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 61 66  gress handler af
1ba70 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70 63 6f  ter every N opco
1ba80 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6c 69  des",.  "   --li
1ba90 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20 20 20  mit N           
1baa0 20 20 20 20 20 20 49 6e 74 65 72 72 75 70 74 20        Interrupt 
1bab0 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65 73 73  after N progress
1bac0 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20 20 22   callbacks",.  "
1bad0 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20 20 20     --once       
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f 20               Do 
1baf0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
1bb00 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65 72 72   progress interr
1bb10 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d 71 75  upt",.  "   --qu
1bb20 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20 20 20  iet|-q          
1bb30 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75 74 20        No output 
1bb40 65 78 63 65 70 74 20 61 74 20 69 6e 74 65 72 72  except at interr
1bb50 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d 2d 72  upts",.  "   --r
1bb60 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
1bb70 20 20 20 20 20 20 20 52 65 73 65 74 20 74 68 65         Reset the
1bb80 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63 68 20   count for each 
1bb90 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65 72 72  input and interr
1bba0 75 70 74 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  upt",.#endif.  "
1bbb0 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e  .prompt MAIN CON
1bbc0 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61 63 65  TINUE    Replace
1bbd0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72   the standard pr
1bbe0 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75 69 74  ompts",.  ".quit
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72      Exit this pr
1bc10 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65 61 64  ogram",.  ".read
1bc20 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1bc30 20 20 20 20 52 65 61 64 20 69 6e 70 75 74 20 66      Read input f
1bc40 72 6f 6d 20 46 49 4c 45 22 2c 0a 23 69 66 20 21  rom FILE",.#if !
1bc50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bc60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1bc70 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1bc80 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
1bc90 45 5f 56 54 41 42 29 0a 20 20 22 2e 72 65 63 6f  E_VTAB).  ".reco
1bca0 76 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ver             
1bcb0 20 20 20 20 52 65 63 6f 76 65 72 20 61 73 20 6d      Recover as m
1bcc0 75 63 68 20 64 61 74 61 20 61 73 20 70 6f 73 73  uch data as poss
1bcd0 69 62 6c 65 20 66 72 6f 6d 20 63 6f 72 72 75 70  ible from corrup
1bce0 74 20 64 62 2e 22 2c 0a 23 65 6e 64 69 66 0a 20  t db.",.#endif. 
1bcf0 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20   ".restore ?DB? 
1bd00 46 49 4c 45 20 20 20 20 20 20 20 52 65 73 74 6f  FILE       Resto
1bd10 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42  re content of DB
1bd20 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
1bd30 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a  \") from FILE",.
1bd40 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20    ".save FILE   
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
1bd60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
1bd70 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c  base into FILE",
1bd80 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f  .  ".scanstats o
1bd90 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75 72  n|off        Tur
1bda0 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  n sqlite3_stmt_s
1bdb0 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72  canstatus() metr
1bdc0 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ics on or off",.
1bdd0 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54    ".schema ?PATT
1bde0 45 52 4e 3f 20 20 20 20 20 20 20 20 53 68 6f 77  ERN?        Show
1bdf0 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
1be00 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20  ements matching 
1be10 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 20 20 20  PATTERN",.  "   
1be20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1be30 20 20 20 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e           --inden
1be40 74 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79  t            Try
1be50 20 74 6f 20 70 72 65 74 74 79 2d 70 72 69 6e 74   to pretty-print
1be60 20 74 68 65 20 73 63 68 65 6d 61 22 2c 0a 20 20   the schema",.  
1be70 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f 50 54 49  ".selftest ?OPTI
1be80 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e 20 74 65  ONS?      Run te
1be90 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  sts defined in t
1bea0 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  he SELFTEST tabl
1beb0 65 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f  e",.  "    Optio
1bec0 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
1bed0 2d 2d 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  --init          
1bee0 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65       Create a ne
1bef0 77 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  w SELFTEST table
1bf00 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 76 20  ",.  "       -v 
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74    Verbose output
1bf30 22 2c 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72  ",.  ".separator
1bf40 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43   COL ?ROW?     C
1bf50 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e  hange the column
1bf60 20 61 6e 64 20 72 6f 77 20 73 65 70 61 72 61 74   and row separat
1bf70 6f 72 73 22 2c 0a 23 69 66 20 64 65 66 69 6e 65  ors",.#if define
1bf80 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1bf90 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73  SESSION).  ".ses
1bfa0 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20  sion ?NAME? CMD 
1bfb0 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f 72 20 63  ...  Create or c
1bfc0 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22  ontrol sessions"
1bfd0 2c 0a 20 20 22 20 20 20 53 75 62 63 6f 6d 6d 61  ,.  "   Subcomma
1bfe0 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 61  nds:",.  "     a
1bff0 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20 20  ttach TABLE     
1c000 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20 54          Attach T
1c010 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63  ABLE",.  "     c
1c020 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20  hangeset FILE   
1c030 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
1c040 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46  changeset into F
1c050 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63 6c  ILE",.  "     cl
1c060 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
1c070 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65         Close one
1c080 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20   session",.  "  
1c090 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45     enable ?BOOLE
1c0a0 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74 20  AN?         Set 
1c0b0 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e 61  or query the ena
1c0c0 62 6c 65 20 62 69 74 22 2c 0a 20 20 22 20 20 20  ble bit",.  "   
1c0d0 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e    filter GLOB...
1c0e0 20 20 20 20 20 20 20 20 20 20 20 52 65 6a 65 63             Rejec
1c0f0 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  t tables matchin
1c100 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20  g GLOBs",.  "   
1c110 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c    indirect ?BOOL
1c120 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20  EAN?       Mark 
1c130 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e 64  or query the ind
1c140 69 72 65 63 74 20 73 74 61 74 75 73 22 2c 0a 20  irect status",. 
1c150 20 22 20 20 20 20 20 69 73 65 6d 70 74 79 20 20   "     isempty  
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74 68  Query whether th
1c180 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70  e session is emp
1c190 74 79 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73  ty",.  "     lis
1c1a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c1b0 20 20 20 20 20 20 4c 69 73 74 20 63 75 72 72 65        List curre
1c1c0 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f  ntly open sessio
1c1d0 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20 20  n names",.  "   
1c1e0 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20    open DB NAME  
1c1f0 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20             Open 
1c200 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e  a new session on
1c210 20 44 42 22 2c 0a 20 20 22 20 20 20 20 20 70 61   DB",.  "     pa
1c220 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20 20  tchset FILE     
1c230 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20 70         Write a p
1c240 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c  atchset into FIL
1c250 45 22 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e 41  E",.  "   If ?NA
1c260 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20  ME? is omitted, 
1c270 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e 65  the first define
1c280 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65  d session is use
1c290 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  d.",.#endif.  ".
1c2a0 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20  sha3sum ...     
1c2b0 20 20 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20          Compute 
1c2c0 61 20 53 48 41 33 20 68 61 73 68 20 6f 66 20 64  a SHA3 hash of d
1c2d0 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 22  atabase content"
1c2e0 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73  ,.  "    Options
1c2f0 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  :",.  "      --s
1c300 63 68 65 6d 61 20 20 20 20 20 20 20 20 20 20 20  chema           
1c310 20 20 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65     Also hash the
1c320 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1c330 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20  able",.  "      
1c340 2d 2d 73 68 61 33 2d 32 32 34 20 20 20 20 20 20  --sha3-224      
1c350 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1c360 61 33 2d 32 32 34 20 61 6c 67 6f 72 69 74 68 6d  a3-224 algorithm
1c370 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68  ",.  "      --sh
1c380 61 33 2d 32 35 36 20 20 20 20 20 20 20 20 20 20  a3-256          
1c390 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 32    Use the sha3-2
1c3a0 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54  56 algorithm.  T
1c3b0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
1c3c0 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  lt.",.  "      -
1c3d0 2d 73 68 61 33 2d 33 38 34 20 20 20 20 20 20 20  -sha3-384       
1c3e0 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61       Use the sha
1c3f0 33 2d 33 38 34 20 61 6c 67 6f 72 69 74 68 6d 22  3-384 algorithm"
1c400 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61  ,.  "      --sha
1c410 33 2d 35 31 32 20 20 20 20 20 20 20 20 20 20 20  3-512           
1c420 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 35 31   Use the sha3-51
1c430 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20  2 algorithm",.  
1c440 22 20 20 20 20 41 6e 79 20 6f 74 68 65 72 20 61  "    Any other a
1c450 72 67 75 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b  rgument is a LIK
1c460 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 61  E pattern for ta
1c470 62 6c 65 73 20 74 6f 20 68 61 73 68 22 2c 0a 23  bles to hash",.#
1c480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1c490 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
1c4a0 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e  shell CMD ARGS..
1c4b0 2e 20 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20  .       Run CMD 
1c4c0 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
1c4d0 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64  tem shell",.#end
1c4e0 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20  if.  ".show     
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1c500 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
1c510 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f  values for vario
1c520 75 73 20 73 65 74 74 69 6e 67 73 22 2c 0a 20 20  us settings",.  
1c530 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f  ".stats ?on|off?
1c540 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73            Show s
1c550 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61  tats or turn sta
1c560 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23  ts on or off",.#
1c570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1c580 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
1c590 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e  system CMD ARGS.
1c5a0 2e 2e 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20  ..      Run CMD 
1c5b0 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
1c5c0 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64  tem shell",.#end
1c5d0 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  if.  ".tables ?T
1c5e0 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 20 4c  ABLE?          L
1c5f0 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62  ist names of tab
1c600 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b  les matching LIK
1c610 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 22  E pattern TABLE"
1c620 2c 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e  ,.  ".testcase N
1c630 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 42 65  AME           Be
1c640 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20  gin redirecting 
1c650 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74 63  output to 'testc
1c660 61 73 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20  ase-out.txt'",. 
1c670 20 22 2e 74 65 73 74 63 74 72 6c 20 43 4d 44 20   ".testctrl CMD 
1c680 2e 2e 2e 20 20 20 20 20 20 20 20 52 75 6e 20 76  ...        Run v
1c690 61 72 69 6f 75 73 20 73 71 6c 69 74 65 33 5f 74  arious sqlite3_t
1c6a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 20 6f 70  est_control() op
1c6b0 65 72 61 74 69 6f 6e 73 22 2c 0a 20 20 22 20 20  erations",.  "  
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 20 20 20 20 20 52 75 6e 20 5c 22 2e           Run \".
1c6e0 74 65 73 74 63 74 72 6c 5c 22 20 77 69 74 68 20  testctrl\" with 
1c6f0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
1c700 20 64 65 74 61 69 6c 73 22 2c 0a 20 20 22 2e 74   details",.  ".t
1c710 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20  imeout MS       
1c720 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
1c730 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
1c740 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
1c750 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65 72  onds",.  ".timer
1c760 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
1c770 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65     Turn SQL time
1c780 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69  r on or off",.#i
1c790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c7a0 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72 61 63  T_TRACE.  ".trac
1c7b0 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20  e ?OPTIONS?     
1c7c0 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68 20      Output each 
1c7d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73  SQL statement as
1c7e0 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20 20 22   it is run",.  "
1c7f0 20 20 20 20 46 49 4c 45 20 20 20 20 20 20 20 20      FILE        
1c800 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64              Send
1c810 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 22   output to FILE"
1c820 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75 74 20  ,.  "    stdout 
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
1c850 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20 20 20  stdout",.  "    
1c860 73 74 64 65 72 72 20 20 20 20 20 20 20 20 20 20  stderr          
1c870 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1c880 70 75 74 20 74 6f 20 73 74 64 65 72 72 22 2c 0a  put to stderr",.
1c890 20 20 22 20 20 20 20 6f 66 66 20 20 20 20 20 20    "    off      
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1c8b0 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 22 2c  isable tracing",
1c8c0 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61 6e 64  .  "    --expand
1c8d0 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
1c8e0 45 78 70 61 6e 64 20 71 75 65 72 79 20 70 61 72  Expand query par
1c8f0 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64 65 66  ameters",.#ifdef
1c900 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
1c910 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20 20 20  ORMALIZE.  "    
1c920 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20 20 20  --normalized    
1c930 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 74          Normal t
1c940 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c950 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  s",.#endif.  "  
1c960 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20 20 20    --plain       
1c970 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 53            Show S
1c980 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e 70 75  QL as it is inpu
1c990 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73 74 6d  t",.  "    --stm
1c9a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c9b0 20 20 20 54 72 61 63 65 20 73 74 61 74 65 6d 65     Trace stateme
1c9c0 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 53 51  nt execution (SQ
1c9d0 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 29  LITE_TRACE_STMT)
1c9e0 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72 6f 66  ",.  "    --prof
1c9f0 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ile             
1ca00 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74 65 6d    Profile statem
1ca10 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54 52 41  ents (SQLITE_TRA
1ca20 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a 20 20  CE_PROFILE)",.  
1ca30 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20 20 20  "    --row      
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1ca50 63 65 20 65 61 63 68 20 72 6f 77 20 28 53 51 4c  ce each row (SQL
1ca60 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29 22 2c  ITE_TRACE_ROW)",
1ca70 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73 65 20  .  "    --close 
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Trace connection
1caa0 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45 5f 54   close (SQLITE_T
1cab0 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a 23 65  RACE_CLOSE)",.#e
1cac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1cad0 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 23 69 66  MIT_TRACE */.#if
1cae0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1caf0 0a 20 20 22 2e 75 6e 6d 6f 64 75 6c 65 20 4e 41  .  ".unmodule NA
1cb00 4d 45 20 2e 2e 2e 20 20 20 20 20 20 20 55 6e 72  ME ...       Unr
1cb10 65 67 69 73 74 65 72 20 76 69 72 74 75 61 6c 20  egister virtual 
1cb20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 73 22 2c 0a  table modules",.
1cb30 23 65 6e 64 69 66 0a 20 20 22 2e 76 66 73 69 6e  #endif.  ".vfsin
1cb40 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  fo ?AUX?        
1cb50 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     Information a
1cb60 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  bout the top-lev
1cb70 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73  el VFS",.  ".vfs
1cb80 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1cb90 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76       List all av
1cba0 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a  ailable VFSes",.
1cbb0 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58    ".vfsname ?AUX
1cbc0 3f 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e  ?           Prin
1cbd0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
1cbe0 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20  e VFS stack",.  
1cbf0 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d  ".width NUM1 NUM
1cc00 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f  2 ...     Set co
1cc10 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
1cc20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22  \"column\" mode"
1cc30 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74 69  ,.  "     Negati
1cc40 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d  ve values right-
1cc50 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a  justify",.};../*
1cc60 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20  .** Output help 
1cc70 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74  text..**.** zPat
1cc80 74 65 72 6e 20 64 65 73 63 72 69 62 65 73 20 74  tern describes t
1cc90 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e  he set of comman
1cca0 64 73 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c  ds for which hel
1ccb0 70 20 74 65 78 74 20 69 73 20 70 72 6f 76 69 64  p text is provid
1ccc0 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65  ed..** If zPatte
1ccd0 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rn is NULL, then
1cce0 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e   show all comman
1ccf0 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76  ds, but only giv
1cd00 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20  e a one-line.** 
1cd10 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65  description of e
1cd20 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ach..**.** Retur
1cd30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1cd40 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
1cd50 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28  ic int showHelp(
1cd60 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
1cd70 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29   char *zPattern)
1cd80 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1cd90 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e   int j = 0;.  in
1cda0 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  t n = 0;.  char 
1cdb0 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61  *zPat;.  if( zPa
1cdc0 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a  ttern==0.   || z
1cdd0 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a  Pattern[0]=='0'.
1cde0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61     || strcmp(zPa
1cdf0 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20  ttern,"-a")==0. 
1ce00 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74    || strcmp(zPat
1ce10 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a  tern,"-all")==0.
1ce20 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77    ){.    /* Show
1ce30 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1ce40 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65  ut only one line
1ce50 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   per command */.
1ce60 20 20 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e      if( zPattern
1ce70 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d  ==0 ) zPattern =
1ce80 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   "";.    for(i=0
1ce90 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ; i<ArraySize(az
1cea0 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Help); i++){.   
1ceb0 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d     if( azHelp[i]
1cec0 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74  [0]=='.' || zPat
1ced0 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20  tern[0] ){.     
1cee0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1cef0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1cf00 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[i]);.        
1cf10 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1cf20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1cf30 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1cf40 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77 68  ands that for wh
1cf50 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20  ich zPattern is 
1cf60 61 6e 20 65 78 61 63 74 20 70 72 65 66 69 78 20  an exact prefix 
1cf70 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1cf80 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e  lite3_mprintf(".
1cf90 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b  %s*", zPattern);
1cfa0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1cfb0 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1cfc0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1cfd0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1cfe0 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b  ob(zPat, azHelp[
1cff0 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1d000 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1d010 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1d020 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a  p[i]);.        j
1d030 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
1d040 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1d050 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1d060 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69  ree(zPat);.    i
1d070 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  f( n ){.      if
1d080 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( n==1 ){.      
1d090 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65    /* when zPatte
1d0a0 72 6e 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rn is a prefix o
1d0b0 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f  f exactly one co
1d0c0 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c  mmand, then incl
1d0d0 75 64 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ude the.        
1d0e0 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68  ** details of th
1d0f0 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63  at command, whic
1d100 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61  h should begin a
1d110 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20  t offset j */.  
1d120 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41        while( j<A
1d130 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1d140 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b  -1 && azHelp[j][
1d150 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]!='.' ){.     
1d160 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1d170 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1d180 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1d190 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
1d1a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d1b0 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d   return n;.    }
1d1c0 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
1d1d0 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63   commands that c
1d1e0 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20  ontain zPattern 
1d1f0 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20  anywhere.  Show 
1d200 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  the complete.   
1d210 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20   ** text of all 
1d220 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61  commands that ma
1d230 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74  tch. */.    zPat
1d240 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d250 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61  tf("%%%s%%", zPa
1d260 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1d270 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1d280 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1d290 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70        if( azHelp
1d2a0 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20  [i][0]=='.' ) j 
1d2b0 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = i;.      if( s
1d2c0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
1d2d0 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20  Pat, azHelp[i], 
1d2e0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
1d2f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1d300 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1d310 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68  [j]);.        wh
1d320 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ile( j<ArraySize
1d330 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a  (azHelp)-1 && az
1d340 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e  Help[j+1][0]!='.
1d350 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ' ){.          j
1d360 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  ++;.          ut
1d370 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1d380 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d  %s\n", azHelp[j]
1d390 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d3a0 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20       i = j;.    
1d3b0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
1d3c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d3d0 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20  e3_free(zPat);. 
1d3e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1d3f0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1d400 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
1d410 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70   int process_inp
1d420 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ut(ShellState *p
1d430 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  );../*.** Read t
1d440 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  he content of fi
1d450 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65  le zName into me
1d460 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1d470 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
1d480 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74  c64().** and ret
1d490 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1d4a0 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65   the buffer. The
1d4b0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1d4c0 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
1d4d0 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  ng.** the memory
1d4e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1d4f0 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e  eter pnByte is n
1d500 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74  ot NULL, (*pnByt
1d510 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  e) is set to the
1d520 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1d530 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  .** read..**.** 
1d540 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c  For convenience,
1d550 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f   a nul-terminato
1d560 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73  r byte is always
1d570 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1d580 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72   data read.** fr
1d590 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  om the file befo
1d5a0 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73  re the buffer is
1d5b0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
1d5c0 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c  byte is not incl
1d5d0 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66  uded in.** the f
1d5e0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a  inal value of (*
1d5f0 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c  pnByte), if appl
1d600 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55  icable..**.** NU
1d610 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1d620 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
1d630 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20  ncountered. The 
1d640 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
1d650 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64  pnByte.** is und
1d660 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
1d670 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
1d680 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f  har *readFile(co
1d690 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1d6a0 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20   int *pnByte){. 
1d6b0 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65   FILE *in = fope
1d6c0 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  n(zName, "rb");.
1d6d0 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69    long nIn;.  si
1d6e0 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68  ze_t nRead;.  ch
1d6f0 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20  ar *pBuf;.  if( 
1d700 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  in==0 ) return 0
1d710 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
1d720 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49   SEEK_END);.  nI
1d730 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20  n = ftell(in);. 
1d740 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70   rewind(in);.  p
1d750 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
1d760 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b  lloc64( nIn+1 );
1d770 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
1d780 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65  { fclose(in); re
1d790 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61  turn 0; }.  nRea
1d7a0 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
1d7b0 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66  nIn, 1, in);.  f
1d7c0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
1d7d0 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20   nRead!=1 ){.   
1d7e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
1d7f0 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
1d800 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49  0;.  }.  pBuf[nI
1d810 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  n] = 0;.  if( pn
1d820 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
1d830 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70   nIn;.  return p
1d840 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Buf;.}..#if defi
1d850 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d860 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
1d870 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20   Close a single 
1d880 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
1d890 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ct and release a
1d8a0 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69  ll of its associ
1d8b0 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65  ated.** resource
1d8c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d8d0 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28  d session_close(
1d8e0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1d8f0 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  ssion){.  int i;
1d900 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
1d910 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f  n_delete(pSessio
1d920 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->p);.  sqlite3
1d930 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1d940 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
1d950 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
1d960 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
1d970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d980 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1d990 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r[i]);.  }.  sql
1d9a0 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1d9b0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
1d9c0 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e   memset(pSession
1d9d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e  , 0, sizeof(Open
1d9e0 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e  Session));.}.#en
1d9f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
1da00 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e   all OpenSession
1da10 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c   objects and rel
1da20 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61  ease all associa
1da30 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ted resources..*
1da40 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1da50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1da60 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64  ION).static void
1da70 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
1da80 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ll(ShellState *p
1da90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1daa0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
1dab0 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
1dac0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70  session_close(&p
1dad0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a  ->aSession[i]);.
1dae0 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f    }.  p->nSessio
1daf0 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  n = 0;.}.#else.#
1db00 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f   define session_
1db10 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e  close_all(X).#en
1db20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  dif../*.** Imple
1db30 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1db40 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f   xFilter functio
1db50 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65  n for an open se
1db60 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20  ssion.  Omit.** 
1db70 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64  any tables named
1db80 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69   by ".session fi
1db90 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c  lter" but let al
1dba0 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68  l other table th
1dbb0 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65  rough..*/.#if de
1dbc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1dbd0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1dbe0 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f  tic int session_
1dbf0 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74  filter(void *pCt
1dc00 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x, const char *z
1dc10 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73  Tab){.  OpenSess
1dc20 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
1dc30 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43  (OpenSession*)pC
1dc40 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  tx;.  int i;.  f
1dc50 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1dc60 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1dc70 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1dc80 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73  e3_strglob(pSess
1dc90 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1dca0 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , zTab)==0 ) ret
1dcb0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1dcc0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
1dcd0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  ./*.** Try to de
1dce0 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66  duce the type of
1dcf0 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20   file for zName 
1dd00 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e  based on its con
1dd10 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tent.  Return.**
1dd20 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c   one of the SHEL
1dd30 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e  L_OPEN_* constan
1dd40 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1dd50 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1dd60 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79  xist or is empty
1dd70 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f   but its name lo
1dd80 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a  oks like a ZIP.*
1dd90 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20 74 68  * archive and th
1dda0 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69  e dfltZip flag i
1ddb0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73  s true, then ass
1ddc0 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50 20  ume it is a ZIP 
1ddd0 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65  archive..** Othe
1dde0 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e  rwise, assume an
1ddf0 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62 61   ordinary databa
1de00 73 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  se regardless of
1de10 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66   the filename if
1de20 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e  .** the type can
1de30 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  not be determine
1de40 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a  d from content..
1de50 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74  */.int deduceDat
1de60 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20  abaseType(const 
1de70 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1de80 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c   dfltZip){.  FIL
1de90 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61  E *f = fopen(zNa
1dea0 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a  me, "rb");.  siz
1deb0 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20  e_t n;.  int rc 
1dec0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
1ded0 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  PEC;.  char zBuf
1dee0 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d  [100];.  if( f==
1def0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c  0 ){.    if( dfl
1df00 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f  tZip && sqlite3_
1df10 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c  strlike("%.zip",
1df20 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  zName,0)==0 ){. 
1df30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45        return SHE
1df40 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
1df50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1df60 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f     return SHELL_
1df70 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  OPEN_NORMAL;.   
1df80 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65   }.  }.  n = fre
1df90 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20  ad(zBuf, 16, 1, 
1dfa0 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
1dfb0 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
1dfc0 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22  SQLite format 3"
1dfd0 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 16)==0 ){.    
1dfe0 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72  fclose(f);.    r
1dff0 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1e000 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66  _NORMAL;.  }.  f
1e010 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45  seek(f, -25, SEE
1e020 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72  K_END);.  n = fr
1e030 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c  ead(zBuf, 25, 1,
1e040 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20   f);.  if( n==1 
1e050 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  && memcmp(zBuf, 
1e060 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65  "Start-Of-SQLite
1e070 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  3-", 17)==0 ){. 
1e080 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1e090 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
1e0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b  }else{.    fseek
1e0b0 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e  (f, -22, SEEK_EN
1e0c0 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  D);.    n = frea
1e0d0 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66  d(zBuf, 22, 1, f
1e0e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20  );.    if( n==1 
1e0f0 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30  && zBuf[0]==0x50
1e100 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34   && zBuf[1]==0x4
1e110 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78  b && zBuf[2]==0x
1e120 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75  05.       && zBu
1e130 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20  f[3]==0x06 ){.  
1e140 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1e150 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1e160 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
1e170 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71  && dfltZip && sq
1e180 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
1e190 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d  .zip",zName,0)==
1e1a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e1b0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1e1c0 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
1e1d0 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74  fclose(f);.  ret
1e1e0 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66  urn rc;  .}..#if
1e1f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e200 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a  E_DESERIALIZE./*
1e210 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20  .** Reconstruct 
1e220 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1e230 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1e240 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
1e250 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f  "dbtotxt".** pro
1e260 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74  gram.  Read cont
1e270 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ent from the fil
1e280 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  e in p->zDbFilen
1e290 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46  ame.  If p->zDbF
1e2a0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c  ilename.** is 0,
1e2b0 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   then read from 
1e2c0 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a  standard input..
1e2d0 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
1e2e0 65 64 20 63 68 61 72 20 2a 72 65 61 64 48 65 78  ed char *readHex
1e2f0 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  Db(ShellState *p
1e300 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a  , int *pnData){.
1e310 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e320 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c  *a = 0;.  int nL
1e330 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ine;.  int n = 0
1e340 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30  ;.  int pgsz = 0
1e350 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20  ;.  int iOffset 
1e360 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  = 0;.  int j, k;
1e370 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c  .  int rc;.  FIL
1e380 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  E *in;.  unsigne
1e390 64 20 69 6e 74 20 78 5b 31 36 5d 3b 0a 20 20 63  d int x[16];.  c
1e3a0 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b  har zLine[1000];
1e3b0 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c  .  if( p->zDbFil
1e3c0 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20  ename ){.    in 
1e3d0 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  = fopen(p->zDbFi
1e3e0 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20  lename, "r");.  
1e3f0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1e400 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1e410 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
1e420 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
1e430 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e   reading\n", p->
1e440 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
1e450 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e460 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20    }.    nLine = 
1e470 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e480 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20  in = p->in;.    
1e490 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e  nLine = p->linen
1e4a0 6f 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  o;.    if( in==0
1e4b0 20 29 20 69 6e 20 3d 20 73 74 64 69 6e 3b 0a 20   ) in = stdin;. 
1e4c0 20 7d 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30   }.  *pnData = 0
1e4d0 3b 0a 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 69  ;.  nLine++;.  i
1e4e0 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  f( fgets(zLine, 
1e4f0 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69  sizeof(zLine), i
1e500 6e 29 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65 61  n)==0 ) goto rea
1e510 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20  dHexDb_error;.  
1e520 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e  rc = sscanf(zLin
1e530 65 2c 20 22 7c 20 73 69 7a 65 20 25 64 20 70 61  e, "| size %d pa
1e540 67 65 73 69 7a 65 20 25 64 22 2c 20 26 6e 2c 20  gesize %d", &n, 
1e550 26 70 67 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  &pgsz);.  if( rc
1e560 21 3d 32 20 29 20 67 6f 74 6f 20 72 65 61 64 48  !=2 ) goto readH
1e570 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 69 66  exDb_error;.  if
1e580 28 20 6e 3c 30 20 29 20 67 6f 74 6f 20 72 65 61  ( n<0 ) goto rea
1e590 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20  dHexDb_error;.  
1e5a0 69 66 28 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20  if( pgsz<512 || 
1e5b0 70 67 73 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70  pgsz>65536 || (p
1e5c0 67 73 7a 26 28 70 67 73 7a 2d 31 29 29 21 3d 30  gsz&(pgsz-1))!=0
1e5d0 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44   ) goto readHexD
1e5e0 62 5f 65 72 72 6f 72 3b 0a 20 20 6e 20 3d 20 28  b_error;.  n = (
1e5f0 6e 2b 70 67 73 7a 2d 31 29 26 7e 28 70 67 73 7a  n+pgsz-1)&~(pgsz
1e600 2d 31 29 3b 20 20 2f 2a 20 52 6f 75 6e 64 20 6e  -1);  /* Round n
1e610 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1e620 6d 75 6c 74 69 70 6c 65 20 6f 66 20 70 67 73 7a  multiple of pgsz
1e630 20 2a 2f 0a 20 20 61 20 3d 20 73 71 6c 69 74 65   */.  a = sqlite
1e640 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 3f 20 6e 20  3_malloc( n ? n 
1e650 3a 20 31 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d  : 1 );.  if( a==
1e660 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
1e670 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 75  intf(stderr, "Ou
1e680 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29  t of memory!\n")
1e690 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e6a0 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e6b0 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 6e    memset(a, 0, n
1e6c0 29 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35 31  );.  if( pgsz<51
1e6d0 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36 20  2 || pgsz>65536 
1e6e0 7c 7c 20 28 70 67 73 7a 20 26 20 28 70 67 73 7a  || (pgsz & (pgsz
1e6f0 2d 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 75  -1))!=0 ){.    u
1e700 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e710 72 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  r, "invalid page
1e720 73 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  size\n");.    go
1e730 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e740 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 4c  or;.  }.  for(nL
1e750 69 6e 65 2b 2b 3b 20 66 67 65 74 73 28 7a 4c 69  ine++; fgets(zLi
1e760 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
1e770 29 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69 6e 65  ), in)!=0; nLine
1e780 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 73  ++){.    rc = ss
1e790 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 70  canf(zLine, "| p
1e7a0 61 67 65 20 25 64 20 6f 66 66 73 65 74 20 25 64  age %d offset %d
1e7b0 22 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20  ", &j, &k);.    
1e7c0 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20  if( rc==2 ){.   
1e7d0 20 20 20 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a     iOffset = k;.
1e7e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e7f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
1e800 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20  rncmp(zLine, "| 
1e810 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 7b 0a  end ", 6)==0 ){.
1e820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e830 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61   }.    rc = ssca
1e840 6e 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64 3a 20  nf(zLine,"| %d: 
1e850 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e860 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e870 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 22   %x %x %x %x %x"
1e880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e890 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b    &j, &x[0], &x[
1e8a0 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d  1], &x[2], &x[3]
1e8b0 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20  , &x[4], &x[5], 
1e8c0 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20  &x[6], &x[7],.  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 78                &x
1e8e0 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31  [8], &x[9], &x[1
1e8f0 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31  0], &x[11], &x[1
1e900 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31  2], &x[13], &x[1
1e910 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20  4], &x[15]);.   
1e920 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20   if( rc==17 ){. 
1e930 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74       k = iOffset
1e940 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b  +j;.      if( k+
1e950 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  16<=n ){.       
1e960 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1e970 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 31 36   for(ii=0; ii<16
1e980 3b 20 69 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20  ; ii++) a[k+ii] 
1e990 3d 20 78 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20  = x[ii]&0xff;.  
1e9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e9b0 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e 3b 0a 20    *pnData = n;. 
1e9c0 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29   if( in!=p->in )
1e9d0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1e9e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e9f0 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65  ->lineno = nLine
1ea00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
1ea10 3b 0a 0a 72 65 61 64 48 65 78 44 62 5f 65 72 72  ;..readHexDb_err
1ea20 6f 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d 70 2d  or:.  if( in!=p-
1ea30 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  >in ){.    fclos
1ea40 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(in);.  }else{.
1ea50 20 20 20 20 77 68 69 6c 65 28 20 66 67 65 74 73      while( fgets
1ea60 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
1ea70 4c 69 6e 65 29 2c 20 70 2d 3e 69 6e 29 21 3d 30  Line), p->in)!=0
1ea80 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b   ){.      nLine+
1ea90 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 74 72 6e  +;.      if(strn
1eaa0 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e  cmp(zLine, "| en
1eab0 64 20 22 2c 20 36 29 3d 3d 30 20 29 20 62 72 65  d ", 6)==0 ) bre
1eac0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ak;.    }.    p-
1ead0 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65 3b  >lineno = nLine;
1eae0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1eaf0 72 65 65 28 61 29 3b 0a 20 20 75 74 66 38 5f 70  ree(a);.  utf8_p
1eb00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
1eb10 72 6f 72 20 6f 6e 20 6c 69 6e 65 20 25 64 20 6f  ror on line %d o
1eb20 66 20 2d 2d 68 65 78 64 62 20 69 6e 70 75 74 5c  f --hexdb input\
1eb30 6e 22 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 72 65  n", nLine);.  re
1eb40 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1eb50 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1eb60 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f  E_DESERIALIZE */
1eb70 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66  ../*.** Scalar f
1eb80 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 69  unction "shell_i
1eb90 6e 74 33 32 22 2e 20 54 68 65 20 66 69 72 73 74  nt32". The first
1eba0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1ebb0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
1ebc0 73 74 20 62 65 20 61 20 62 6c 6f 62 2e 20 54 68  st be a blob. Th
1ebd0 65 20 73 65 63 6f 6e 64 20 61 20 6e 6f 6e 2d 6e  e second a non-n
1ebe0 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
1ebf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
1ec00 2a 20 72 65 61 64 73 20 61 6e 64 20 72 65 74 75  * reads and retu
1ec10 72 6e 73 20 61 20 33 32 2d 62 69 74 20 62 69 67  rns a 32-bit big
1ec20 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1ec30 66 72 6f 6d 20 62 79 74 65 0a 2a 2a 20 6f 66 66  from byte.** off
1ec40 73 65 74 20 28 34 2a 3c 61 72 67 32 3e 29 20 6f  set (4*<arg2>) o
1ec50 66 20 74 68 65 20 62 6c 6f 62 2e 0a 2a 2f 0a 73  f the blob..*/.s
1ec60 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
1ec70 49 6e 74 33 32 28 0a 20 20 73 71 6c 69 74 65 33  Int32(.  sqlite3
1ec80 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1ec90 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
1eca0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1ecb0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
1ecc0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ecd0 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e   *pBlob;.  int n
1ece0 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 49 6e 74  Blob;.  int iInt
1ecf0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
1ed00 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
1ed10 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
1ed20 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1ed30 30 5d 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28  0]);.  pBlob = (
1ed40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ed50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1ed60 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
1ed70 3b 0a 20 20 69 49 6e 74 20 3d 20 73 71 6c 69 74  ;.  iInt = sqlit
1ed80 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
1ed90 76 5b 31 5d 29 3b 0a 0a 20 20 69 66 28 20 69 49  v[1]);..  if( iI
1eda0 6e 74 3e 3d 30 20 26 26 20 28 69 49 6e 74 2b 31  nt>=0 && (iInt+1
1edb0 29 2a 34 3c 3d 6e 42 6c 6f 62 20 29 7b 0a 20 20  )*4<=nBlob ){.  
1edc0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1edd0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 42 6c 6f   char *a = &pBlo
1ede0 62 5b 69 49 6e 74 2a 34 5d 3b 0a 20 20 20 20 73  b[iInt*4];.    s
1edf0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
1ee00 6c 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  l = ((sqlite3_in
1ee10 74 36 34 29 61 5b 30 5d 3c 3c 32 34 29 0a 20 20  t64)a[0]<<24).  
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33       + ((sqlite3
1ee40 5f 69 6e 74 36 34 29 61 5b 31 5d 3c 3c 31 36 29  _int64)a[1]<<16)
1ee50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee60 20 20 20 20 20 20 20 20 2b 20 28 28 73 71 6c 69          + ((sqli
1ee70 74 65 33 5f 69 6e 74 36 34 29 61 5b 32 5d 3c 3c  te3_int64)a[2]<<
1ee80 20 38 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   8).            
1ee90 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 73             + ((s
1eea0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 33  qlite3_int64)a[3
1eeb0 5d 3c 3c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ]<< 0);.    sqli
1eec0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
1eed0 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b  (context, iVal);
1eee0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
1eef0 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22 73  alar function "s
1ef00 68 65 6c 6c 5f 69 64 71 75 6f 74 65 28 58 29 22  hell_idquote(X)"
1ef10 20 72 65 74 75 72 6e 73 20 73 74 72 69 6e 67 20   returns string 
1ef20 58 20 71 75 6f 74 65 64 20 61 73 20 61 6e 20 69  X quoted as an i
1ef30 64 65 6e 74 69 66 69 65 72 2c 0a 2a 2a 20 75 73  dentifier,.** us
1ef40 69 6e 67 20 22 2e 2e 2e 22 20 77 69 74 68 20 69  ing "..." with i
1ef50 6e 74 65 72 6e 61 6c 20 64 6f 75 62 6c 65 2d 71  nternal double-q
1ef60 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
1ef70 64 6f 75 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  doubled..*/.stat
1ef80 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 49 64 51  ic void shellIdQ
1ef90 75 6f 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  uote(.  sqlite3_
1efa0 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1efb0 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a  , .  int argc, .
1efc0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1efd0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
1efe0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
1eff0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1f000 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1f010 61 72 67 76 5b 30 5d 29 3b 0a 20 20 55 4e 55 53  argv[0]);.  UNUS
1f020 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
1f030 63 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  c);.  if( zName 
1f040 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1f050 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1f060 28 22 5c 22 25 77 5c 22 22 2c 20 7a 4e 61 6d 65  ("\"%w\"", zName
1f070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1f080 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1f090 78 74 2c 20 7a 2c 20 2d 31 2c 20 73 71 6c 69 74  xt, z, -1, sqlit
1f0a0 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  e3_free);.  }.}.
1f0b0 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66 75  ./*.** Scalar fu
1f0c0 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 65 73  nction "shell_es
1f0d0 63 61 70 65 5f 63 72 6e 6c 22 20 75 73 65 64 20  cape_crnl" used 
1f0e0 62 79 20 74 68 65 20 2e 72 65 63 6f 76 65 72 20  by the .recover 
1f0f0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 54 68 65 20  command..** The 
1f100 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1f110 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1f120 20 69 73 20 74 68 65 20 6f 75 74 70 75 74 20 6f   is the output o
1f130 66 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a 20 66 75  f built-in.** fu
1f140 6e 63 74 69 6f 6e 20 71 75 6f 74 65 28 29 2e 20  nction quote(). 
1f150 49 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61  If the first cha
1f160 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
1f170 70 75 74 20 69 73 20 22 27 22 2c 20 0a 2a 2a 20  put is "'", .** 
1f180 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1f190 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
1f1a0 20 74 6f 20 71 75 6f 74 65 28 29 20 77 61 73 20   to quote() was 
1f1b0 61 20 74 65 78 74 20 76 61 6c 75 65 2c 0a 2a 2a  a text value,.**
1f1c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1f1d0 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
1f1e0 20 69 6e 70 75 74 20 66 6f 72 20 22 5c 6e 22 20   input for "\n" 
1f1f0 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
1f200 65 72 73 0a 2a 2a 20 61 6e 64 20 61 64 64 73 20  ers.** and adds 
1f210 61 20 77 72 61 70 70 65 72 20 73 69 6d 69 6c 61  a wrapper simila
1f220 72 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r to the followi
1f230 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 65 70 6c  ng:.**.**   repl
1f240 61 63 65 28 72 65 70 6c 61 63 65 28 3c 69 6e 70  ace(replace(<inp
1f250 75 74 3e 2c 20 27 5c 6e 27 2c 20 63 68 61 72 28  ut>, '\n', char(
1f260 31 30 29 2c 20 27 5c 72 27 2c 20 63 68 61 72 28  10), '\r', char(
1f270 31 33 29 29 3b 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  13));.**.** Or, 
1f280 69 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61  if the first cha
1f290 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69 6e  racter of the in
1f2a0 70 75 74 20 69 73 20 6e 6f 74 20 22 27 22 2c 20  put is not "'", 
1f2b0 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  then a copy.** o
1f2c0 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 72  f the input is r
1f2d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1f2e0 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 73 63  ic void shellEsc
1f2f0 61 70 65 43 72 6e 6c 28 0a 20 20 73 71 6c 69 74  apeCrnl(.  sqlit
1f300 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1f310 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
1f320 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
1f330 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
1f340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
1f350 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1f360 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1f370 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 55  xt(argv[0]);.  U
1f380 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f390 61 72 67 63 29 3b 0a 20 20 69 66 28 20 7a 54 65  argc);.  if( zTe
1f3a0 78 74 5b 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20  xt[0]=='\'' ){. 
1f3b0 20 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73     int nText = s
1f3c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1f3d0 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
1f3e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
1f3f0 20 7a 42 75 66 31 5b 32 30 5d 3b 0a 20 20 20 20   zBuf1[20];.    
1f400 63 68 61 72 20 7a 42 75 66 32 5b 32 30 5d 3b 0a  char zBuf2[20];.
1f410 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f420 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  zNL = 0;.    con
1f430 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30  st char *zCR = 0
1f440 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
1f450 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
1f460 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   0;..    for(i=0
1f470 3b 20 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29  ; zText[i]; i++)
1f480 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 4c 3d  {.      if( zNL=
1f490 3d 30 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d  =0 && zText[i]==
1f4a0 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
1f4b0 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zNL = unused_str
1f4c0 69 6e 67 28 7a 54 65 78 74 2c 20 22 5c 5c 6e 22  ing(zText, "\\n"
1f4d0 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31  , "\\012", zBuf1
1f4e0 29 3b 0a 20 20 20 20 20 20 20 20 6e 4e 4c 20 3d  );.        nNL =
1f4f0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 4c   (int)strlen(zNL
1f500 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f510 20 69 66 28 20 7a 43 52 3d 3d 30 20 26 26 20 7a   if( zCR==0 && z
1f520 54 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b  Text[i]=='\r' ){
1f530 0a 20 20 20 20 20 20 20 20 7a 43 52 20 3d 20 75  .        zCR = u
1f540 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 54 65  nused_string(zTe
1f550 78 74 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31  xt, "\\r", "\\01
1f560 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20  5", zBuf2);.    
1f570 20 20 20 20 6e 43 52 20 3d 20 28 69 6e 74 29 73      nCR = (int)s
1f580 74 72 6c 65 6e 28 7a 43 52 29 3b 0a 20 20 20 20  trlen(zCR);.    
1f590 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1f5a0 66 28 20 7a 4e 4c 20 7c 7c 20 7a 43 52 20 29 7b  f( zNL || zCR ){
1f5b0 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74 20  .      int iOut 
1f5c0 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  = 0;.      i64 n
1f5d0 4d 61 78 20 3d 20 28 6e 4e 4c 20 3e 20 6e 43 52  Max = (nNL > nCR
1f5e0 29 20 3f 20 6e 4e 4c 20 3a 20 6e 43 52 3b 0a 20  ) ? nNL : nCR;. 
1f5f0 20 20 20 20 20 69 36 34 20 6e 41 6c 6c 6f 63 20       i64 nAlloc 
1f600 3d 20 6e 4d 61 78 20 2a 20 6e 54 65 78 74 20 2b  = nMax * nText +
1f610 20 28 6e 4d 61 78 2b 36 34 29 2a 32 3b 0a 20 20   (nMax+64)*2;.  
1f620 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
1f630 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
1f640 6d 61 6c 6c 6f 63 36 34 28 6e 41 6c 6c 6f 63 29  malloc64(nAlloc)
1f650 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74  ;.      if( zOut
1f660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1f670 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f680 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
1f690 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
1f6a0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rn;.      }..   
1f6b0 20 20 20 69 66 28 20 7a 4e 4c 20 26 26 20 7a 43     if( zNL && zC
1f6c0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  R ){.        mem
1f6d0 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f6e0 20 22 72 65 70 6c 61 63 65 28 72 65 70 6c 61 63   "replace(replac
1f6f0 65 28 22 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  e(", 16);.      
1f700 20 20 69 4f 75 74 20 2b 3d 20 31 36 3b 0a 20 20    iOut += 16;.  
1f710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f720 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
1f730 69 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65 28  iOut], "replace(
1f740 22 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 8);.        i
1f750 4f 75 74 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20  Out += 8;.      
1f760 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1f770 20 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b   zText[i]; i++){
1f780 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 65  .        if( zTe
1f790 78 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  xt[i]=='\n' ){. 
1f7a0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1f7b0 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c  &zOut[iOut], zNL
1f7c0 2c 20 6e 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20  , nNL);.        
1f7d0 20 20 69 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20    iOut += nNL;. 
1f7e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f7f0 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 72 27 20   zText[i]=='\r' 
1f800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1f810 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f820 20 7a 43 52 2c 20 6e 43 52 29 3b 0a 20 20 20 20   zCR, nCR);.    
1f830 20 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 6e 43        iOut += nC
1f840 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
1f850 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74  {.          zOut
1f860 5b 69 4f 75 74 5d 20 3d 20 7a 54 65 78 74 5b 69  [iOut] = zText[i
1f870 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75  ];.          iOu
1f880 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
1f890 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1f8a0 28 20 7a 4e 4c 20 29 7b 0a 20 20 20 20 20 20 20  ( zNL ){.       
1f8b0 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f   memcpy(&zOut[iO
1f8c0 75 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b 20 69  ut], ",'", 2); i
1f8d0 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  Out += 2;.      
1f8e0 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f8f0 4f 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b  Out], zNL, nNL);
1f900 20 69 4f 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20   iOut += nNL;.  
1f910 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f        memcpy(&zO
1f920 75 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20 63 68  ut[iOut], "', ch
1f930 61 72 28 31 30 29 29 22 2c 20 31 32 29 3b 20 69  ar(10))", 12); i
1f940 4f 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20 20 20  Out += 12;.     
1f950 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 52   }.      if( zCR
1f960 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1f970 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1f980 22 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20 2b  ",'", 2); iOut +
1f990 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  = 2;.        mem
1f9a0 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f9b0 20 7a 43 52 2c 20 6e 43 52 29 3b 20 69 4f 75 74   zCR, nCR); iOut
1f9c0 20 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20 20   += nCR;.       
1f9d0 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f   memcpy(&zOut[iO
1f9e0 75 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31 33  ut], "', char(13
1f9f0 29 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20 2b  ))", 12); iOut +
1fa00 3d 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  = 12;.      }.. 
1fa10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1fa20 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
1fa30 2c 20 7a 4f 75 74 2c 20 69 4f 75 74 2c 20 53 51  , zOut, iOut, SQ
1fa40 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1fa50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1fa60 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
1fa70 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1fa80 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   }..  sqlite3_re
1fa90 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
1faa0 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 7d 0a  xt, argv[0]);.}.
1fab0 0a 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f 70  ./* Flags for op
1fac0 65 6e 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  en_db()..**.** T
1fad0 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
1fae0 69 6f 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28 29  ior of open_db()
1faf0 20 69 73 20 74 6f 20 65 78 69 74 28 31 29 20 69   is to exit(1) i
1fb00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1fb10 61 69 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e  ails to.** open.
1fb20 20 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b 45    The OPEN_DB_KE
1fb30 45 50 41 4c 49 56 45 20 66 6c 61 67 20 63 68 61  EPALIVE flag cha
1fb40 6e 67 65 73 20 74 68 61 74 20 73 6f 20 74 68 61  nges that so tha
1fb50 74 20 69 74 20 70 72 69 6e 74 73 20 61 6e 20 65  t it prints an e
1fb60 72 72 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69 6c  rror.** but stil
1fb70 6c 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  l returns withou
1fb80 74 20 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e 0a  t calling exit..
1fb90 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f 44  **.** The OPEN_D
1fba0 42 5f 5a 49 50 46 49 4c 45 20 66 6c 61 67 20 63  B_ZIPFILE flag c
1fbb0 61 75 73 65 73 20 6f 70 65 6e 5f 64 62 28 29 20  auses open_db() 
1fbc0 74 6f 20 70 72 65 66 65 72 20 74 6f 20 6f 70 65  to prefer to ope
1fbd0 6e 20 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a 20  n files as a.** 
1fbe0 5a 49 50 20 61 72 63 68 69 76 65 20 69 66 20 74  ZIP archive if t
1fbf0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1fc00 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70   exist or is emp
1fc10 74 79 20 61 6e 64 20 69 74 73 20 6e 61 6d 65 20  ty and its name 
1fc20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 2a  matches.** the *
1fc30 2e 7a 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a 2f  .zip pattern..*/
1fc40 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42  .#define OPEN_DB
1fc50 5f 4b 45 45 50 41 4c 49 56 45 20 20 20 30 78 30  _KEEPALIVE   0x0
1fc60 30 31 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  01   /* Return a
1fc70 66 74 65 72 20 65 72 72 6f 72 20 69 66 20 74 72  fter error if tr
1fc80 75 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50  ue */.#define OP
1fc90 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20 20  EN_DB_ZIPFILE   
1fca0 20 20 30 78 30 30 32 20 20 20 2f 2a 20 4f 70 65    0x002   /* Ope
1fcb0 6e 20 61 73 20 5a 49 50 20 69 66 20 6e 61 6d 65  n as ZIP if name
1fcc0 20 6d 61 74 63 68 65 73 20 2a 2e 7a 69 70 20 2a   matches *.zip *
1fcd0 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  /../*.** Make su
1fce0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1fcf0 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20  is open.  If it 
1fd00 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65  is not, then ope
1fd10 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  n it.  If.** the
1fd20 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20   database fails 
1fd30 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61  to open, print a
1fd40 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1fd50 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61  and exit..*/.sta
1fd60 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62  tic void open_db
1fd70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1fd80 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b 0a  int openFlags){.
1fd90 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
1fda0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65  {.    if( p->ope
1fdb0 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1fdc0 4e 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20 20 20  N_UNSPEC ){.    
1fdd0 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65    if( p->zDbFile
1fde0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44  name==0 || p->zD
1fdf0 62 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20  bFilename[0]==0 
1fe00 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
1fe10 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
1fe20 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  PEN_NORMAL;.    
1fe30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fe40 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28   p->openMode = (
1fe50 75 38 29 64 65 64 75 63 65 44 61 74 61 62 61 73  u8)deduceDatabas
1fe60 65 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65  eType(p->zDbFile
1fe70 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 20 28 6f 70 65 6e 46 6c 61 67 73 20 26      (openFlags &
1fea0 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45   OPEN_DB_ZIPFILE
1feb0 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  )!=0);.      }. 
1fec0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
1fed0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a   p->openMode ){.
1fee0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1fef0 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a  _OPEN_APPENDVFS:
1ff00 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1ff10 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44  e3_open_v2(p->zD
1ff20 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
1ff30 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 53  b, .           S
1ff40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1ff50 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
1ff60 5f 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66  _CREATE, "apndvf
1ff70 73 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  s");.        bre
1ff80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ff90 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1ffa0 4e 5f 48 45 58 44 42 3a 0a 20 20 20 20 20 20 63  N_HEXDB:.      c
1ffb0 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44  ase SHELL_OPEN_D
1ffc0 45 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a 20 20  ESERIALIZE: {.  
1ffd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1ffe0 65 6e 28 30 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  en(0, &p->db);. 
1fff0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20000 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
20010 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
20020 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ILE: {.        s
20030 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
20040 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b  mory:", &p->db);
20050 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
20070 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45  se SHELL_OPEN_RE
20080 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20  ADONLY: {.      
20090 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
200a0 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
200b0 2c 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  , &p->db, SQLITE
200c0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20  _OPEN_READONLY, 
200d0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
200e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
200f0 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
20100 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63  _UNSPEC:.      c
20110 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  ase SHELL_OPEN_N
20120 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20  ORMAL: {.       
20130 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d   sqlite3_open(p-
20140 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
20150 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62  ->db);.        b
20160 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
20170 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62    }.    globalDb
20180 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66   = p->db;.    if
20190 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51  ( p->db==0 || SQ
201a0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
201b0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
201c0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
201d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
201e0 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  or: unable to op
201f0 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73  en database \"%s
20200 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  \": %s\n",.     
20210 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
20220 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ame, sqlite3_err
20230 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
20240 20 20 20 69 66 28 20 6f 70 65 6e 46 6c 61 67 73     if( openFlags
20250 20 26 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41   & OPEN_DB_KEEPA
20260 4c 49 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LIVE ){.        
20270 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d  sqlite3_open(":m
20280 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29  emory:", &p->db)
20290 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
202a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
202b0 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23  exit(1);.    }.#
202c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
202d0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
202e0 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e  N.    sqlite3_en
202f0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
20300 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23  ion(p->db, 1);.#
20310 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
20320 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d  3_fileio_init(p-
20330 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
20340 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65  sqlite3_shathree
20350 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
20360 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
20370 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28  completion_init(
20380 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69  p->db, 0, 0);.#i
20390 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
203a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
203b0 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
203c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
203d0 50 41 47 45 5f 56 54 41 42 29 0a 20 20 20 20 73  PAGE_VTAB).    s
203e0 71 6c 69 74 65 33 5f 64 62 64 61 74 61 5f 69 6e  qlite3_dbdata_in
203f0 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
20400 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
20410 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
20420 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
20430 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
20440 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
20450 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
20460 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
20470 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
20480 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
20490 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
204a0 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
204b0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
204e0 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
204f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
20500 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
20510 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
20520 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
20530 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
20540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
20560 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
20570 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
20580 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
20590 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
205a0 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
205b0 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20  ITE_UTF8, p,.   
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75           shellPu
205e0 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  tsFunc, 0, 0);. 
205f0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20600 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20610 2c 20 22 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f  , "shell_escape_
20620 63 72 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45  crnl", 1, SQLITE
20630 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 73 68 65 6c 6c 45 73 63 61 70        shellEscap
20660 65 43 72 6e 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  eCrnl, 0, 0);.  
20670 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20680 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20690 20 22 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2c 20   "shell_int32", 
206a0 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  2, SQLITE_UTF8, 
206b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
206d0 68 65 6c 6c 49 6e 74 33 32 2c 20 30 2c 20 30 29  hellInt32, 0, 0)
206e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
206f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
20700 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 69 64 71 75  >db, "shell_idqu
20710 6f 74 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ote", 1, SQLITE_
20720 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 73 68 65 6c 6c 49 64 51 75 6f 74       shellIdQuot
20750 65 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  e, 0, 0);.#ifnde
20760 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
20770 53 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74  SYSTEM.    sqlit
20780 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
20790 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22  on(p->db, "edit"
207a0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
207b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207d0 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29   editFunc, 0, 0)
207e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
207f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
20800 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20  >db, "edit", 2, 
20810 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
20840 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Func, 0, 0);.#en
20850 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  dif.    if( p->o
20860 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
20870 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20  PEN_ZIPFILE ){. 
20880 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20       char *zSql 
20890 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
208a0 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45  f(.         "CRE
208b0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
208c0 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66  E zip USING zipf
208d0 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44  ile(%Q);", p->zD
208e0 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  bFilename);.    
208f0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
20900 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
20910 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
20920 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
20930 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20940 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
20950 49 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a  IALIZE.    else.
20960 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
20970 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
20980 44 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70  DESERIALIZE || p
20990 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
209a0 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a  L_OPEN_HEXDB ){.
209b0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
209c0 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20      int nData = 
209d0 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  0;.      unsigne
209e0 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
209f0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
20a00 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
20a10 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a  _DESERIALIZE ){.
20a20 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20          aData = 
20a30 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
20a40 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46  readFile(p->zDbF
20a50 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29  ilename, &nData)
20a60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20a70 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 72         aData = r
20a80 65 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44 61  eadHexDb(p, &nDa
20a90 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
20aa0 20 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20   aData==0 ){.   
20ab0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
20ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20ad0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20ae0 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
20af0 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61  p->db, "main", a
20b00 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61  Data, nData, nDa
20b10 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
20b20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
20b30 53 45 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45  SERIALIZE_RESIZE
20b40 41 42 4c 45 20 7c 0a 20 20 20 20 20 20 20 20 20  ABLE |.         
20b50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20b60 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45  _DESERIALIZE_FRE
20b70 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20  EONCLOSE);.     
20b80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20b90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
20ba0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
20bb0 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69  qlite3_deseriali
20bc0 7a 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c  ze() returns %d\
20bd0 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  n", rc);.      }
20be0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a  .      if( p->sz
20bf0 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Max>0 ){.       
20c00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
20c10 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61  ntrol(p->db, "ma
20c20 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
20c30 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70  L_SIZE_LIMIT, &p
20c40 2d 3e 73 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20  ->szMax);.      
20c50 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
20c60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
20c70 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  mpt to close the
20c80 20 64 61 74 61 62 61 65 73 20 63 6f 6e 6e 65 63   databaes connec
20c90 74 69 6f 6e 2e 20 20 52 65 70 6f 72 74 20 65 72  tion.  Report er
20ca0 72 6f 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c  rors..*/.void cl
20cb0 6f 73 65 5f 64 62 28 73 71 6c 69 74 65 33 20 2a  ose_db(sqlite3 *
20cc0 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
20cd0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
20ce0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
20cf0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
20d00 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
20d10 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 72  qlite3_close() r
20d20 65 74 75 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22  eturns %d: %s\n"
20d30 2c 0a 20 20 20 20 20 20 20 20 72 63 2c 20 73 71  ,.        rc, sq
20d40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
20d50 29 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48  );.  } .}..#if H
20d60 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20  AVE_READLINE || 
20d70 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a  HAVE_EDITLINE./*
20d80 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d  .** Readline com
20d90 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
20da0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  s.*/.static char
20db0 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c   *readline_compl
20dc0 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28  etion_generator(
20dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74  const char *text
20de0 2c 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20  , int state){.  
20df0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
20e00 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
20e10 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20    char *zRet;.  
20e20 69 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a  if( state==0 ){.
20e30 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
20e40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
20e50 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
20e60 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
20e70 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
20e80 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
20e90 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
20ea0 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
20ec0 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e   FROM completion
20ed0 28 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  (%Q) ORDER BY 1"
20ee0 2c 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c  , text);.    sql
20ef0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
20f00 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
20f10 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
20f20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20f30 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  (zSql);.  }.  if
20f40 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
20f50 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
20f60 57 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20  W ){.    zRet = 
20f70 73 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68  strdup((const ch
20f80 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
20f90 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
20fa0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
20fb0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20fc0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
20fd0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65  tmt = 0;.    zRe
20fe0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
20ff0 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74  urn zRet;.}.stat
21000 69 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69  ic char **readli
21010 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  ne_completion(co
21020 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
21030 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
21040 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74   iEnd){.  rl_att
21050 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f  empted_completio
21060 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65  n_over = 1;.  re
21070 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69  turn rl_completi
21080 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74  on_matches(zText
21090 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c  , readline_compl
210a0 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29  etion_generator)
210b0 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f  ;.}..#elif HAVE_
210c0 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20  LINENOISE./*.** 
210d0 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65  Linenoise comple
210e0 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f  tion callback.*/
210f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e  .static void lin
21100 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f  enoise_completio
21110 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  n(const char *zL
21120 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f  ine, linenoiseCo
21130 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a  mpletions *lc){.
21140 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74    int nLine = st
21150 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20  rlen30(zLine);. 
21160 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a   int i, iStart;.
21170 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
21180 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
21190 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
211a0 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69  zBuf[1000];..  i
211b0 66 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28  f( nLine>sizeof(
211c0 7a 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72  zBuf)-30 ) retur
211d0 6e 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30  n;.  if( zLine[0
211e0 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b  ]=='.' || zLine[
211f0 30 5d 3d 3d 27 23 27 29 20 72 65 74 75 72 6e 3b  0]=='#') return;
21200 0a 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31  .  for(i=nLine-1
21210 3b 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e  ; i>=0 && (isaln
21220 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20  um(zLine[i]) || 
21230 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20  zLine[i]=='_'); 
21240 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d  i--){}.  if( i==
21250 6e 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e  nLine-1 ) return
21260 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31  ;.  iStart = i+1
21270 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c  ;.  memcpy(zBuf,
21280 20 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b   zLine, iStart);
21290 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
212a0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
212b0 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69  T DISTINCT candi
212c0 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  date COLLATE noc
212d0 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ase".           
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
212f0 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e   FROM completion
21300 28 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59  (%Q,%Q) ORDER BY
21310 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20   1",.           
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
21330 4c 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c  Line[iStart], zL
21340 69 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ine);.  sqlite3_
21350 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61  prepare_v2(globa
21360 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  lDb, zSql, -1, &
21370 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
21380 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
21390 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
213a0 67 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d  globalDb, "PRAGM
213b0 41 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30  A page_count", 0
213c0 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64  , 0, 0); /* Load
213d0 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
213e0 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
213f0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
21400 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
21410 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70  onst char *zComp
21420 6c 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  letion = (const 
21430 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
21440 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
21450 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f   0);.    int nCo
21460 6d 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74  mpletion = sqlit
21470 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
21480 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
21490 66 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c  f( iStart+nCompl
214a0 65 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a  etion < sizeof(z
214b0 42 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20  Buf)-1 ){.      
214c0 6d 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61  memcpy(zBuf+iSta
214d0 72 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c  rt, zCompletion,
214e0 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b   nCompletion+1);
214f0 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65  .      linenoise
21500 41 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63  AddCompletion(lc
21510 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  , zBuf);.    }. 
21520 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
21530 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
21540 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
21550 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c   C-language styl
21560 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a  e dequoting..**.
21570 2a 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61  **    \a    -> a
21580 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20  larm.**    \b   
21590 20 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a   -> backspace.**
215a0 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62      \t    -> tab
215b0 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20  .**    \n    -> 
215c0 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76  newline.**    \v
215d0 20 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20      -> vertical 
215e0 74 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20  tab.**    \f    
215f0 2d 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20  -> form feed.** 
21600 20 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72     \r    -> carr
21610 69 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20  iage return.**  
21620 20 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65    \s    -> space
21630 0a 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20  .**    \"    -> 
21640 22 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e  ".**    \'    ->
21650 20 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d   '.**    \\    -
21660 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20  > backslash.**  
21670 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69    \NNN  -> ascii
21680 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69   character NNN i
21690 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69  n octal.*/.stati
216a0 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62  c void resolve_b
216b0 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20  ackslashes(char 
216c0 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *z){.  int i, j;
216d0 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69  .  char c;.  whi
216e0 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c  le( *z && *z!='\
216f0 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28  \' ) z++;.  for(
21700 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  i=j=0; (c = z[i]
21710 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  )!=0; i++, j++){
21720 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27  .    if( c=='\\'
21730 20 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b   && z[i+1]!=0 ){
21740 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69  .      c = z[++i
21750 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ];.      if( c==
21760 27 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'a' ){.        c
21770 20 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d   = '\a';.      }
21780 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20  else if( c=='b' 
21790 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
217a0 5c 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \b';.      }else
217b0 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20   if( c=='t' ){. 
217c0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b         c = '\t';
217d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
217e0 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20   c=='n' ){.     
217f0 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20     c = '\n';.   
21800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
21810 27 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'v' ){.        c
21820 20 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d   = '\v';.      }
21830 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20  else if( c=='f' 
21840 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
21850 5c 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \f';.      }else
21860 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20   if( c=='r' ){. 
21870 20 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b         c = '\r';
21880 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21890 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
218a0 20 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20     c = '"';.    
218b0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
218c0 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  \'' ){.        c
218d0 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d   = '\'';.      }
218e0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27  else if( c=='\\'
218f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21900 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\\';.      }els
21910 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20  e if( c>='0' && 
21920 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  c<='7' ){.      
21930 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20    c -= '0';.    
21940 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d      if( z[i+1]>=
21950 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27  '0' && z[i+1]<='
21960 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7' ){.          
21970 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  i++;.          c
21980 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
21990 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
219a0 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
219b0 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
219c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
219d0 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
219e0 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b   c = (c<<3) + z[
219f0 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  i] - '0';.      
21a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21a20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a    z[j] = c;.  }.
21a30 20 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d    if( j<i ) z[j]
21a40 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
21a50 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73  nterpret zArg as
21a60 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
21a70 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  er or a boolean 
21a80 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31  value.  Return 1
21a90 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55   or 0.** for TRU
21aa0 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65  E and FALSE.  Re
21ab0 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72  turn the integer
21ac0 20 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70   value if approp
21ad0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
21ae0 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   int booleanValu
21af0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
21b00 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rg){.  int i;.  
21b10 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
21b20 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
21b30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b   ){.    for(i=2;
21b40 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a   hexDigitValue(z
21b50 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29  Arg[i])>=0; i++)
21b60 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  {}.  }else{.    
21b70 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d  for(i=0; zArg[i]
21b80 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d  >='0' && zArg[i]
21b90 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  <='9'; i++){}.  
21ba0 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a  }.  if( i>0 && z
21bb0 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75  Arg[i]==0 ) retu
21bc0 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72  rn (int)(integer
21bd0 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78  Value(zArg) & 0x
21be0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28  ffffffff);.  if(
21bf0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
21c00 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20  (zArg, "on")==0 
21c10 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
21c20 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d  mp(zArg,"yes")==
21c30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21c40 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
21c50 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
21c60 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20  g, "off")==0 || 
21c70 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
21c80 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b  zArg,"no")==0 ){
21c90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
21ca0 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66   }.  utf8_printf
21cb0 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
21cc0 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76   Not a boolean v
21cd0 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73  alue: \"%s\". As
21ce0 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e  suming \"no\".\n
21cf0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72  ",.          zAr
21d00 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  g);.  return 0;.
21d10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20  }../*.** Set or 
21d20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c  clear a shell fl
21d30 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ag according to 
21d40 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
21d50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21d60 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53  setOrClearFlag(S
21d70 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e  hellState *p, un
21d80 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f  signed mFlag, co
21d90 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
21da0 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61  .  if( booleanVa
21db0 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20  lue(zArg) ){.   
21dc0 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
21dd0 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65   mFlag);.  }else
21de0 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  {.    ShellClear
21df0 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a  Flag(p, mFlag);.
21e00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
21e10 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  se an output fil
21e20 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69  e, assuming it i
21e30 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20  s not stderr or 
21e40 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63  stdout.*/.static
21e50 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c   void output_fil
21e60 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29  e_close(FILE *f)
21e70 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d  {.  if( f && f!=
21e80 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64  stdout && f!=std
21e90 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  err ) fclose(f);
21ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
21eb0 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20   open an output 
21ec0 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65  file.   The name
21ed0 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22  s "stdout" and "
21ee0 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72  stderr" are.** r
21ef0 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f  ecognized and do
21f00 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67   the right thing
21f10 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  .  NULL is retur
21f20 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ned if the outpu
21f30 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73  t.** filename is
21f40 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69   "off"..*/.stati
21f50 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66  c FILE *output_f
21f60 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ile_open(const c
21f70 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
21f80 62 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49  bTextMode){.  FI
21f90 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72  LE *f;.  if( str
21fa0 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75  cmp(zFile,"stdou
21fb0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  t")==0 ){.    f 
21fc0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73  = stdout;.  }els
21fd0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
21fe0 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30  le, "stderr")==0
21ff0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65   ){.    f = stde
22000 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rr;.  }else if( 
22010 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f  strcmp(zFile, "o
22020 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ff")==0 ){.    f
22030 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22040 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69     f = fopen(zFi
22050 6c 65 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20  le, bTextMode ? 
22060 22 77 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20  "w" : "wb");.   
22070 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
22080 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
22090 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
220a0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
220b0 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
220c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
220d0 20 66 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   f;.}..#ifndef S
220e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
220f0 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65  ./*.** A routine
22100 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75   for handling ou
22110 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65  tput from sqlite
22120 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74  3_trace()..*/.st
22130 61 74 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61  atic int sql_tra
22140 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75  ce_callback(.  u
22150 6e 73 69 67 6e 65 64 20 6d 54 79 70 65 2c 20 20  nsigned mType,  
22160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
22170 61 63 65 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f  ace type */.  vo
22180 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
22190 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 68 65        /* The She
221a0 6c 6c 53 74 61 74 65 20 70 6f 69 6e 74 65 72 20  llState pointer 
221b0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50 2c 20 20  */.  void *pP,  
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
221d0 55 73 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  Usually a pointe
221e0 72 20 74 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74  r to sqlite_stmt
221f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 58 20 20   */.  void *pX  
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22210 20 41 75 78 69 6c 69 61 72 79 20 6f 75 74 70 75   Auxiliary outpu
22220 74 20 2a 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53  t */.){.  ShellS
22230 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
22240 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20 73  State*)pArg;.  s
22250 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
22260 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mt;.  const char
22270 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53   *zSql;.  int nS
22280 71 6c 3b 0a 20 20 69 66 28 20 70 2d 3e 74 72 61  ql;.  if( p->tra
22290 63 65 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72  ceOut==0 ) retur
222a0 6e 20 30 3b 0a 20 20 69 66 28 20 6d 54 79 70 65  n 0;.  if( mType
222b0 3d 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  ==SQLITE_TRACE_C
222c0 4c 4f 53 45 20 29 7b 0a 20 20 20 20 75 74 66 38  LOSE ){.    utf8
222d0 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65  _printf(p->trace
222e0 4f 75 74 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67  Out, "-- closing
222f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22300 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65  tion\n");.    re
22310 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
22320 28 20 6d 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  ( mType!=SQLITE_
22330 54 52 41 43 45 5f 52 4f 57 20 26 26 20 28 28 63  TRACE_ROW && ((c
22340 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 29 5b 30  onst char*)pX)[0
22350 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53  ]=='-' ){.    zS
22360 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
22370 2a 29 70 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)pX;.  }else{. 
22380 20 20 20 70 53 74 6d 74 20 3d 20 28 73 71 6c 69     pStmt = (sqli
22390 74 65 33 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20  te3_stmt*)pP;.  
223a0 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 54 72    switch( p->eTr
223b0 61 63 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  aceType ){.     
223c0 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43   case SHELL_TRAC
223d0 45 5f 45 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20  E_EXPANDED: {.  
223e0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
223f0 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71  ite3_expanded_sq
22400 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
22410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22420 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
22430 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a  NABLE_NORMALIZE.
22440 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
22450 5f 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45  _TRACE_NORMALIZE
22460 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  D: {.        zSq
22470 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d  l = sqlite3_norm
22480 61 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74  alized_sql(pStmt
22490 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
224a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
224b0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
224c0 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
224d0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
224e0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  mt);.        bre
224f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
22500 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c  }.  }.  if( zSql
22510 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
22520 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33    nSql = strlen3
22530 30 28 7a 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65  0(zSql);.  while
22540 28 20 6e 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c  ( nSql>0 && zSql
22550 5b 6e 53 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b  [nSql-1]==';' ){
22560 20 6e 53 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69   nSql--; }.  swi
22570 74 63 68 28 20 6d 54 79 70 65 20 29 7b 0a 20 20  tch( mType ){.  
22580 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
22590 41 43 45 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73  ACE_ROW:.    cas
225a0 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53  e SQLITE_TRACE_S
225b0 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 75 74 66  TMT: {.      utf
225c0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63  8_printf(p->trac
225d0 65 4f 75 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c  eOut, "%.*s;\n",
225e0 20 6e 53 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20   nSql, zSql);.  
225f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22600 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
22610 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20  _TRACE_PROFILE: 
22620 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22630 69 6e 74 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d  int64 nNanosec =
22640 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
22650 2a 29 70 58 3b 0a 20 20 20 20 20 20 75 74 66 38  *)pX;.      utf8
22660 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65  _printf(p->trace
22670 4f 75 74 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25  Out, "%.*s; -- %
22680 6c 6c 64 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c  lld ns\n", nSql,
22690 20 7a 53 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29   zSql, nNanosec)
226a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
226b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
226c0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
226d0 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75  *.** A no-op rou
226e0 74 69 6e 65 20 74 68 61 74 20 72 75 6e 73 20 77  tine that runs w
226f0 69 74 68 20 74 68 65 20 22 2e 62 72 65 61 6b 70  ith the ".breakp
22700 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e  oint" doc-comman
22710 64 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 61  d.  This is.** a
22720 20 75 73 65 66 75 6c 20 73 70 6f 74 20 74 6f 20   useful spot to 
22730 73 65 74 20 61 20 64 65 62 75 67 67 65 72 20 62  set a debugger b
22740 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  reakpoint..*/.st
22750 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62  atic void test_b
22760 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b  reakpoint(void){
22770 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43  .  static int nC
22780 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c  all = 0;.  nCall
22790 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ++;.}../*.** An 
227a0 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  object used to r
227b0 65 61 64 20 61 20 43 53 56 20 61 6e 64 20 6f 74  ead a CSV and ot
227c0 68 65 72 20 66 69 6c 65 73 20 66 6f 72 20 69 6d  her files for im
227d0 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  port..*/.typedef
227e0 20 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74   struct ImportCt
227f0 78 20 49 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72  x ImportCtx;.str
22800 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a  uct ImportCtx {.
22810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
22820 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ile;  /* Name of
22830 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
22840 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  */.  FILE *in;  
22850 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
22860 20 74 68 65 20 43 53 56 20 74 65 78 74 20 66 72   the CSV text fr
22870 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 74  om this input st
22880 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ream */.  char *
22890 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  z;            /*
228a0 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78   Accumulated tex
228b0 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f  t for a field */
228c0 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
228d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
228e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a   of bytes in z *
228f0 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
22900 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
22910 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
22920 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e  [] */.  int nLin
22930 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  e;          /* C
22940 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62  urrent line numb
22950 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74  er */.  int bNot
22960 46 69 72 73 74 3b 20 20 20 20 20 20 2f 2a 20 54  First;      /* T
22970 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  rue if one or mo
22980 72 65 20 62 79 74 65 73 20 61 6c 72 65 61 64 79  re bytes already
22990 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63   read */.  int c
229a0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
229b0 2a 20 43 68 61 72 61 63 74 65 72 20 74 68 61 74  * Character that
229c0 20 74 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20   terminated the 
229d0 6d 6f 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c  most recent fiel
229e0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53  d */.  int cColS
229f0 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
22a00 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
22a10 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28  or character.  (
22a20 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a  Usually ",") */.
22a30 20 20 69 6e 74 20 63 52 6f 77 53 65 70 3b 20 20    int cRowSep;  
22a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
22a50 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
22a60 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20  cter.  (Usually 
22a70 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  "\n") */.};../* 
22a80 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20  Append a single 
22a90 62 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73  byte to z[] */.s
22aa0 74 61 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72  tatic void impor
22ab0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 49 6d  t_append_char(Im
22ac0 70 6f 72 74 43 74 78 20 2a 70 2c 20 69 6e 74 20  portCtx *p, int 
22ad0 63 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31  c){.  if( p->n+1
22ae0 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
22af0 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20     p->nAlloc += 
22b00 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b  p->nAlloc + 100;
22b10 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69  .    p->z = sqli
22b20 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
22b30 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
22b40 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20      if( p->z==0 
22b50 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
22b60 65 6d 6f 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70  emory();.  }.  p
22b70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63  ->z[p->n++] = (c
22b80 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61  har)c;.}../* Rea
22b90 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  d a single field
22ba0 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43   of CSV text.  C
22bb0 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72  ompatible with r
22bc0 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e  fc4180 and exten
22bd0 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ded.** with the 
22be0 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67  option of having
22bf0 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68   a separator oth
22c00 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a  er than ","..**.
22c10 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f  **   +  Input co
22c20 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a  mes from p->in..
22c30 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65  **   +  Store re
22c40 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66  sults in p->z of
22c50 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53   length p->n.  S
22c60 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e  pace to hold p->
22c70 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  z comes.**      
22c80 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
22c90 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20  loc64()..**   + 
22ca0 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20   Use p->cSep as 
22cb0 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
22cc0 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
22cd0 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20  lt is ","..**   
22ce0 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61  +  Use p->rSep a
22cf0 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  s the row separa
22d00 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
22d10 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20  t is "\n"..**   
22d20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  +  Keep track of
22d30 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   the line number
22d40 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
22d50 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
22d60 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
22d70 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
22d80 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
22d90 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
22da0 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
22db0 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
22dc0 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
22dd0 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
22de0 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
22df0 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64  E_CDECL csv_read
22e00 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
22e10 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
22e20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
22e30 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
22e40 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
22e50 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
22e60 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
22e70 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
22e80 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
22e90 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
22ea0 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
22eb0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
22ec0 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
22ed0 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20  int pc, ppc;.   
22ee0 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d   int startLine =
22ef0 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69   p->nLine;.    i
22f00 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20  nt cQuote = c;. 
22f10 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b     pc = ppc = 0;
22f20 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
22f30 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63  .      c = fgetc
22f40 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69  (p->in);.      i
22f50 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e  f( c==rSep ) p->
22f60 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
22f70 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a  f( c==cQuote ){.
22f80 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
22f90 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
22fa0 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20      pc = 0;.    
22fb0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22fd0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d  }.      if( (c==
22fe0 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  cSep && pc==cQuo
22ff0 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
23000 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==rSep && pc==cQ
23010 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
23020 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
23030 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75  '\r' && ppc==cQu
23040 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
23050 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51  c==EOF && pc==cQ
23060 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20  uote).      ){. 
23070 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d         do{ p->n-
23080 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b  -; }while( p->z[
23090 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b  p->n]!=cQuote );
230a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
230b0 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
230c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
230d0 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
230e0 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b  te && c!='\r' ){
230f0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
23100 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
23110 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25  :%d: unescaped %
23120 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a  c character\n",.
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23140 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69  p->zFile, p->nLi
23150 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
23160 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
23170 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20  ==EOF ){.       
23180 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
23190 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74  err, "%s:%d: unt
231a0 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f  erminated %c-quo
231b0 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20  ted field\n",.  
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
231d0 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  >zFile, startLin
231e0 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20  e, cQuote);.    
231f0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
23200 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
23210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23220 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
23230 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70  r(p, c);.      p
23240 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70  pc = pc;.      p
23250 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = c;.    }.  }
23260 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
23270 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
23280 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61  t field being pa
23290 72 73 65 64 20 61 6e 64 20 69 74 20 62 65 67 69  rsed and it begi
232a0 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ns with the.    
232b0 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30  ** UTF-8 BOM  (0
232c0 78 45 46 20 42 42 20 42 46 29 20 74 68 65 6e 20  xEF BB BF) then 
232d0 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a  skip the BOM */.
232e0 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
232f0 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f  ==0xef && p->bNo
23300 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  tFirst==0 ){.   
23310 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
23320 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
23330 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
23340 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  in);.      if( (
23350 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b  c&0xff)==0xbb ){
23360 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  .        import_
23370 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
23380 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66  );.        c = f
23390 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
233a0 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
233b0 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20  )==0xbf ){.     
233c0 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73       p->bNotFirs
233d0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
233e0 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20   p->n = 0;.     
233f0 20 20 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f       return csv_
23400 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70  read_one_field(p
23410 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
23430 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20  hile( c!=EOF && 
23440 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53  c!=cSep && c!=rS
23450 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  ep ){.      impo
23460 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
23470 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
23480 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
23490 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72    }.    if( c==r
234a0 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sep ){.      p->
234b0 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
234c0 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e  f( p->n>0 && p->
234d0 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20  z[p->n-1]=='\r' 
234e0 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  ) p->n--;.    }.
234f0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
23500 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
23510 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
23520 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73  0;.  p->bNotFirs
23530 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
23540 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  p->z;.}../* Read
23550 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
23560 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74  of ASCII delimit
23570 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed text..**.**  
23580 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
23590 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
235a0 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
235b0 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
235c0 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
235d0 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
235e0 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
235f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
23600 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
23610 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
23620 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
23630 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
23640 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b  s "\x1F"..**   +
23650 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73    Use p->rSep as
23660 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
23670 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
23680 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20   is "\x1E"..**  
23690 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   +  Keep track o
236a0 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72  f the row number
236b0 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
236c0 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
236d0 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
236e0 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
236f0 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
23700 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
23710 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
23720 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
23730 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
23740 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
23750 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
23760 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65  E_CDECL ascii_re
23770 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
23780 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
23790 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
237a0 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
237b0 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
237c0 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
237d0 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
237e0 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
237f0 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
23800 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
23810 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
23820 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
23830 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
23840 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72   c!=cSep && c!=r
23850 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72  Sep ){.    impor
23860 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
23870 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65   c);.    c = fge
23880 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20  tc(p->in);.  }. 
23890 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
238a0 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
238b0 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d    }.  p->cTerm =
238c0 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29   c;.  if( p->z )
238d0 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
238e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
238f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
23900 74 72 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f  transfer data fo
23910 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20  r table zTable. 
23920 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
23930 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f  seen while.** mo
23940 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72  ving forward, tr
23950 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64  y to go backward
23960 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61 72 64  s.  The backward
23970 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74  s movement won't
23980 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54  .** work for WIT
23990 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
239a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
239b0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61  d tryToCloneData
239c0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
239d0 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  p,.  sqlite3 *ne
239e0 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  wDb,.  const cha
239f0 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73  r *zTable.){.  s
23a00 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
23a10 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ery = 0;.  sqlit
23a20 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74  e3_stmt *pInsert
23a30 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
23a40 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
23a50 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *zInsert = 0;. 
23a60 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
23a70 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54  , j, n;.  int nT
23a80 61 62 6c 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  able = strlen30(
23a90 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b  zTable);.  int k
23aa0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20   = 0;.  int cnt 
23ab0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  = 0;.  const int
23ac0 20 73 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30   spinRate = 1000
23ad0 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73  0;..  zQuery = s
23ae0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
23af0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
23b00 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  %w\"", zTable);.
23b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
23b20 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
23b30 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
23b40 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20  uery, 0);.  if( 
23b50 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
23b60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
23b70 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b  rror %d: %s on [
23b80 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
23b90 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
23ba0 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e  nded_errcode(p->
23bb0 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
23bc0 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20  msg(p->db),.    
23bd0 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
23be0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61  .    goto end_da
23bf0 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e  ta_xfer;.  }.  n
23c00 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
23c10 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72 79 29 3b  n_count(pQuery);
23c20 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c  .  zInsert = sql
23c30 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30  ite3_malloc64(20
23c40 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33  0 + nTable + n*3
23c50 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73 65 72 74  );.  if( zInsert
23c60 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
23c70 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73  of_memory();.  s
23c80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23c90 32 30 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65  200+nTable,zInse
23ca0 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
23cb0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f         "INSERT O
23cc0 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22  R IGNORE INTO \"
23cd0 25 73 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20  %s\" VALUES(?", 
23ce0 7a 54 61 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73  zTable);.  i = s
23cf0 74 72 6c 65 6e 33 30 28 7a 49 6e 73 65 72 74 29  trlen30(zInsert)
23d00 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e  ;.  for(j=1; j<n
23d10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63  ; j++){.    memc
23d20 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c  py(zInsert+i, ",
23d30 3f 22 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d  ?", 2);.    i +=
23d40 20 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79   2;.  }.  memcpy
23d50 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22  (zInsert+i, ");"
23d60 2c 20 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 3);.  rc = sql
23d70 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
23d80 6e 65 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20  newDb, zInsert, 
23d90 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29  -1, &pInsert, 0)
23da0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
23db0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
23dc0 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
23dd0 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
23de0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23df0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
23e00 63 6f 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c  code(newDb), sql
23e10 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44  ite3_errmsg(newD
23e20 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
23e30 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74  zQuery);.    got
23e40 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
23e50 0a 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  .  }.  for(k=0; 
23e60 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77  k<2; k++){.    w
23e70 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
23e80 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
23e90 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
23ea0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
23eb0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
23ec0 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
23ed0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
23ee0 51 75 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20  Query, i) ){.   
23ef0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
23f00 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
23f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
23f20 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74  ind_null(pInsert
23f30 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
23f40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23f60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
23f70 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  EGER: {.        
23f80 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23f90 5f 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20  _int64(pInsert, 
23fa0 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
23fb0 75 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79  umn_int64(pQuery
23fc0 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
23fd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
23ff0 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
24000 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
24010 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
24020 62 6c 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ble(pInsert, i+1
24030 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
24040 5f 64 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69  _double(pQuery,i
24050 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
24060 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
24070 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
24080 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
24090 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
240a0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
240b0 49 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20  Insert, i+1,.   
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
240e0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
240f0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
24100 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54     -1, SQLITE_ST
24130 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
24140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24160 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
24170 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
24180 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
24190 62 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  b(pInsert, i+1, 
241a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
241b0 6c 6f 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  lob(pQuery,i),. 
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
241f0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
24200 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
24240 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
24250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24260 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24270 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66        } /* End f
24280 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  or */.      rc =
24290 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
242a0 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66  nsert);.      if
242b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
242c0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
242d0 57 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  W && rc!=SQLITE_
242e0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
242f0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24300 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
24310 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78  s\n", sqlite3_ex
24320 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
24330 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ewDb),.         
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
24350 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
24360 77 44 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wDb));.      }. 
24370 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
24380 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  et(pInsert);.   
24390 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
243a0 69 66 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74  if( (cnt%spinRat
243b0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
243c0 20 70 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20   printf("%c\b", 
243d0 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69  "|/-\\"[(cnt/spi
243e0 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20  nRate)%4]);.    
243f0 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
24400 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
24410 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a  } /* End while *
24420 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
24430 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61  LITE_DONE ) brea
24440 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  k;.    sqlite3_f
24450 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
24460 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24470 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a  e(zQuery);.    z
24480 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
24490 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
244a0 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52  * FROM \"%w\" OR
244b0 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
244c0 43 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  C;",.           
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72    zTable);.    r
244f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
24500 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
24510 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
24520 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
24530 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
24540 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24550 57 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20  Warning: cannot 
24560 73 74 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b  step \"%s\" back
24570 77 61 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b  wards", zTable);
24580 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24590 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66    }.  } /* End f
245a0 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65  or(k=0...) */..e
245b0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20  nd_data_xfer:.  
245c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
245d0 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (pQuery);.  sqli
245e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e  te3_finalize(pIn
245f0 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  sert);.  sqlite3
24600 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
24610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
24620 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nsert);.}.../*.*
24630 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65  * Try to transfe
24640 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  r all rows of th
24650 65 20 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61  e schema that ma
24660 74 63 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72  tch zWhere.  For
24670 0a 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e  .** each row, in
24680 76 6f 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20  voke xForEach() 
24690 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65  on the object de
246a0 66 69 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f  fined by that ro
246b0 77 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  w..** If an erro
246c0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
246d0 20 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f   while moving fo
246e0 72 77 61 72 64 20 74 68 72 6f 75 67 68 20 74 68  rward through th
246f0 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  e.** sqlite_mast
24700 65 72 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67  er table, try ag
24710 61 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77  ain moving backw
24720 61 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ards..*/.static 
24730 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53  void tryToCloneS
24740 63 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74  chema(.  ShellSt
24750 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65  ate *p,.  sqlite
24760 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73  3 *newDb,.  cons
24770 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a  t char *zWhere,.
24780 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63    void (*xForEac
24790 68 29 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73  h)(ShellState*,s
247a0 71 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68  qlite3*,const ch
247b0 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
247c0 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d  3_stmt *pQuery =
247d0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
247e0 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ry = 0;.  int rc
247f0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
24800 65 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  ed char *zName;.
24810 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
24820 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
24830 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
24840 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71  ;..  zQuery = sq
24850 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
24860 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
24870 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
24880 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
248a0 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65   WHERE %s", zWhe
248b0 72 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  re);.  rc = sqli
248c0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
248d0 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
248e0 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
248f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
24900 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
24910 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20  r, "Error: (%d) 
24920 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24940 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
24950 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  ded_errcode(p->d
24960 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
24970 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20  sg(p->db),.     
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24990 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
249a0 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72   end_schema_xfer
249b0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28  ;.  }.  while( (
249c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
249d0 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49  p(pQuery))==SQLI
249e0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e  TE_ROW ){.    zN
249f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ame = sqlite3_co
24a00 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
24a10 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  , 0);.    zSql =
24a20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24a30 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
24a40 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e  .    printf("%s.
24a50 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66  .. ", zName); ff
24a60 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
24a70 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e    sqlite3_exec(n
24a80 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
24a90 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  r*)zSql, 0, 0, &
24aa0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
24ab0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
24ac0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
24ad0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
24ae0 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  s\nSQL: [%s]\n",
24af0 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b   zErrMsg, zSql);
24b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24b10 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
24b20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b      zErrMsg = 0;
24b30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78  .    }.    if( x
24b40 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
24b50 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77   xForEach(p, new
24b60 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
24b70 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  )zName);.    }. 
24b80 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
24b90 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  n");.  }.  if( r
24ba0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
24bb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
24bc0 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
24bd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24be0 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51  (zQuery);.    zQ
24bf0 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
24c00 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e  printf("SELECT n
24c10 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ame, sql FROM sq
24c20 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
24c50 45 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f  E %s ORDER BY ro
24c60 77 69 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72  wid DESC", zWher
24c70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
24c80 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
24c90 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
24ca0 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
24cb0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
24cc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24cd0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
24ce0 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c  (%d) %s on [%s]\
24cf0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
24d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24d10 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
24d20 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
24d30 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
24d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24d50 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
24d60 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
24d70 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20  schema_xfer;.   
24d80 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
24d90 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
24da0 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
24db0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a  E_ROW ){.      z
24dc0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Name = sqlite3_c
24dd0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
24de0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71  y, 0);.      zSq
24df0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
24e00 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
24e10 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  1);.      printf
24e20 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65  ("%s... ", zName
24e30 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
24e40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24e50 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
24e60 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
24e70 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
24e80 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d  .      if( zErrM
24e90 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  sg ){.        ut
24ea0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24eb0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51  , "Error: %s\nSQ
24ec0 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72  L: [%s]\n", zErr
24ed0 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  Msg, zSql);.    
24ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24ef0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
24f00 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
24f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24f20 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20  ( xForEach ){.  
24f30 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
24f40 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
24f50 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
24f60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
24f70 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20  tf("done\n");.  
24f80 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65    }.  }.end_sche
24f90 6d 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74  ma_xfer:.  sqlit
24fa0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
24fb0 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
24fc0 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a  ree(zQuery);.}..
24fd0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
24fe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
24ff0 61 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20  amed "zNewDb".  
25000 54 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61  Try to recover a
25010 73 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69  s much informati
25020 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c  on.** as possibl
25030 65 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  e out of the mai
25040 6e 20 64 61 74 61 62 61 73 65 20 28 77 68 69 63  n database (whic
25050 68 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75  h might be corru
25060 70 74 29 20 61 6e 64 20 77 72 69 74 65 20 69 74  pt) and write it
25070 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e  .** into zNewDb.
25080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25090 74 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c  tryToClone(Shell
250a0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
250b0 63 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20  char *zNewDb){. 
250c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
250d0 65 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20  e3 *newDb = 0;. 
250e0 20 69 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77   if( access(zNew
250f0 44 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Db,0)==0 ){.    
25100 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
25110 72 72 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22  rr, "File \"%s\"
25120 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
25130 5c 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20  \n", zNewDb);.  
25140 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
25150 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
25160 6e 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62  n(zNewDb, &newDb
25170 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
25180 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
25190 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63  tderr, "Cannot c
251a0 72 65 61 74 65 20 6f 75 74 70 75 74 20 64 61 74  reate output dat
251b0 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20  abase: %s\n",.  
251c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
251d0 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29  3_errmsg(newDb))
251e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
251f0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
25200 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
25210 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c  ble_schema=ON;",
25220 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
25230 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
25240 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53  b, "BEGIN EXCLUS
25250 49 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  IVE;", 0, 0, 0);
25260 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53  .    tryToCloneS
25270 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20  chema(p, newDb, 
25280 22 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20  "type='table'", 
25290 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b  tryToCloneData);
252a0 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53  .    tryToCloneS
252b0 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20  chema(p, newDb, 
252c0 22 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c  "type!='table'",
252d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
252e0 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f  _exec(newDb, "CO
252f0 4d 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29  MMIT;", 0, 0, 0)
25300 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
25310 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
25320 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
25330 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30  a=OFF;", 0, 0, 0
25340 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64  );.  }.  close_d
25350 62 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  b(newDb);.}../*.
25360 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 75  ** Change the ou
25370 74 70 75 74 20 66 69 6c 65 20 62 61 63 6b 20 74  tput file back t
25380 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  o stdout..**.** 
25390 49 66 20 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f  If the p->doXdgO
253a0 70 65 6e 20 66 6c 61 67 20 69 73 20 73 65 74 2c  pen flag is set,
253b0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
253c0 6f 75 74 70 75 74 20 77 61 73 20 62 65 69 6e 67  output was being
253d0 0a 2a 2a 20 72 65 64 69 72 65 63 74 65 64 20 74  .** redirected t
253e0 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  o a temporary fi
253f0 6c 65 20 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a  le named by p->z
25400 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20 74 68  TempFile.  In th
25410 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e  at case,.** laun
25420 63 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64  ch start/open/xd
25430 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 74  g-open on that t
25440 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
25450 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
25460 74 70 75 74 5f 72 65 73 65 74 28 53 68 65 6c 6c  tput_reset(Shell
25470 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
25480 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d   p->outfile[0]==
25490 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  '|' ){.#ifndef S
254a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
254b0 0a 20 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f  .    pclose(p->o
254c0 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  ut);.#endif.  }e
254d0 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f  lse{.    output_
254e0 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75  file_close(p->ou
254f0 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
25500 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
25510 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f 58 64  .    if( p->doXd
25520 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  gOpen ){.      c
25530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64 67 4f  onst char *zXdgO
25540 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64 65 66  penCmd =.#if def
25550 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20  ined(_WIN32).   
25560 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65 6c 69     "start";.#eli
25570 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
25580 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70 65 6e  E__).      "open
25590 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  ";.#else.      "
255a0 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69  xdg-open";.#endi
255b0 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  f.      char *zC
255c0 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d  md;.      zCmd =
255d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
255e0 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67 4f 70  ("%s %s", zXdgOp
255f0 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46  enCmd, p->zTempF
25600 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
25610 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a  system(zCmd) ){.
25620 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
25630 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 61 69  ntf(stderr, "Fai
25640 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43  led: [%s]\n", zC
25650 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  md);.      }.   
25660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25670 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f 75 74  zCmd);.      out
25680 70 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20  putModePop(p);. 
25690 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65       p->doXdgOpe
256a0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  n = 0;.      sql
256b0 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
256c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
256d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
256e0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20  _NOHAVE_SYSTEM) 
256f0 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  */.  }.  p->outf
25700 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
25710 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
25720 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
25730 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
25740 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
25750 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
25760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
25770 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
25780 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
25790 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
257a0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
257b0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
257c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
257d0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
257e0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
257f0 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
25800 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
25810 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
25820 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
25830 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
25840 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
25850 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
25860 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
25870 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
25880 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
25890 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
258a0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
258b0 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
258c0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
258d0 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
258e0 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
258f0 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
25900 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
25910 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
25920 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
25930 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
25940 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
25950 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
25960 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
25970 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
25980 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
25990 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
259a0 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
259b0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
259c0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
259d0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
259e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
259f0 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
25a00 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
25a10 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
25a20 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
25a30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
25a40 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
25a50 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
25a60 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
25a70 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
25a80 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
25a90 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
25aa0 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
25ab0 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
25ac0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
25ad0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
25ae0 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
25af0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
25b00 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
25b10 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
25b20 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
25b30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
25b40 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
25b50 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
25b60 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
25b70 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
25b80 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
25b90 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
25ba0 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
25bb0 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
25bc0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
25bd0 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
25be0 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
25bf0 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
25c00 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
25c10 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
25c20 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
25c30 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
25c40 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
25c50 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
25c60 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
25c70 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
25c80 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
25c90 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
25ca0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
25cb0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
25cc0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
25cd0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
25ce0 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
25cf0 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
25d00 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
25d10 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
25d20 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
25d30 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
25d40 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
25d50 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
25d60 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
25d70 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
25d80 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
25d90 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
25da0 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
25db0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
25dc0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
25dd0 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
25de0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
25df0 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
25e00 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
25e10 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
25e20 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
25e30 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75    int i, rc;.  u
25e40 6e 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72  nsigned iDataVer
25e50 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  sion;.  char *zS
25e60 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72  chemaTab;.  char
25e70 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20   *zDb = nArg>=2 
25e80 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
25e90 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  in";.  sqlite3_s
25ea0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
25eb0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25ec0 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65  aHdr[100];.  ope
25ed0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
25ee0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  ( p->db==0 ) ret
25ef0 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  urn 1;.  rc = sq
25f00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
25f10 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
25f20 20 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74       "SELECT dat
25f30 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  a FROM sqlite_db
25f40 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70  page(?1) WHERE p
25f50 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  gno=1",.        
25f60 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
25f70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
25f80 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
25f90 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
25fa0 75 73 65 64 28 22 45 4e 41 42 4c 45 5f 44 42 50  used("ENABLE_DBP
25fb0 41 47 45 5f 56 54 41 42 22 29 20 29 7b 0a 20 20  AGE_VTAB") ){.  
25fc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
25fd0 73 74 64 65 72 72 2c 20 22 74 68 65 20 5c 22 2e  stderr, "the \".
25fe0 64 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64  dbinfo\" command
25ff0 20 72 65 71 75 69 72 65 73 20 74 68 65 20 22 0a   requires the ".
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 20 20 20 20 20 22 2d 44 53 51 4c            "-DSQL
26020 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
26030 45 5f 56 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74  E_VTAB compile-t
26040 69 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b  ime options\n");
26050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26060 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26070 64 65 72 72 2c 20 22 65 72 72 6f 72 3a 20 25 73  derr, "error: %s
26080 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
26090 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
260a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
260b0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
260c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
260d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  }.  sqlite3_bind
260e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
260f0 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zDb, -1, SQLITE_
26100 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73  STATIC);.  if( s
26110 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
26120 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
26130 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
26140 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
26150 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20  0)>100.  ){.    
26160 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c  memcpy(aHdr, sql
26170 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
26180 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b  (pStmt,0), 100);
26190 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
261a0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
261b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
261c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
261d0 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61  nable to read da
261e0 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22  tabase header\n"
261f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
26200 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
26210 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26220 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  }.  i = get2byte
26230 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20  Int(aHdr+16);.  
26240 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36  if( i==1 ) i = 6
26250 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69  5536;.  utf8_pri
26260 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
26270 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62  0s %d\n", "datab
26280 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c  ase page size:",
26290 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e   i);.  utf8_prin
262a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
262b0 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20  s %d\n", "write 
262c0 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
262d0 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  8]);.  utf8_prin
262e0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
262f0 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66  s %d\n", "read f
26300 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39  ormat:", aHdr[19
26310 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
26320 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
26330 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65   %d\n", "reserve
26340 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b  d bytes:", aHdr[
26350 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  20]);.  for(i=0;
26360 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69   i<ArraySize(aFi
26370 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eld); i++){.    
26380 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c  int ofst = aFiel
26390 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75  d[i].ofst;.    u
263a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20  nsigned int val 
263b0 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48  = get4byteInt(aH
263c0 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20  dr + ofst);.    
263d0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
263e0 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20  ut, "%-20s %u", 
263f0 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  aField[i].zName,
26400 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63   val);.    switc
26410 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20  h( ofst ){.     
26420 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20   case 56: {.    
26430 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29      if( val==1 )
26440 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
26450 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a  ut, " (utf8)");.
26460 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
26470 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =2 ) raw_printf(
26480 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
26490 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  le)");.        i
264a0 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f  f( val==3 ) raw_
264b0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
264c0 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20   (utf16be)");.  
264d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
264e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
264f0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  t, "\n");.  }.  
26500 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
26510 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
26520 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
26530 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
26540 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  er");.  }else if
26550 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65  ( strcmp(zDb,"te
26560 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  mp")==0 ){.    z
26570 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
26580 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
26590 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  , "sqlite_temp_m
265a0 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
265b0 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
265c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
265d0 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74  tf("\"%w\".sqlit
265e0 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b  e_master", zDb);
265f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
26600 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65  i<ArraySize(aQue
26610 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ry); i++){.    c
26620 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
26630 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65  te3_mprintf(aQue
26640 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68  ry[i].zSql, zSch
26650 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74  emaTab);.    int
26660 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c   val = db_int(p,
26670 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
26680 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
26690 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
266a0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
266b0 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e  d\n", aQuery[i].
266c0 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d  zName, val);.  }
266d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
266e0 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73  zSchemaTab);.  s
266f0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
26700 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  rol(p->db, zDb, 
26710 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
26720 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74  A_VERSION, &iDat
26730 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66  aVersion);.  utf
26740 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
26750 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22   "%-20s %u\n", "
26760 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69  data version", i
26770 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
26780 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26790 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
267a0 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  rent sqlite3_err
267b0 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73  msg() value to s
267c0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
267d0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
267e0 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  t shellDatabaseE
267f0 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rror(sqlite3 *db
26800 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
26810 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zErr = sqlite3_
26820 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74  errmsg(db);.  ut
26830 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26840 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
26850 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
26860 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
26870 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e  pare the pattern
26880 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69   in zGlob[] agai
26890 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20  nst the text in 
268a0 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55  z[].  Return TRU
268b0 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74  E.** if they mat
268c0 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29  ch and FALSE (0)
268d0 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
268e0 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  match..**.** Glo
268f0 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
26900 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
26910 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
26920 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
26930 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
26940 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
26950 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
26960 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
26970 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
26980 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
26990 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
269a0 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
269b0 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
269d0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
269e0 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
269f0 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
26a00 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
26a10 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
26a20 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20  *.**      '#'   
26a30 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
26a40 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20  sequence of one 
26a50 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77  or more digits w
26a60 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20  ith an.**       
26a70 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61           optiona
26a80 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e  l + or - sign in
26a90 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20   front.**.**    
26aa0 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20    ' '       Any 
26ab0 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61  span of whitespa
26ac0 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f  ce matches any o
26ad0 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20  ther span of.** 
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
26af0 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  hitespace..**.**
26b00 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63   Extra whitespac
26b10 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
26b20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  z[] is ignored..
26b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
26b40 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73  stcase_glob(cons
26b50 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63  t char *zGlob, c
26b60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
26b70 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
26b80 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
26b90 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20  seen;..  while( 
26ba0 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29  (c = (*(zGlob++)
26bb0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
26bc0 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20   IsSpace(c) ){. 
26bd0 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63       if( !IsSpac
26be0 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  e(*z) ) return 0
26bf0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
26c00 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29  sSpace(*zGlob) )
26c10 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20   zGlob++;.      
26c20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
26c30 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65  z) ) z++;.    }e
26c40 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29  lse if( c=='*' )
26c50 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
26c60 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20  c=(*(zGlob++))) 
26c70 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27  == '*' || c=='?'
26c80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26c90 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b  c=='?' && (*(z++
26ca0 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
26cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26cc0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
26cd0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
26cf0 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
26d00 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73  while( *z && tes
26d10 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
26d20 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -1,z)==0 ){.    
26d30 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
26d40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
26d50 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20  urn (*z)!=0;.   
26d60 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
26d70 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29  ( (c2 = (*(z++))
26d80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26d90 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a  while( c2!=c ){.
26da0 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
26db0 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  (z++);.         
26dc0 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
26dd0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
26de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73  .        if( tes
26df0 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
26e00 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ,z) ) return 1;.
26e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
26e20 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
26e30 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a  e if( c=='?' ){.
26e40 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b        if( (*(z++
26e50 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
26e60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26e70 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
26e80 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  int prior_c = 0;
26e90 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b  .      seen = 0;
26ea0 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20  .      invert = 
26eb0 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a  0;.      c = *(z
26ec0 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
26ed0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
26ee0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
26ef0 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  ob++);.      if(
26f00 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
26f10 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
26f20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
26f30 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
26f40 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
26f50 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
26f60 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
26f70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
26f80 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
26f90 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
26fa0 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
26fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26fc0 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62  c2=='-' && zGlob
26fd0 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f  [0]!=']' && zGlo
26fe0 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  b[0]!=0 && prior
26ff0 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
27000 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
27010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27020 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
27030 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
27040 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
27050 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
27060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27070 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
27080 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
27090 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
270a0 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
270b0 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
270c0 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  }.        c2 = *
270d0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
270e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
270f0 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
27100 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
27110 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
27120 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
27130 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d     if( (z[0]=='-
27140 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20  ' || z[0]=='+') 
27150 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29  && IsDigit(z[1])
27160 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
27170 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  ( !IsDigit(z[0])
27180 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
27190 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68     z++;.      wh
271a0 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30  ile( IsDigit(z[0
271b0 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ z++; }.   
271c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
271d0 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20  ( c!=(*(z++)) ) 
271e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
271f0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53    }.  while( IsS
27200 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  pace(*z) ){ z++;
27210 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
27220 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0;.}.../*.** Com
27230 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  pare the string 
27240 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  as a command-lin
27250 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69  e option with ei
27260 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  ther one or two.
27270 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63  ** initial "-" c
27280 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
27290 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d  atic int optionM
272a0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
272b0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
272c0 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20  r *zOpt){.  if( 
272d0 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72  zStr[0]!='-' ) r
272e0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b  eturn 0;.  zStr+
272f0 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  +;.  if( zStr[0]
27300 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a  =='-' ) zStr++;.
27310 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
27320 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a  zStr, zOpt)==0;.
27330 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
27340 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  a file..*/.int s
27350 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63  hellDeleteFile(c
27360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
27370 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  name){.  int rc;
27380 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
27390 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
273a0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
273b0 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
273c0 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f  ename);.  rc = _
273d0 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71  wunlink(z);.  sq
273e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
273f0 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69  else.  rc = unli
27400 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  nk(zFilename);.#
27410 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
27420 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  c;.}../*.** Try 
27430 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
27440 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66  mporary file (if
27450 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61   there is one) a
27460 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d  nd free the.** m
27470 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f  emory used to ho
27480 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
27490 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f  he temp file..*/
274a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
274b0 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  arTempFile(Shell
274c0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
274d0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
274e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
274f0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20   p->doXdgOpen ) 
27500 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68  return;.  if( sh
27510 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d  ellDeleteFile(p-
27520 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65  >zTempFile) ) re
27530 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  turn;.  sqlite3_
27540 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  free(p->zTempFil
27550 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69  e);.  p->zTempFi
27560 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  le = 0;.}../*.**
27570 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65   Create a new te
27580 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74  mp file name wit
27590 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66  h the given suff
275a0 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ix..*/.static vo
275b0 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53  id newTempFile(S
275c0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
275d0 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
275e0 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  x){.  clearTempF
275f0 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ile(p);.  sqlite
27600 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46  3_free(p->zTempF
27610 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70  ile);.  p->zTemp
27620 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  File = 0;.  if( 
27630 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
27640 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27650 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49  l(p->db, 0, SQLI
27660 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
27670 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70  ENAME, &p->zTemp
27680 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
27690 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
276a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
276b0 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71  uint64 r;.    sq
276c0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
276d0 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b  (sizeof(r), &r);
276e0 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  .    p->zTempFil
276f0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
27700 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73  ntf("temp%llx.%s
27710 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a  ", r, zSuffix);.
27720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
27730 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
27740 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e  te3_mprintf("%z.
27750 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  %s", p->zTempFil
27760 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  e, zSuffix);.  }
27770 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
27780 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ile==0 ){.    ra
27790 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
277a0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
277b0 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
277c0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
277d0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
277e0 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72  on of SQL scalar
277f0 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63   function fkey_c
27800 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c  ollate_clause(),
27810 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
27820 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
27830 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  xes" command. Th
27840 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  is scalar functi
27850 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  on is always.** 
27860 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72  called with four
27870 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65   arguments - the
27880 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
27890 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63  me, the parent c
278a0 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74  olumn name,.** t
278b0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e  he child table n
278c0 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c  ame and the chil
278d0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
278e0 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c  *.**   fkey_coll
278f0 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65  ate_clause('pare
27900 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74  nt-tab', 'parent
27910 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61  -col', 'child-ta
27920 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29  b', 'child-col')
27930 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
27940 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
27950 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  bles or columns 
27960 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  do not exist, th
27970 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
27980 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20  eturns an empty 
27990 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79  string. An empty
279a0 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20   string is also 
279b0 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68  returned if both
279c0 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63   tables.** and c
279d0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74  olumns exist but
279e0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64   have the same d
279f0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
27a00 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a   sequence. Or,.*
27a10 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20  * if both exist 
27a20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  but the default 
27a30 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
27a40 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ces are differen
27a50 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t, this.** funct
27a60 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
27a70 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45  string " COLLATE
27a80 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
27a90 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c  on>", where.** <
27aa0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
27ab0 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  > is the default
27ac0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
27ad0 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  nce of the paren
27ae0 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  t column..*/.sta
27af0 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b  tic void shellFk
27b00 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28  eyCollateClause(
27b10 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
27b20 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
27b30 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
27b40 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
27b50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
27b60 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
27b70 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
27b80 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
27b90 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  zParent;.  const
27ba0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
27bb0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
27bc0 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63  *zParentSeq;.  c
27bd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
27be0 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
27bf0 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f  *zChildCol;.  co
27c00 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
27c10 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69  Seq = 0;  /* Ini
27c20 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64  tialize to avoid
27c30 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
27c40 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  warning */.  int
27c50 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
27c60 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61  nVal==4 );.  zPa
27c70 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
27c80 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
27c90 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
27ca0 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d  ;.  zParentCol =
27cb0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
27cc0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
27cd0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43  (apVal[1]);.  zC
27ce0 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  hild = (const ch
27cf0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
27d00 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
27d10 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20  ;.  zChildCol = 
27d20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
27d30 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
27d40 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71  apVal[3]);..  sq
27d50 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
27d60 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20  t(pCtx, "", -1, 
27d70 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
27d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
27d90 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
27da0 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20  data(.      db, 
27db0 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c  "main", zParent,
27dc0 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20   zParentCol, 0, 
27dd0 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20  &zParentSeq, 0, 
27de0 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
27df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27e00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27e10 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
27e20 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
27e30 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68   db, "main", zCh
27e40 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20  ild, zChildCol, 
27e50 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30  0, &zChildSeq, 0
27e60 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
27e70 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
27e80 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
27e90 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
27ea0 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29  tSeq, zChildSeq)
27eb0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
27ec0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
27ed0 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c  f(" COLLATE %s",
27ee0 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20   zParentSeq);.  
27ef0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
27f00 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
27f10 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
27f20 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
27f30 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d  3_free(z);.  }.}
27f40 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
27f50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64  lementation of d
27f60 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e  ot-command ".lin
27f70 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e  t fkey-indexes".
27f80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
27f90 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a  intFkeyIndexes(.
27fa0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
27fb0 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
27fc0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
27fd0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
27fe0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
28010 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
28020 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
28030 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28050 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28060 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
28070 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  g[] */.){.  sqli
28080 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65  te3 *db = pState
28090 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
280a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
280b0 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64  o query "main" d
280c0 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  b of */.  FILE *
280d0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
280e0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  t;        /* Str
280f0 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e  eam to write non
28100 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f  -error output to
28110 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f   */.  int bVerbo
28120 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
28130 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72        /* If -ver
28140 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20  bose is present 
28150 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42  */.  int bGroupB
28160 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  yParent = 0;    
28170 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75       /* If -grou
28180 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65  pbyparent is pre
28190 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  sent */.  int i;
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
281c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
281d0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e  azArg[] */.  con
281e0 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74  st char *zIndent
281f0 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20   = "";       /* 
28200 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65  How much to inde
28210 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nt CREATE INDEX 
28220 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  by */.  int rc; 
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28250 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
28260 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
28270 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   0;         /* C
28280 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
28290 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
282a0 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a   below */..  /*.
282b0 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54    ** This SELECT
282c0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
282d0 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
282e0 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
282f0 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
28300 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  in the schema of
28310 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
28320 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76  se. The column v
28330 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a  alues are:.  **.
28340 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74    ** 0. The text
28350 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
28360 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ment similar to:
28370 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28380 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
28390 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
283a0 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48  M child_table WH
283b0 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22  ERE child_key=?"
283c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68  .  **.  **    Th
283d0 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d  is SELECT is sim
283e0 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20  ilar to the one 
283f0 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
28400 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61   keys implementa
28410 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65  tion.  **    nee
28420 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e  ds to run intern
28430 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61  ally on child ta
28440 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  bles. If there i
28450 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
28460 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75  can.  **    be u
28470 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
28480 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
28490 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
284a0 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20  used by the FK. 
284b0 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74   **    implement
284c0 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a  ation to optimiz
284d0 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
284e0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
284f0 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
28500 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a      table..  **.
28510 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70    ** 1. A GLOB p
28520 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20  attern suitable 
28530 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67  for sqlite3_strg
28540 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c  lob(). If the pl
28550 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a  an output by.  *
28560 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e  *    the EXPLAIN
28570 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
28580 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73  and matches this
28590 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74   pattern, then t
285a0 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20  he schema.  **  
285b0 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e    contains an in
285c0 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
285d0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
285e0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
285f0 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72  .  ** 2. Human r
28600 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
28610 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
28620 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20  child table and 
28630 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
28640 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63  **.  **       "c
28650 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
28660 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79  _key1, child_key
28670 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e  2)".  **.  ** 3.
28680 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
28690 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
286a0 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74  bes the parent t
286b0 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
286c0 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
286d0 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74         "parent_t
286e0 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31  able(parent_key1
286f0 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a  , parent_key2)".
28700 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66    **.  ** 4. A f
28710 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ull CREATE INDEX
28720 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
28730 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75  n index that cou
28740 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ld be used to.  
28750 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44  **    optimize D
28760 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
28770 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
28780 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
28790 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
287a0 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
287b0 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63  EX child_table_c
287c0 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c  hild_key ON chil
287d0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
287e0 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e  y)".  **.  ** 5.
287f0 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
28800 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20   parent table.. 
28810 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73   **.  ** These s
28820 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73  ix values are us
28830 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69  ed by the C logi
28840 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72  c below to gener
28850 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a  ate the report..
28860 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
28870 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c  r *zSql =.  "SEL
28880 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20  ECT ".    "     
28890 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  'EXPLAIN QUERY P
288a0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
288b0 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  M ' || quote(s.n
288c0 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20  ame) || ' WHERE 
288d0 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
288e0 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
288f0 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c  s.name) || '.' |
28900 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  | quote(f.[from]
28910 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20  ) || '=?' ".    
28920 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61  "  || fkey_colla
28930 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
28940 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65  "       f.[table
28950 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
28960 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
28970 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
28980 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22  ,' AND ')".    "
28990 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53  , ".    "     'S
289a0 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c  EARCH TABLE ' ||
289b0 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49   s.name || ' USI
289c0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
289d0 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  X*('".    "  || 
289e0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d  group_concat('*=
289f0 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20  ?', ' AND ') || 
28a00 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
28a10 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20    "     s.name  
28a20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
28a30 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
28a40 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a    ', ') || ')'".
28a50 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
28a60 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20     f.[table] || 
28a70 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
28a80 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b  cat(COALESCE(f.[
28a90 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20  to], p.[name])) 
28aa0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
28ab0 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41  .    "     'CREA
28ac0 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75  TE INDEX ' || qu
28ad0 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27  ote(s.name ||'_'
28ae0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28af0 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22  f.[from], '_'))"
28b00 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20  .    "  || ' ON 
28b10 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
28b20 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22  e) || '('".    "
28b30 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
28b40 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  t(quote(f.[from]
28b50 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ) ||".    "     
28b60 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
28b70 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
28b80 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65          f.[table
28b90 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
28ba0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
28bb0 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
28bc0 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20  , ', ')".    "  
28bd0 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20  || ');'".    ", 
28be0 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
28bf0 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f  able] ".    "FRO
28c00 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
28c10 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72  AS s, pragma_for
28c20 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e  eign_key_list(s.
28c30 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20  name) AS f ".   
28c40 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67   "LEFT JOIN prag
28c50 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53  ma_table_info AS
28c60 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20   p ON (pk-1=seq 
28c70 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62  AND p.arg=f.[tab
28c80 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55  le]) ".    "GROU
28c90 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69  P BY s.name, f.i
28ca0 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42  d ".    "ORDER B
28cb0 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54  Y (CASE WHEN ? T
28cc0 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c  HEN f.[table] EL
28cd0 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a  SE s.name END)".
28ce0 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72    ;.  const char
28cf0 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45   *zGlobIPK = "SE
28d00 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49  ARCH TABLE * USI
28d10 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
28d20 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
28d30 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  ";..  for(i=2; i
28d40 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
28d50 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
28d60 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  0(azArg[i]);.   
28d70 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
28d80 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
28d90 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
28da0 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
28db0 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
28dc0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
28dd0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
28de0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
28df0 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
28e00 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
28e10 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
28e20 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
28e30 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
28e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
28e50 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28e60 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
28e70 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
28e80 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
28e90 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
28ea0 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
28eb0 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
28ec0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28ed0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
28ee0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
28ef0 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c  er the fkey_coll
28f00 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c  ate_clause() SQL
28f10 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72   function */.  r
28f20 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
28f30 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
28f40 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c  "fkey_collate_cl
28f50 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ause", 4, SQLITE
28f60 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20  _UTF8,.      0, 
28f70 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
28f80 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29  Clause, 0, 0.  )
28f90 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ;...  if( rc==SQ
28fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
28fb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
28fc0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
28fd0 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a   -1, &pSql, 0);.
28fe0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
28ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
29000 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
29010 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42  pSql, 1, bGroupB
29020 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  yParent);.  }.. 
29030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29040 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
29050 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  2;.    char *zPr
29060 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ev = 0;.    whil
29070 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
29080 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
29090 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
290a0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  es = -1;.      s
290b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
290c0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  plain = 0;.     
290d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
290e0 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  P = (const char*
290f0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
29100 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  text(pSql, 0);. 
29110 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
29120 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *zGlob = (const 
29130 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
29140 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
29150 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
29160 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
29170 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
29180 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
29190 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  Sql, 2);.      c
291a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
291b0 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  et = (const char
291c0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
291d0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a  _text(pSql, 3);.
291e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
291f0 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63   *zCI = (const c
29200 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
29210 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34  umn_text(pSql, 4
29220 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
29230 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28  har *zParent = (
29240 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
29250 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
29260 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20  pSql, 5);..     
29270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
29280 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
29290 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
292a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
292b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
292c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
292d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
292e0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
292f0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
29300 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e  onst char *zPlan
29310 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
29320 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
29330 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
29340 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
29350 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
29360 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
29370 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29  ob(zGlob, zPlan)
29380 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
29390 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
293a0 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61  b(zGlobIPK, zPla
293b0 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n).        );.  
293c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
293d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
293e0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
293f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29400 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
29410 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
29420 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
29430 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
29440 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72  ror: internal er
29450 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62  ror");.        b
29460 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
29470 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  e{.        if( b
29480 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20  GroupByParent.  
29490 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f        && (bVerbo
294a0 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20  se || res==0).  
294b0 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d        && (zPrev=
294c0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
294d0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a  ricmp(zParent, z
294e0 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29  Prev)).        )
294f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
29500 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
29510 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c  Parent table %s\
29520 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  n", zParent);.  
29530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29540 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20  free(zPrev);.   
29550 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73         zPrev = s
29560 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
29570 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  %s", zParent);. 
29580 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
29590 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
295a0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
295b0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20  intf(out, "%s%s 
295c0 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65  --> %s\n", zInde
295d0 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74  nt, zCI, zTarget
295e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
295f0 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
29600 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
29610 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a  rintf(out, "%s/*
29620 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65   no extra indexe
29630 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25  s required for %
29640 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  s -> %s */\n",. 
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e               zIn
29660 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61  dent, zFrom, zTa
29670 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29  rget.          )
29680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29690 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
296a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
296b0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  );..    if( rc!=
296c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
296d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
296e0 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
296f0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
29700 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  );.    }..    rc
29710 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
29720 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20  lize(pSql);.    
29730 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29740 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  K && rc2!=SQLITE
29750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
29760 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77  = rc2;.      raw
29770 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29780 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
29790 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
297a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
297b0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
297c0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
297d0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
297e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
297f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
29800 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c  mentation of ".l
29810 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  int" dot command
29820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29830 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  lintDotCommand(.
29840 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
29850 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
29860 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
29870 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
29880 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
298b0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
298c0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
298d0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29900 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
29910 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
29920 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d  n;.  n = (nArg>=
29930 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 ? strlen30(azA
29940 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69  rg[1]) : 0);.  i
29950 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65  f( n<1 || sqlite
29960 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67  3_strnicmp(azArg
29970 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78  [1], "fkey-index
29980 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75  es", n) ) goto u
29990 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c  sage;.  return l
299a0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70  intFkeyIndexes(p
299b0 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41  State, azArg, nA
299c0 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20  rg);.. usage:.  
299d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
299e0 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62  r, "Usage %s sub
299f0 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68  -command ?switch
29a00 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67  es...?\n", azArg
29a10 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  [0]);.  raw_prin
29a20 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72  tf(stderr, "Wher
29a30 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61  e sub-commands a
29a40 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70  re:\n");.  raw_p
29a50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
29a60 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c     fkey-indexes\
29a70 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
29a80 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23  LITE_ERROR;.}..#
29a90 69 66 20 21 64 65 66 69 6e 65 64 20 53 51 4c 49  if !defined SQLI
29aa0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
29ab0 41 42 4c 45 0a 73 74 61 74 69 63 20 76 6f 69 64  ABLE.static void
29ac0 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20   shellPrepare(. 
29ad0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
29ae0 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f   int *pRc, .  co
29af0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
29b00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
29b10 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70  **ppStmt.){.  *p
29b20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
29b30 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
29b40 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
29b50 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
29b60 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
29b70 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , ppStmt, 0);.  
29b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
29ba0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29bb0 22 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28  "sql error: %s (
29bc0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  %d)\n", .       
29bd0 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
29be0 67 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  g(db), sqlite3_e
29bf0 72 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20  rrcode(db).     
29c00 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   );.      *pRc =
29c10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   rc;.    }.  }.}
29c20 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
29c30 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
29c40 65 6e 74 20 75 73 69 6e 67 20 70 72 69 6e 74 66  ent using printf
29c50 2d 73 74 79 6c 65 20 61 72 67 75 6d 65 6e 74 73  -style arguments
29c60 20 66 6f 72 20 74 68 65 20 53 51 4c 2e 0a 2a 2a   for the SQL..**
29c70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29c80 20 69 73 20 63 6f 75 6c 64 20 62 65 20 6d 61 72   is could be mar
29c90 6b 65 64 20 22 73 74 61 74 69 63 22 2e 20 20 42  ked "static".  B
29ca0 75 74 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 77  ut it is not alw
29cb0 61 79 73 20 75 73 65 64 2c 0a 2a 2a 20 64 65 70  ays used,.** dep
29cc0 65 6e 64 69 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c  ending on compil
29cd0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 2e 20  e-time options. 
29ce0 20 42 79 20 6f 6d 69 74 74 69 6e 67 20 74 68 65   By omitting the
29cf0 20 22 73 74 61 74 69 63 22 2c 20 77 65 20 61 76   "static", we av
29d00 6f 69 64 0a 2a 2a 20 6e 75 69 73 61 6e 63 65 20  oid.** nuisance 
29d10 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
29d20 73 20 61 62 6f 75 74 20 22 64 65 66 69 6e 65 64  s about "defined
29d30 20 62 75 74 20 6e 6f 74 20 75 73 65 64 22 2e 0a   but not used"..
29d40 2a 2f 0a 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  */.void shellPre
29d50 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71  parePrintf(.  sq
29d60 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
29d70 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
29d80 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
29d90 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
29da0 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a  zFmt, .  ....){.
29db0 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
29dc0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
29dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c  E_OK ){.    va_l
29de0 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72  ist ap;.    char
29df0 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72   *z;.    va_star
29e00 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
29e10 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
29e20 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
29e30 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
29e40 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
29e50 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
29e60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
29e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65  }else{.      she
29e80 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70 52  llPrepare(db, pR
29e90 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20  c, z, ppStmt);. 
29ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29eb0 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(z);.    }.  }.
29ec0 7d 0a 0a 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74  }../* Finalize t
29ed0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
29ee0 65 6d 65 6e 74 20 63 72 65 61 74 65 64 20 75 73  ement created us
29ef0 69 6e 67 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ing shellPrepare
29f00 50 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  Printf()..**.** 
29f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
29f20 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64 20  could be marked 
29f30 22 73 74 61 74 69 63 22 2e 20 20 42 75 74 20 69  "static".  But i
29f40 74 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  t is not always 
29f50 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69  used,.** dependi
29f60 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69  ng on compile-ti
29f70 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20  me options.  By 
29f80 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73 74  omitting the "st
29f90 61 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64 0a  atic", we avoid.
29fa0 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70  ** nuisance comp
29fb0 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62  iler warnings ab
29fc0 6f 75 74 20 22 64 65 66 69 6e 65 64 20 62 75 74  out "defined but
29fd0 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76   not used"..*/.v
29fe0 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  oid shellFinaliz
29ff0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
2a000 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2a010 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70  pStmt.){.  if( p
2a020 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
2a030 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
2a040 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
2a050 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  t);.    int rc =
2a060 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2a070 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
2a080 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
2a090 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
2a0a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a0b0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2a0c0 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
2a0d0 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
2a0e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
2a0f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a100 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
2a110 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 65  }.  }.}../* Rese
2a120 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  t the prepared s
2a130 74 61 74 65 6d 65 6e 74 20 63 72 65 61 74 65 64  tatement created
2a140 20 75 73 69 6e 67 20 73 68 65 6c 6c 50 72 65 70   using shellPrep
2a150 61 72 65 50 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a  arePrintf()..**.
2a160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a170 69 73 20 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b  is could be mark
2a180 65 64 20 22 73 74 61 74 69 63 22 2e 20 20 42 75  ed "static".  Bu
2a190 74 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 77 61  t it is not alwa
2a1a0 79 73 20 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65  ys used,.** depe
2a1b0 6e 64 69 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65  nding on compile
2a1c0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20  -time options.  
2a1d0 42 79 20 6f 6d 69 74 74 69 6e 67 20 74 68 65 20  By omitting the 
2a1e0 22 73 74 61 74 69 63 22 2c 20 77 65 20 61 76 6f  "static", we avo
2a1f0 69 64 0a 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63  id.** nuisance c
2a200 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
2a210 20 61 62 6f 75 74 20 22 64 65 66 69 6e 65 64 20   about "defined 
2a220 62 75 74 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a  but not used"..*
2a230 2f 0a 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65  /.void shellRese
2a240 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  t(.  int *pRc, .
2a250 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2a260 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pStmt.){.  int r
2a270 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
2a280 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
2a290 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
2a2a0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ){.    if( rc!=S
2a2b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a2c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2a2d0 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
2a2e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2a2f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a300 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
2a310 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2a320 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
2a330 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  .    *pRc = rc;.
2a340 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2a350 21 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f  !defined SQLITE_
2a360 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2a370 45 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  E */..#if !defin
2a380 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2a390 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2a3a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
2a3b0 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a  AVE_ZLIB)./*****
2a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2a410 54 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f  The ".archive" o
2a420 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  r ".ar" command.
2a430 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  .*/./*.** Struct
2a440 75 72 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ure representing
2a450 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72 22 20   a single ".ar" 
2a460 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65  command..*/.type
2a470 64 65 66 20 73 74 72 75 63 74 20 41 72 43 6f 6d  def struct ArCom
2a480 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a  mand ArCommand;.
2a490 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
2a4a0 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20 20 20   {.  u8 eCmd;   
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4c0 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d       /* An AR_CM
2a4d0 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75  D_* value */.  u
2a4e0 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20  8 bVerbose;     
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a500 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62  * True if --verb
2a510 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70  ose */.  u8 bZip
2a520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a540 20 69 66 20 74 68 65 20 61 72 63 68 69 76 65 20   if the archive 
2a550 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38  is a ZIP */.  u8
2a560 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20 20 20   bDryRun;       
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a580 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79 2d 72   True if --dry-r
2a590 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70 70 65  un */.  u8 bAppe
2a5a0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2a5b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a5c0 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20  if --append */. 
2a5d0 20 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b   u8 fromCmdLine;
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20   /* Run from -A 
2a600 69 6e 73 74 65 61 64 20 6f 66 20 2e 61 72 63 68  instead of .arch
2a610 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ive */.  int nAr
2a620 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2a630 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a640 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  er of command ar
2a650 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2a660 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20 20  r *zSrcTable;   
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a680 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c  "sqlar", "zipfil
2a690 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22 7a 69  e($file)" or "zi
2a6a0 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  p" */.  const ch
2a6b0 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
2a6c0 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c          /* --fil
2a6d0 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  e argument, or N
2a6e0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
2a6f0 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20  har *zDir;      
2a700 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69           /* --di
2a710 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74  rectory argument
2a720 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
2a730 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20  har **azArg;    
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a750 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61  * Array of comma
2a760 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2a770 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b    ShellState *p;
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65    /* Shell state
2a7a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2a7b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2a7c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2a7d0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2a7e0 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a   archive */.};..
2a7f0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73  /*.** Print a us
2a800 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72 20  age message for 
2a810 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
2a820 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
2a830 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a840 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R..*/.static int
2a850 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a 66   arUsage(FILE *f
2a860 29 7b 0a 20 20 73 68 6f 77 48 65 6c 70 28 66 2c  ){.  showHelp(f,
2a870 22 61 72 63 68 69 76 65 22 29 3b 0a 20 20 72 65  "archive");.  re
2a880 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a890 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  R;.}../*.** Prin
2a8a0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
2a8b0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
2a8c0 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
2a8d0 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20   and return .** 
2a8e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
2a8f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72  .static int arEr
2a900 72 6f 72 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64  rorMsg(ArCommand
2a910 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61   *pAr, const cha
2a920 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
2a930 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2a940 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61  har *z;.  va_sta
2a950 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
2a960 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
2a970 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
2a980 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2a990 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2a9a0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
2a9b0 22 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 41 72  ", z);.  if( pAr
2a9c0 2d 3e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b  ->fromCmdLine ){
2a9d0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2a9e0 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22  (stderr, "Use \"
2a9f0 2d 41 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68 65  -A\" for more he
2aa00 6c 70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  lp\n");.  }else{
2aa10 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2aa20 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22  (stderr, "Use \"
2aa30 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c  .archive --help\
2aa40 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c  " for more help\
2aa50 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n");.  }.  sqlit
2aa60 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
2aa70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2aa80 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  R;.}../*.** Valu
2aa90 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64  es for ArCommand
2aaa0 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  .eCmd..*/.#defin
2aab0 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  e AR_CMD_CREATE 
2aac0 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
2aad0 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20  AR_CMD_UPDATE   
2aae0 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41 52      2.#define AR
2aaf0 5f 43 4d 44 5f 49 4e 53 45 52 54 20 20 20 20 20  _CMD_INSERT     
2ab00 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    3.#define AR_C
2ab10 4d 44 5f 45 58 54 52 41 43 54 20 20 20 20 20 20  MD_EXTRACT      
2ab20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  4.#define AR_CMD
2ab30 5f 4c 49 53 54 20 20 20 20 20 20 20 20 20 35 0a  _LIST         5.
2ab40 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 48  #define AR_CMD_H
2ab50 45 4c 50 20 20 20 20 20 20 20 20 20 36 0a 0a 2f  ELP         6../
2ab60 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e 6f 6e 2d  *.** Other (non-
2ab70 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74 63 68 65  command) switche
2ab80 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52  s..*/.#define AR
2ab90 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 20  _SWITCH_VERBOSE 
2aba0 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 41 52      7.#define AR
2abb0 5f 53 57 49 54 43 48 5f 46 49 4c 45 20 20 20 20  _SWITCH_FILE    
2abc0 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 41 52      8.#define AR
2abd0 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52  _SWITCH_DIRECTOR
2abe0 59 20 20 20 39 0a 23 64 65 66 69 6e 65 20 41 52  Y   9.#define AR
2abf0 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 20 20  _SWITCH_APPEND  
2ac00 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 41 52     10.#define AR
2ac10 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 20 20  _SWITCH_DRYRUN  
2ac20 20 20 20 31 31 0a 0a 73 74 61 74 69 63 20 69 6e     11..static in
2ac30 74 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  t arProcessSwitc
2ac40 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  h(ArCommand *pAr
2ac50 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c 20 63  , int eSwitch, c
2ac60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
2ac70 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53 77 69  {.  switch( eSwi
2ac80 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73 65 20  tch ){.    case 
2ac90 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20  AR_CMD_CREATE:. 
2aca0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45     case AR_CMD_E
2acb0 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61 73 65  XTRACT:.    case
2acc0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20   AR_CMD_LIST:.  
2acd0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 55 50    case AR_CMD_UP
2ace0 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41  DATE:.    case A
2acf0 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20  R_CMD_INSERT:.  
2ad00 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45    case AR_CMD_HE
2ad10 4c 50 3a 0a 20 20 20 20 20 20 69 66 28 20 70 41  LP:.      if( pA
2ad20 72 2d 3e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  r->eCmd ){.     
2ad30 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2ad40 72 4d 73 67 28 70 41 72 2c 20 22 6d 75 6c 74 69  rMsg(pAr, "multi
2ad50 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  ple command opti
2ad60 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ons");.      }. 
2ad70 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d       pAr->eCmd =
2ad80 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20   eSwitch;.      
2ad90 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
2ada0 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
2adb0 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44  N:.      pAr->bD
2adc0 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ryRun = 1;.     
2add0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2ade0 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
2adf0 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  SE:.      pAr->b
2ae00 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
2ae10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2ae20 73 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  se AR_SWITCH_APP
2ae30 45 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  END:.      pAr->
2ae40 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20  bAppend = 1;.   
2ae50 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
2ae60 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20  into --file */. 
2ae70 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
2ae80 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41  H_FILE:.      pA
2ae90 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b  r->zFile = zArg;
2aea0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2aeb0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
2aec0 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20  _DIRECTORY:.    
2aed0 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41    pAr->zDir = zA
2aee0 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rg;.      break;
2aef0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2af00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2af10 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d  ** Parse the com
2af20 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e  mand line for an
2af30 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20   ".ar" command. 
2af40 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2af50 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2af60 73 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29  structure (*pAr)
2af70 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
2af80 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
2af90 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70  ommand line is p
2afa0 61 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73  arsed.** success
2afb0 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65  fully, otherwise
2afc0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2afd0 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
2afe0 73 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53  stderr and .** S
2aff0 51 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75  QLITE_ERROR retu
2b000 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2b010 69 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  int arParseComma
2b020 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41  nd(.  char **azA
2b030 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
2b040 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2b050 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
2b060 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
2b070 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  d */.  int nArg,
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2b0a0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2b0b0 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f  zArg[] */.  ArCo
2b0c0 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20  mmand *pAr      
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b0e0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a  opulate this obj
2b0f0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2b100 63 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20  ct ArSwitch {.  
2b110 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
2b120 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53  ong;.    char cS
2b130 68 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77  hort;.    u8 eSw
2b140 69 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72  itch;.    u8 bAr
2b150 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d  g;.  } aSwitch[]
2b160 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61   = {.    { "crea
2b170 74 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f  te",    'c', AR_
2b180 43 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20  CMD_CREATE,     
2b190 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78    0 },.    { "ex
2b1a0 74 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41  tract",   'x', A
2b1b0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20  R_CMD_EXTRACT,  
2b1c0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2b1d0 69 6e 73 65 72 74 22 2c 20 20 20 20 27 69 27 2c  insert",    'i',
2b1e0 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 2c 20   AR_CMD_INSERT, 
2b1f0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2b200 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20 27 74   "list",      't
2b210 27 2c 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20  ', AR_CMD_LIST, 
2b220 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
2b230 20 7b 20 22 75 70 64 61 74 65 22 2c 20 20 20 20   { "update",    
2b240 27 75 27 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41  'u', AR_CMD_UPDA
2b250 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  TE,       0 },. 
2b260 20 20 20 7b 20 22 68 65 6c 70 22 2c 20 20 20 20     { "help",    
2b270 20 20 27 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45    'h', AR_CMD_HE
2b280 4c 50 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  LP,         0 },
2b290 0a 20 20 20 20 7b 20 22 76 65 72 62 6f 73 65 22  .    { "verbose"
2b2a0 2c 20 20 20 27 76 27 2c 20 41 52 5f 53 57 49 54  ,   'v', AR_SWIT
2b2b0 43 48 5f 56 45 52 42 4f 53 45 2c 20 20 20 30 20  CH_VERBOSE,   0 
2b2c0 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65 22 2c  },.    { "file",
2b2d0 20 20 20 20 20 20 27 66 27 2c 20 41 52 5f 53 57        'f', AR_SW
2b2e0 49 54 43 48 5f 46 49 4c 45 2c 20 20 20 20 20 20  ITCH_FILE,      
2b2f0 31 20 7d 2c 0a 20 20 20 20 7b 20 22 61 70 70 65  1 },.    { "appe
2b300 6e 64 22 2c 20 20 20 20 27 61 27 2c 20 41 52 5f  nd",    'a', AR_
2b310 53 57 49 54 43 48 5f 41 50 50 45 4e 44 2c 20 20  SWITCH_APPEND,  
2b320 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69    1 },.    { "di
2b330 72 65 63 74 6f 72 79 22 2c 20 27 43 27 2c 20 41  rectory", 'C', A
2b340 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
2b350 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22  RY, 1 },.    { "
2b360 64 72 79 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c  dryrun",    'n',
2b370 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
2b380 4e 2c 20 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a  N,    0 },.  };.
2b390 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20 3d 20    int nSwitch = 
2b3a0 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68 29 20  sizeof(aSwitch) 
2b3b0 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  / sizeof(struct 
2b3c0 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73 74 72  ArSwitch);.  str
2b3d0 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 45  uct ArSwitch *pE
2b3e0 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b 6e 53  nd = &aSwitch[nS
2b3f0 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e  witch];..  if( n
2b400 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74  Arg<=1 ){.    ut
2b410 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b420 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20  , "Wrong number 
2b430 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 55  of arguments.  U
2b440 73 61 67 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72  sage:\n");.    r
2b450 65 74 75 72 6e 20 61 72 55 73 61 67 65 28 73 74  eturn arUsage(st
2b460 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derr);.  }else{.
2b470 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
2b480 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20  Arg[1];.    if( 
2b490 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]!='-' ){.   
2b4a0 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61     /* Traditiona
2b4b0 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e  l style [tar] in
2b4c0 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  vocation */.    
2b4d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
2b4e0 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20 20 20  nt iArg = 2;.   
2b4f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
2b500 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2b510 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2b520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
2b530 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
2b540 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Opt;.        for
2b550 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30  (pOpt=&aSwitch[0
2b560 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f  ]; pOpt<pEnd; pO
2b570 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pt++){.         
2b580 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d   if( z[i]==pOpt-
2b590 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b  >cShort ) break;
2b5a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b5b0 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
2b5c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  d ){.          r
2b5d0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2b5e0 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  (pAr, "unrecogni
2b5f0 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c  zed option: %c",
2b600 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20   z[i]);.        
2b610 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
2b620 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
2b630 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
2b640 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nArg ){.        
2b650 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2b660 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69  orMsg(pAr, "opti
2b670 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
2b680 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69  rgument: %c",z[i
2b690 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
2b6a0 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
2b6b0 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a   azArg[iArg++];.
2b6c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b6d0 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
2b6e0 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d  witch(pAr, pOpt-
2b6f0 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
2b700 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b710 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
2b720 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d       pAr->nArg =
2b730 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20   nArg-iArg;.    
2b740 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e    if( pAr->nArg>
2b750 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  0 ){.        pAr
2b760 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
2b770 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a  [iArg];.      }.
2b780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b790 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f   /* Non-traditio
2b7a0 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  nal invocation *
2b7b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67  /.      int iArg
2b7c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41 72 67  ;.      for(iArg
2b7d0 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20 69  =1; iArg<nArg; i
2b7e0 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Arg++){.        
2b7f0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a  int n;.        z
2b800 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a   = azArg[iArg];.
2b810 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
2b820 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  !='-' ){.       
2b830 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e     /* All remain
2b840 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
2b850 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d 6d 61   words are comma
2b860 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f  nd arguments. */
2b870 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
2b880 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69  azArg = &azArg[i
2b890 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
2b8a0 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
2b8b0 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  -iArg;.         
2b8c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b8d0 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74  }.        n = st
2b8e0 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20  rlen30(z);..    
2b8f0 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d      if( z[1]!='-
2b900 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
2b910 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
2b920 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  /* One or more s
2b930 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  hort options */.
2b940 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2b950 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<n; i++){.  
2b960 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2b970 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
2b980 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2b990 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
2b9a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  t;.            f
2b9b0 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
2b9c0 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
2b9d0 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
2b9e0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
2b9f0 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20  =pOpt->cShort ) 
2ba00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ba20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
2ba30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ba40 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2ba50 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
2ba60 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63  nized option: %c
2ba70 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ", z[i]);.      
2ba80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ba90 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41      if( pOpt->bA
2baa0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
2bab0 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20      if( i<(n-1) 
2bac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bad0 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31     zArg = &z[i+1
2bae0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2baf0 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20     i = n;.      
2bb00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2bb20 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31  f( iArg>=(nArg-1
2bb30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2bb40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2bb50 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f  ErrorMsg(pAr, "o
2bb60 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
2bb70 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c  n argument: %c",
2bb80 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
2bb90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bba0 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
2bbb0 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20  azArg[++iArg];. 
2bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2bbe0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50           if( arP
2bbf0 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
2bc00 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c  , pOpt->eSwitch,
2bc10 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
2bc20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2bc30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bc40 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d    }else if( z[2]
2bc50 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20  =='\0' ){.      
2bc60 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69      /* A -- opti
2bc70 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  on, indicating t
2bc80 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e  hat all remainin
2bc90 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77  g command line w
2bca0 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ords.          *
2bcb0 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72  * are command ar
2bcc0 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20  guments.  */.   
2bcd0 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2bce0 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 2b  g = &azArg[iArg+
2bcf0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41  1];.          pA
2bd00 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
2bd10 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Arg-1;.         
2bd20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2bd30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bd40 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f   /* A long optio
2bd50 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  n */.          c
2bd60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20  onst char *zArg 
2bd70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2bd80 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f 72   /* Argument for
2bd90 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20   option, if any 
2bda0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  */.          str
2bdb0 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4d  uct ArSwitch *pM
2bdc0 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20 2f  atch = 0;      /
2bdd0 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74 69 6f  * Matching optio
2bde0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  n */.          s
2bdf0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
2be00 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  pOpt;           
2be10 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a   /* Iterator */.
2be20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f            for(pO
2be30 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
2be40 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
2be50 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2be60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e  const char *zLon
2be70 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b  g = pOpt->zLong;
2be80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2be90 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30   (n-2)<=strlen30
2bea0 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65  (zLong) && 0==me
2beb0 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e  mcmp(&z[2], zLon
2bec0 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20  g, n-2) ){.     
2bed0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
2bee0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
2bef0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2bf00 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 61  ErrorMsg(pAr, "a
2bf10 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a  mbiguous option:
2bf20 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20   %s",z);.       
2bf30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d                pM
2bf50 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20  atch = pOpt;.   
2bf60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2bf70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bf80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2bf90 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20    if( pMatch==0 
2bfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2bfb0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2bfc0 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  (pAr, "unrecogni
2bfd0 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c  zed option: %s",
2bfe0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   z);.          }
2bff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c000 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20  Match->bArg ){. 
2c010 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2c020 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b  Arg>=(nArg-1) ){
2c030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2c040 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2c050 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  (pAr, "option re
2c060 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
2c070 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  nt: %s", z);.   
2c080 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c090 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
2c0a0 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20  Arg[++iArg];.   
2c0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c0c0 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
2c0d0 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74  Switch(pAr, pMat
2c0e0 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  ch->eSwitch, zAr
2c0f0 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
2c100 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2c110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c120 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2c130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2c140 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2c150 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
2c160 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74  ll arguments wit
2c170 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e  hin the ArComman
2c180 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72  d.azArg[].** arr
2c190 61 79 20 72 65 66 65 72 20 74 6f 20 61 72 63 68  ay refer to arch
2c1a0 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20  ive members, as 
2c1b0 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63  for the --extrac
2c1c0 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d  t or --list comm
2c1d0 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65  ands. .** It che
2c1e0 63 6b 73 20 74 68 61 74 20 65 61 63 68 20 6f 66  cks that each of
2c1f0 20 74 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e   them are presen
2c200 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63 69 66  t. If any specif
2c210 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  ied file is not.
2c220 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
2c230 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72  e archive, an er
2c240 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64 20 74  ror is printed t
2c250 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20  o stderr and an 
2c260 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65  error.** code re
2c270 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
2c280 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66  e, if all specif
2c290 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72  ied arguments ar
2c2a0 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  e present in.** 
2c2b0 74 68 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c  the archive, SQL
2c2c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2c2d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
2c2e0 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61  unction strips a
2c2f0 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20  ny trailing '/' 
2c300 63 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20  characters from 
2c310 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  each argument..*
2c320 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73  * This is consis
2c330 74 65 6e 74 20 77 69 74 68 20 74 68 65 20 77 61  tent with the wa
2c340 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d  y the [tar] comm
2c350 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72  and seems to wor
2c360 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a  k on.** Linux..*
2c370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 43  /.static int arC
2c380 68 65 63 6b 45 6e 74 72 69 65 73 28 41 72 43 6f  heckEntries(ArCo
2c390 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69  mmand *pAr){.  i
2c3a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c3b0 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41  K;.  if( pAr->nA
2c3c0 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  rg ){.    int i,
2c3d0 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   j;.    sqlite3_
2c3e0 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b  stmt *pTest = 0;
2c3f0 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  ..    shellPrepa
2c400 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62  rePrintf(pAr->db
2c410 2c 20 26 72 63 2c 20 26 70 54 65 73 74 2c 0a 20  , &rc, &pTest,. 
2c420 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2c430 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52  ame FROM %s WHER
2c440 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a  E name=$name", .
2c450 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72          pAr->zSr
2c460 63 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20  cTable.    );.  
2c470 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
2c480 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
2c490 65 78 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65  ex(pTest, "$name
2c4a0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
2c4b0 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20   i<pAr->nArg && 
2c4c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
2c4d0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
2c4e0 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b  *z = pAr->azArg[
2c4f0 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  i];.      int n 
2c500 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
2c510 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
2c520 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  ;.      while( n
2c530 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >0 && z[n-1]=='/
2c540 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
2c550 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [n] = '\0';.    
2c560 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
2c570 65 78 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c  ext(pTest, j, z,
2c580 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
2c590 49 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  IC);.      if( S
2c5a0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2c5b0 65 33 5f 73 74 65 70 28 70 54 65 73 74 29 20 29  e3_step(pTest) )
2c5c0 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  {.        bOk = 
2c5d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2c5e0 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c   shellReset(&rc,
2c5f0 20 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69   pTest);.      i
2c600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c610 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20   && bOk==0 ){.  
2c620 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c630 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66  f(stderr, "not f
2c640 6f 75 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a  ound in archive:
2c650 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
2c660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c670 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
2c680 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
2c690 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73  nalize(&rc, pTes
2c6a0 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
2c6b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   rc;.}../*.** Fo
2c6c0 72 6d 61 74 20 61 20 57 48 45 52 45 20 63 6c 61  rmat a WHERE cla
2c6d0 75 73 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  use that can be 
2c6e0 75 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  used against the
2c6f0 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74   "sqlar" table t
2c700 6f 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c  o.** identify al
2c710 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
2c720 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
2c730 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
2c740 74 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a  ts held.** in (*
2c750 70 41 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73  pAr). Leave this
2c760 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2c770 20 28 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f   (*pzWhere) befo
2c780 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2c790 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
2c7a0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
2c7b0 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e  ventually callin
2c7c0 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
2c7d0 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e   on.** any non-N
2c7e0 55 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76  ULL (*pzWhere) v
2c7f0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2c800 76 6f 69 64 20 61 72 57 68 65 72 65 43 6c 61 75  void arWhereClau
2c810 73 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  se(.  int *pRc, 
2c820 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
2c830 72 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57  r, .  char **pzW
2c840 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20  here            
2c850 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
2c860 77 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  w WHERE clause *
2c870 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68  /.){.  char *zWh
2c880 65 72 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  ere = 0;.  if( *
2c890 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2c8a0 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e  {.    if( pAr->n
2c8b0 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
2c8c0 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  zWhere = sqlite3
2c8d0 5f 6d 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20  _mprintf("1");. 
2c8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c8f0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e  int i;.      con
2c900 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
2c910 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  "";.      for(i=
2c920 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20  0; i<pAr->nArg; 
2c930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
2c940 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41  nst char *z = pA
2c950 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20  r->azArg[i];.   
2c960 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71       zWhere = sq
2c970 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
2c980 20 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e           "%z%s n
2c990 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75  ame = '%q' OR su
2c9a0 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20  bstr(name,1,%d) 
2c9b0 3d 20 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20  = '%q/'", .     
2c9c0 20 20 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65       zWhere, zSe
2c9d0 70 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a  p, z, strlen30(z
2c9e0 29 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29  )+1, z.        )
2c9f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57  ;.        if( zW
2ca00 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  here==0 ){.     
2ca10 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
2ca20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2ca30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ca40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65     }.        zSe
2ca50 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20  p = " OR ";.    
2ca60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ca70 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72  *pzWhere = zWher
2ca80 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  e;.}../*.** Impl
2ca90 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
2caa0 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64  r "lisT" command
2cab0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
2cac0 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41   arListCommand(A
2cad0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a  rCommand *pAr){.
2cae0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2caf0 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20  ql = "SELECT %s 
2cb00 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73  FROM %s WHERE %s
2cb10 22 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  "; .  const char
2cb20 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20   *azCols[] = {. 
2cb30 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22     "name",.    "
2cb40 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a  lsmode(mode), sz
2cb50 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65  , datetime(mtime
2cb60 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 20  , 'unixepoch'), 
2cb70 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68  name".  };..  ch
2cb80 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a  ar *zWhere = 0;.
2cb90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2cba0 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pSql = 0;.  int 
2cbb0 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68  rc;..  rc = arCh
2cbc0 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b  eckEntries(pAr);
2cbd0 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  .  arWhereClause
2cbe0 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65  (&rc, pAr, &zWhe
2cbf0 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65  re);..  shellPre
2cc00 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e  parePrintf(pAr->
2cc10 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20  db, &rc, &pSql, 
2cc20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72  zSql, azCols[pAr
2cc30 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20  ->bVerbose],.   
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc50 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65    pAr->zSrcTable
2cc60 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66 28  , zWhere);.  if(
2cc70 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
2cc80 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2cc90 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
2cca0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71  s\n", sqlite3_sq
2ccb0 6c 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73  l(pSql));.  }els
2ccc0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  e{.    while( rc
2ccd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2cce0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2ccf0 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
2cd00 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
2cd10 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
2cd20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2cd30 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2cd40 20 25 20 31 30 64 20 20 25 73 20 20 25 73 5c 6e   % 10d  %s  %s\n
2cd50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
2cd60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2cd70 78 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20  xt(pSql, 0),.   
2cd80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cd90 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
2cda0 2c 20 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20  , 1), .         
2cdb0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
2cdc0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 2c  n_text(pSql, 2),
2cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cde0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2cdf0 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20 20 20  (pSql, 3).      
2ce00 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65    );.      }else
2ce10 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2ce20 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2ce30 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
2ce40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2ce50 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  Sql, 0));.      
2ce60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68  }.    }.  }.  sh
2ce70 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
2ce80 20 70 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65   pSql);.  sqlite
2ce90 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
2cea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ceb0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2cec0 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58  ation of .ar "eX
2ced0 74 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20  tract" command. 
2cee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2cef0 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28  rExtractCommand(
2cf00 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
2cf10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cf20 53 71 6c 31 20 3d 20 0a 20 20 20 20 22 53 45 4c  Sql1 = .    "SEL
2cf30 45 43 54 20 22 0a 20 20 20 20 22 20 28 24 64 69  ECT ".    " ($di
2cf40 72 20 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20  r || name),".   
2cf50 20 22 20 77 72 69 74 65 66 69 6c 65 28 28 24 64   " writefile(($d
2cf60 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c  ir || name), %s,
2cf70 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a   mode, mtime) ".
2cf80 20 20 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45      "FROM %s WHE
2cf90 52 45 20 28 25 73 29 20 41 4e 44 20 28 64 61 74  RE (%s) AND (dat
2cfa0 61 20 49 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69  a IS NULL OR $di
2cfb0 72 4f 6e 6c 79 20 3d 20 30 29 22 0a 20 20 20 20  rOnly = 0)".    
2cfc0 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47  " AND name NOT G
2cfd0 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22  LOB '*..[/\\]*'"
2cfe0 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
2cff0 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d 20  *azExtraArg[] = 
2d000 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75 6e  { .    "sqlar_un
2d010 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73  compress(data, s
2d020 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22 0a  z)",.    "data".
2d030 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f    };..  sqlite3_
2d040 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
2d050 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d060 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44  E_OK;.  char *zD
2d070 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ir = 0;.  char *
2d080 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e  zWhere = 0;.  in
2d090 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66  t i, j;..  /* If
2d0a0 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73   arguments are s
2d0b0 70 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20  pecified, check 
2d0c0 74 68 61 74 20 74 68 65 79 20 61 63 74 75 61 6c  that they actual
2d0d0 6c 79 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a  ly exist within.
2d0e0 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65    ** the archive
2d0f0 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
2d100 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74  ng. And formulat
2d110 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
2d120 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74   to.  ** match t
2d130 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  hem.  */.  rc = 
2d140 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70  arCheckEntries(p
2d150 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c  Ar);.  arWhereCl
2d160 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26  ause(&rc, pAr, &
2d170 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20  zWhere);..  if( 
2d180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d190 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44  .    if( pAr->zD
2d1a0 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72  ir ){.      zDir
2d1b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2d1c0 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a  tf("%s/", pAr->z
2d1d0 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Dir);.    }else{
2d1e0 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71  .      zDir = sq
2d1f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22  lite3_mprintf(""
2d200 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d210 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20   zDir==0 ) rc = 
2d220 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2d230 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  }..  shellPrepar
2d240 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
2d250 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
2d260 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74  l1, .      azExt
2d270 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d  raArg[pAr->bZip]
2d280 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65  , pAr->zSrcTable
2d290 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20  , zWhere.  );.. 
2d2a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d2b0 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71  OK ){.    j = sq
2d2c0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2d2d0 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
2d2e0 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73 71   "$dir");.    sq
2d2f0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
2d300 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d  pSql, j, zDir, -
2d310 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
2d320 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74  );..    /* Run t
2d330 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2d340 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20 66  ent twice. The f
2d350 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65  irst time, write
2d360 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  file() is called
2d370 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  .    ** for all 
2d380 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
2d390 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65  that should be e
2d3a0 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73 65  xtracted. The se
2d3b0 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a  cond time,.    *
2d3c0 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64  * only for the d
2d3d0 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73  irectories. This
2d3e0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
2d3f0 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20  timestamps for. 
2d400 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
2d410 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74  directories must
2d420 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72 20   be reset after 
2d430 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74  they are populat
2d440 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f  ed (as.    ** po
2d450 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68  pulating them ch
2d460 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73 74  anges the timest
2d470 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  amp).  */.    fo
2d480 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
2d490 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69  {.      j = sqli
2d4a0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2d4b0 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22  er_index(pSql, "
2d4c0 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20  $dirOnly");.    
2d4d0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
2d4e0 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a  nt(pSql, j, i);.
2d4f0 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62        if( pAr->b
2d500 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
2d510 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2d520 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2d530 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
2d540 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql));.      }el
2d550 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
2d560 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2d570 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
2d580 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
2d590 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
2d5a0 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d  if( i==0 && pAr-
2d5b0 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  >bVerbose ){.   
2d5c0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
2d5d0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2d5e0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
2d5f0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2d600 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20  ql, 0));.       
2d610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
2d630 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53 71  llReset(&rc, pSq
2d640 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  l);.    }.    sh
2d650 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
2d660 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73   pSql);.  }..  s
2d670 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69 72  qlite3_free(zDir
2d680 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2d690 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(zWhere);.  ret
2d6a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d6b0 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61   Run the SQL sta
2d6c0 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20  tement in zSql. 
2d6d0 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20 2d   Or if doing a -
2d6e0 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20  -dryrun, merely 
2d6f0 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f  print it out..*/
2d700 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
2d710 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20  ecSql(ArCommand 
2d720 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pAr, const char
2d730 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72   *zSql){.  int r
2d740 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  c;.  if( pAr->bD
2d750 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
2d760 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2d770 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
2d780 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ql);.    rc = SQ
2d790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2d7a0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
2d7b0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
2d7c0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
2d7d0 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
2d7e0 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
2d7f0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75   zErr ){.      u
2d800 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
2d810 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22  t, "ERROR: %s\n"
2d820 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
2d830 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2d840 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2d850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2d860 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2d870 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74  on of .ar "creat
2d880 65 22 2c 20 22 69 6e 73 65 72 74 22 2c 20 61 6e  e", "insert", an
2d890 64 20 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61  d "update" comma
2d8a0 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  nds..**.**     c
2d8b0 72 65 61 74 65 20 20 20 20 2d 3e 20 20 20 20 20  reate    ->     
2d8c0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
2d8d0 20 61 72 63 68 69 76 65 0a 2a 2a 20 20 20 20 20   archive.**     
2d8e0 69 6e 73 65 72 74 20 20 20 20 2d 3e 20 20 20 20  insert    ->    
2d8f0 20 49 6e 73 65 72 74 20 6f 72 20 72 65 69 6e 73   Insert or reins
2d900 65 72 74 20 61 6c 6c 20 66 69 6c 65 73 20 6c 69  ert all files li
2d910 73 74 65 64 0a 2a 2a 20 20 20 20 20 75 70 64 61  sted.**     upda
2d920 74 65 20 20 20 20 2d 3e 20 20 20 20 20 49 6e 73  te    ->     Ins
2d930 65 72 74 20 66 69 6c 65 73 20 74 68 61 74 20 68  ert files that h
2d940 61 76 65 20 63 68 61 6e 67 65 64 20 6f 72 20 74  ave changed or t
2d950 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 2a 2a 20  hat were not.** 
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d970 20 20 20 20 20 70 72 65 76 69 6f 75 73 6c 79 20       previously 
2d980 69 6e 20 74 68 65 20 61 72 63 68 69 76 65 0a 2a  in the archive.*
2d990 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
2d9a0 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 69 6e  "sqlar" table in
2d9b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 66   the database if
2d9c0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
2d9d0 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54  eady exist..** T
2d9e0 68 65 6e 20 61 64 64 20 65 61 63 68 20 66 69 6c  hen add each fil
2d9f0 65 20 69 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b  e in the azFile[
2da00 5d 20 61 72 72 61 79 20 74 6f 20 74 68 65 20 61  ] array to the a
2da10 72 63 68 69 76 65 2e 20 44 69 72 65 63 74 6f 72  rchive. Director
2da20 69 65 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64  ies.** are added
2da30 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 49 66   recursively. If
2da40 20 61 72 67 75 6d 65 6e 74 20 62 56 65 72 62 6f   argument bVerbo
2da50 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  se is non-zero, 
2da60 61 20 6d 65 73 73 61 67 65 20 69 73 0a 2a 2a 20  a message is.** 
2da70 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75  printed on stdou
2da80 74 20 66 6f 72 20 65 61 63 68 20 66 69 6c 65 20  t for each file 
2da90 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  archived..**.** 
2daa0 54 68 65 20 63 72 65 61 74 65 20 63 6f 6d 6d 61  The create comma
2dab0 6e 64 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  nd is the same a
2dac0 73 20 75 70 64 61 74 65 2c 20 65 78 63 65 70 74  s update, except
2dad0 20 74 68 61 74 20 69 74 20 64 72 6f 70 73 0a 2a   that it drops.*
2dae0 2a 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 22  * any existing "
2daf0 73 71 6c 61 72 22 20 74 61 62 6c 65 20 62 65 66  sqlar" table bef
2db00 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20  ore beginning.  
2db10 54 68 65 20 22 69 6e 73 65 72 74 22 20 63 6f 6d  The "insert" com
2db20 6d 61 6e 64 0a 2a 2a 20 61 6c 77 61 79 73 20 6f  mand.** always o
2db30 76 65 72 77 72 69 74 65 73 20 65 76 65 72 79 20  verwrites every 
2db40 66 69 6c 65 20 6e 61 6d 65 64 20 6f 6e 20 74 68  file named on th
2db50 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20  e command-line, 
2db60 77 68 65 72 65 20 61 73 0a 2a 2a 20 22 75 70 64  where as.** "upd
2db70 61 74 65 22 20 6f 6e 6c 79 20 6f 76 65 72 77 72  ate" only overwr
2db80 69 74 65 73 20 69 66 20 74 68 65 20 73 69 7a 65  ites if the size
2db90 20 6f 72 20 6d 74 69 6d 65 20 6f 72 20 6d 6f 64   or mtime or mod
2dba0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 2a  e has changed..*
2dbb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 43  /.static int arC
2dbc0 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
2dbd0 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e  mand(.  ArComman
2dbe0 64 20 2a 70 41 72 2c 20 20 20 20 20 20 20 20 20  d *pAr,         
2dbf0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61          /* Comma
2dc00 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  nd arguments and
2dc10 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   options */.  in
2dc20 74 20 62 55 70 64 61 74 65 2c 20 20 20 20 20 20  t bUpdate,      
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dc40 20 74 72 75 65 20 66 6f 72 20 61 20 2d 2d 63 72   true for a --cr
2dc50 65 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 62  eate. */.  int b
2dc60 4f 6e 6c 79 49 66 43 68 61 6e 67 65 64 20 20 20  OnlyIfChanged   
2dc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2dc80 6c 79 20 75 70 64 61 74 65 20 69 66 20 66 69 6c  ly update if fil
2dc90 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f  e has changed */
2dca0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2dcb0 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20   *zCreate = .   
2dcc0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
2dcd0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
2dce0 71 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22  qlar(\n".      "
2dcf0 20 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d    name TEXT PRIM
2dd00 41 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d  ARY KEY,  -- nam
2dd10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22  e of the file\n"
2dd20 0a 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49  .      "  mode I
2dd30 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
2dd40 20 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d    -- access perm
2dd50 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20  issions\n".     
2dd60 20 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20   "  mtime INT,  
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c              -- l
2dd80 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ast modification
2dd90 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22   time\n".      "
2dda0 20 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20    sz INT,       
2ddb0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69            -- ori
2ddc0 67 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c  ginal file size\
2ddd0 6e 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61  n".      "  data
2dde0 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   BLOB           
2ddf0 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65      -- compresse
2de00 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20  d content\n".   
2de10 20 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20     ")";.  const 
2de20 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44  char *zDrop = "D
2de30 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2de40 53 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f  STS sqlar";.  co
2de50 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72  nst char *zInser
2de60 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20  tFmt[2] = {.    
2de70 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25   "REPLACE INTO %
2de80 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  s(name,mode,mtim
2de90 65 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20  e,sz,data)\n".  
2dea0 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a     "  SELECT\n".
2deb0 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22       "    %s,\n"
2dec0 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c  .     "    mode,
2ded0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74  \n".     "    mt
2dee0 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ime,\n".     "  
2def0 20 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73    CASE substr(ls
2df00 6d 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c  mode(mode),1,1)\
2df10 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57  n".     "      W
2df20 48 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e  HEN '-' THEN len
2df30 67 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20  gth(data)\n".   
2df40 20 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64    "      WHEN 'd
2df50 27 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20  ' THEN 0\n".    
2df60 20 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20   "      ELSE -1 
2df70 45 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  END,\n".     "  
2df80 20 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73    sqlar_compress
2df90 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  (data)\n".     "
2dfa0 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c    FROM fsdir(%Q,
2dfb0 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20  %Q) AS disk\n". 
2dfc0 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d      "  WHERE lsm
2dfd0 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49  ode(mode) NOT LI
2dfe0 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20 20 20  KE '?%%'%s;".   
2dff0 20 20 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43    ,.     "REPLAC
2e000 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d  E INTO %s(name,m
2e010 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c  ode,mtime,data)\
2e020 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43  n".     "  SELEC
2e030 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25  T\n".     "    %
2e040 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  s,\n".     "    
2e050 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20  mode,\n".     " 
2e060 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20     mtime,\n".   
2e070 20 20 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20    "    data\n". 
2e080 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69      "  FROM fsdi
2e090 72 28 25 51 2c 25 51 29 20 41 53 20 64 69 73 6b  r(%Q,%Q) AS disk
2e0a0 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52  \n".     "  WHER
2e0b0 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e  E lsmode(mode) N
2e0c0 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 25 73 3b  OT LIKE '?%%'%s;
2e0d0 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20  ".  };.  int i; 
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2e100 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2e110 68 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20  h azFile[] */.  
2e120 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e140 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2e150 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2e160 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  zTab = 0;       
2e170 20 20 20 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65      /* SQL table
2e180 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69   into which to i
2e190 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20  nsert */.  char 
2e1a0 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54  *zSql;.  char zT
2e1b0 65 6d 70 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  emp[50];.  char 
2e1c0 2a 7a 45 78 69 73 74 73 20 3d 20 30 3b 0a 0a 20  *zExists = 0;.. 
2e1d0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2e1e0 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
2e1f0 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d 20  e=512");.  rc = 
2e200 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
2e210 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b  SAVEPOINT ar;");
2e220 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e230 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2e240 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30  ;.  zTemp[0] = 0
2e250 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  ; .  if( pAr->bZ
2e260 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  ip ){.    /* Ini
2e270 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70 66  tialize the zipf
2e280 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
2e290 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  e, if necessary 
2e2a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  */.    if( pAr->
2e2b0 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  zFile ){.      s
2e2c0 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
2e2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2e2e0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
2e2f0 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20 73  (r),&r);.      s
2e300 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2e310 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54  sizeof(zTemp),zT
2e320 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22  emp,"zip%016llx"
2e330 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62 20  ,r);.      zTab 
2e340 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a  = zTemp;.      z
2e350 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2e360 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2e370 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
2e380 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55 53  TABLE temp.%s US
2e390 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 22  ING zipfile(%Q)"
2e3a0 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c  ,.         zTab,
2e3b0 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20   pAr->zFile.    
2e3c0 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
2e3d0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2e3e0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
2e3f0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2e400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e410 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20   zTab = "zip";. 
2e420 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2e430 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e440 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61 6e  the table for an
2e450 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54   SQLAR */.    zT
2e460 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20  ab = "sqlar";.  
2e470 20 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d 30    if( bUpdate==0
2e480 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
2e490 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 44  rExecSql(pAr, zD
2e4a0 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rop);.      if( 
2e4b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2e4c0 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e  goto end_ar_tran
2e4d0 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20  saction;.    }. 
2e4e0 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2e4f0 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b  l(pAr, zCreate);
2e500 0a 20 20 7d 0a 20 20 69 66 28 20 62 4f 6e 6c 79  .  }.  if( bOnly
2e510 49 66 43 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  IfChanged ){.   
2e520 20 7a 45 78 69 73 74 73 20 3d 20 73 71 6c 69 74   zExists = sqlit
2e530 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2e540 20 20 22 20 41 4e 44 20 4e 4f 54 20 45 58 49 53    " AND NOT EXIS
2e550 54 53 28 22 0a 20 20 20 20 20 20 20 20 20 20 22  TS(".          "
2e560 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 25 73  SELECT 1 FROM %s
2e570 20 41 53 20 6d 65 6d 22 0a 20 20 20 20 20 20 20   AS mem".       
2e580 20 20 20 22 20 57 48 45 52 45 20 6d 65 6d 2e 6e     " WHERE mem.n
2e590 61 6d 65 3d 64 69 73 6b 2e 6e 61 6d 65 22 0a 20  ame=disk.name". 
2e5a0 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6d           " AND m
2e5b0 65 6d 2e 6d 74 69 6d 65 3d 64 69 73 6b 2e 6d 74  em.mtime=disk.mt
2e5c0 69 6d 65 22 0a 20 20 20 20 20 20 20 20 20 20 22  ime".          "
2e5d0 20 41 4e 44 20 6d 65 6d 2e 6d 6f 64 65 3d 64 69   AND mem.mode=di
2e5e0 73 6b 2e 6d 6f 64 65 29 22 2c 20 7a 54 61 62 29  sk.mode)", zTab)
2e5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2e600 45 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33  Exists = sqlite3
2e610 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20  _mprintf("");.  
2e620 7d 0a 20 20 69 66 28 20 7a 45 78 69 73 74 73 3d  }.  if( zExists=
2e630 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
2e640 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d  _NOMEM;.  for(i=
2e650 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26  0; i<pAr->nArg &
2e660 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2e670 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
2e680 2a 7a 53 71 6c 32 20 3d 20 73 71 6c 69 74 65 33  *zSql2 = sqlite3
2e690 5f 6d 70 72 69 6e 74 66 28 7a 49 6e 73 65 72 74  _mprintf(zInsert
2e6a0 46 6d 74 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20  Fmt[pAr->bZip], 
2e6b0 7a 54 61 62 2c 0a 20 20 20 20 20 20 20 20 70 41  zTab,.        pA
2e6c0 72 2d 3e 62 56 65 72 62 6f 73 65 20 3f 20 22 73  r->bVerbose ? "s
2e6d0 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65  hell_putsnl(name
2e6e0 29 22 20 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20  )" : "name",.   
2e6f0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b       pAr->azArg[
2e700 69 5d 2c 20 70 41 72 2d 3e 7a 44 69 72 2c 20 7a  i], pAr->zDir, z
2e710 45 78 69 73 74 73 29 3b 0a 20 20 20 20 72 63 20  Exists);.    rc 
2e720 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2e730 20 7a 53 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c   zSql2);.    sql
2e740 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 32 29  ite3_free(zSql2)
2e750 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61  ;.  }.end_ar_tra
2e760 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20  nsaction:.  if( 
2e770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e780 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
2e790 63 28 70 41 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c  c(pAr->db, "ROLL
2e7a0 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45  BACK TO ar; RELE
2e7b0 41 53 45 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20  ASE ar;", 0, 0, 
2e7c0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
2e7d0 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
2e7e0 70 41 72 2c 20 22 52 45 4c 45 41 53 45 20 61 72  pAr, "RELEASE ar
2e7f0 3b 22 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72  ;");.    if( pAr
2e800 2d 3e 62 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a  ->bZip && pAr->z
2e810 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 7a 53  File ){.      zS
2e820 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2e830 69 6e 74 66 28 22 44 52 4f 50 20 54 41 42 4c 45  intf("DROP TABLE
2e840 20 25 73 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20   %s", zTemp);.  
2e850 20 20 20 20 61 72 45 78 65 63 53 71 6c 28 70 41      arExecSql(pA
2e860 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  r, zSql);.      
2e870 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2e880 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
2e890 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78  sqlite3_free(zEx
2e8a0 69 73 74 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  ists);.  return 
2e8b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
2e8c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
2e8d0 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  .ar" dot command
2e8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e8f0 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  arDotCommand(.  
2e900 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
2e910 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2e920 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
2e930 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
2e940 20 69 6e 74 20 66 72 6f 6d 43 6d 64 4c 69 6e 65   int fromCmdLine
2e950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e960 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 41 20 63   /* True if -A c
2e970 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
2e980 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20 63 6d 64 20  on, not .ar cmd 
2e990 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
2e9a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2e9b0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2e9c0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
2e9d0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
2e9e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ea10 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
2ea20 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72  Arg[] */.){.  Ar
2ea30 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69  Command cmd;.  i
2ea40 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  nt rc;.  memset(
2ea50 26 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &cmd, 0, sizeof(
2ea60 63 6d 64 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f  cmd));.  cmd.fro
2ea70 6d 43 6d 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43  mCmdLine = fromC
2ea80 6d 64 4c 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61  mdLine;.  rc = a
2ea90 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a  rParseCommand(az
2eaa0 41 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29  Arg, nArg, &cmd)
2eab0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2eac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
2ead0 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c   eDbType = SHELL
2eae0 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20  _OPEN_UNSPEC;.  
2eaf0 20 20 63 6d 64 2e 70 20 3d 20 70 53 74 61 74 65    cmd.p = pState
2eb00 3b 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 70  ;.    cmd.db = p
2eb10 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69  State->db;.    i
2eb20 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a  f( cmd.zFile ){.
2eb30 20 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20        eDbType = 
2eb40 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79  deduceDatabaseTy
2eb50 70 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29  pe(cmd.zFile, 1)
2eb60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2eb70 20 20 20 65 44 62 54 79 70 65 20 3d 20 70 53 74     eDbType = pSt
2eb80 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20  ate->openMode;. 
2eb90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44 62     }.    if( eDb
2eba0 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
2ebb0 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
2ebc0 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d    if( cmd.eCmd==
2ebd0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 7c  AR_CMD_EXTRACT |
2ebe0 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  | cmd.eCmd==AR_C
2ebf0 4d 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20 20 20  MD_LIST ){.     
2ec00 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65     if( cmd.zFile
2ec10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ec20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
2ec30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2ec40 28 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 20  ("zip");.       
2ec50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ec60 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2ec70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2ec80 66 28 22 7a 69 70 66 69 6c 65 28 25 51 29 22 2c  f("zipfile(%Q)",
2ec90 20 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20   cmd.zFile);.   
2eca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ecb0 20 20 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20       cmd.bZip = 
2ecc0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2ecd0 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20   cmd.zFile ){.  
2ece0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20      int flags;. 
2ecf0 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70       if( cmd.bAp
2ed00 70 65 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d  pend ) eDbType =
2ed10 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
2ed20 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28  NDVFS;.      if(
2ed30 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2ed40 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e  D_CREATE || cmd.
2ed50 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53  eCmd==AR_CMD_INS
2ed60 45 52 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  ERT .           
2ed70 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
2ed80 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  CMD_UPDATE ){.  
2ed90 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51        flags = SQ
2eda0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2edb0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2edc0 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  CREATE;.      }e
2edd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
2ede0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
2edf0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2ee00 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20   }.      cmd.db 
2ee10 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  = 0;.      if( c
2ee20 6d 64 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  md.bDryRun ){.  
2ee30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2ee40 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
2ee50 2d 2d 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  -- open database
2ee60 20 27 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e   '%s'%s\n", cmd.
2ee70 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  zFile,.         
2ee80 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45      eDbType==SHE
2ee90 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2eea0 53 20 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e  S ? " using 'apn
2eeb0 64 76 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20  dvfs'" : "");.  
2eec0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2eed0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
2eee0 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64  (cmd.zFile, &cmd
2eef0 2e 64 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20  .db, flags, .   
2ef00 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70            eDbTyp
2ef10 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  e==SHELL_OPEN_AP
2ef20 50 45 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76  PENDVFS ? "apndv
2ef30 66 73 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  fs" : 0);.      
2ef40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ef50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  K ){.        utf
2ef60 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2ef70 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
2ef80 6c 65 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20  le: %s (%s)\n", 
2ef90 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
2efa0 2e 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  .zFile, sqlite3_
2efb0 65 72 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20  errmsg(cmd.db). 
2efc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2efd0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f    goto end_ar_co
2efe0 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  mmand;.      }. 
2eff0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2f000 65 69 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c  eio_init(cmd.db,
2f010 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2f020 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74  lite3_sqlar_init
2f030 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a  (cmd.db, 0, 0);.
2f040 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72        sqlite3_cr
2f050 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d  eate_function(cm
2f060 64 2e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74  d.db, "shell_put
2f070 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  snl", 1, SQLITE_
2f080 55 54 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20  UTF8, cmd.p,.   
2f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0a0 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
2f0b0 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b  PutsFunc, 0, 0);
2f0c0 0a 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ..    }.    if( 
2f0d0 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30  cmd.zSrcTable==0
2f0e0 20 26 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20   && cmd.bZip==0 
2f0f0 26 26 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f  && cmd.eCmd!=AR_
2f100 43 4d 44 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20  CMD_HELP ){.    
2f110 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d    if( cmd.eCmd!=
2f120 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20  AR_CMD_CREATE.  
2f130 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
2f140 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
2f150 61 64 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22  adata(cmd.db,0,"
2f160 73 71 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c  sqlar","name",0,
2f170 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29  0,0,0,0).      )
2f180 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2f190 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64  rintf(stderr, "d
2f1a0 61 74 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74  atabase does not
2f1b0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c   contain an 'sql
2f1c0 61 72 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20  ar' table\n");. 
2f1d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f1e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2f1f0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f    goto end_ar_co
2f200 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  mmand;.      }. 
2f210 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62       cmd.zSrcTab
2f220 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
2f230 69 6e 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20  intf("sqlar");. 
2f240 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
2f250 28 20 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20  ( cmd.eCmd ){.  
2f260 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2f270 43 52 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20  CREATE:.        
2f280 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55  rc = arCreateOrU
2f290 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d  pdateCommand(&cm
2f2a0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
2f2b0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2f2c0 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
2f2d0 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ACT:.        rc 
2f2e0 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61  = arExtractComma
2f2f0 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20  nd(&cmd);.      
2f300 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2f310 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
2f320 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2f330 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26 63 6d  rListCommand(&cm
2f340 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
2f350 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2f360 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20  R_CMD_HELP:.    
2f370 20 20 20 20 61 72 55 73 61 67 65 28 70 53 74 61      arUsage(pSta
2f380 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20  te->out);.      
2f390 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2f3a0 63 61 73 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45  case AR_CMD_INSE
2f3b0 52 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  RT:.        rc =
2f3c0 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2f3d0 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31  eCommand(&cmd, 1
2f3e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
2f3f0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61  eak;..      defa
2f400 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
2f410 65 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  ert( cmd.eCmd==A
2f420 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a  R_CMD_UPDATE );.
2f430 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43          rc = arC
2f440 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
2f450 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 31 29  mand(&cmd, 1, 1)
2f460 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2f470 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61  .    }.  }.end_a
2f480 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66 28  r_command:.  if(
2f490 20 63 6d 64 2e 64 62 21 3d 70 53 74 61 74 65 2d   cmd.db!=pState-
2f4a0 3e 64 62 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  >db ){.    close
2f4b0 5f 64 62 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d  _db(cmd.db);.  }
2f4c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2f4d0 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a  cmd.zSrcTable);.
2f4e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f4f0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22 2e  /* End of the ".
2f500 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72  archive" or ".ar
2f510 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a  " command logic.
2f520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f570 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  **/.#endif /* !d
2f580 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2f590 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
2f5a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2f5b0 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f  TE_HAVE_ZLIB) */
2f5c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2f5d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2f5e0 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
2f5f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2f600 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 0a 2f  E_DBPAGE_VTAB)./
2f610 2a 0a 2a 2a 20 49 66 20 28 2a 70 52 63 29 20 69  *.** If (*pRc) i
2f620 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
2f630 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2f640 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2f650 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
2f660 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 53  Otherwise, the S
2f670 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  QL statement or 
2f680 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 7a 53  statements in zS
2f690 71 6c 20 61 72 65 20 65 78 65 63 75 74 65 64 20  ql are executed 
2f6a0 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
2f6b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
2f6c0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
2f6d0 64 65 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  de written to *p
2f6e0 52 63 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  Rc before.** thi
2f6f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2f700 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
2f710 69 64 20 73 68 65 6c 6c 45 78 65 63 28 73 71 6c  id shellExec(sql
2f720 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 2a 70  ite3 *db, int *p
2f730 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Rc, const char *
2f740 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 20  zSql){.  int rc 
2f750 3d 20 2a 70 52 63 3b 0a 20 20 69 66 28 20 72 63  = *pRc;.  if( rc
2f760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f770 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
2f780 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
2f790 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2f7a0 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  l, 0, 0, &zErr);
2f7b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f7c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f7d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2f7e0 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
2f7f0 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  s\n", zErr);.   
2f800 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63   }.    *pRc = rc
2f810 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
2f820 69 6b 65 20 73 68 65 6c 6c 45 78 65 63 28 29 2c  ike shellExec(),
2f830 20 65 78 63 65 70 74 20 74 68 61 74 20 7a 46 6d   except that zFm
2f840 74 20 69 73 20 61 20 70 72 69 6e 74 66 28 29 20  t is a printf() 
2f850 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72  style format str
2f860 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2f870 6f 69 64 20 73 68 65 6c 6c 45 78 65 63 50 72 69  oid shellExecPri
2f880 6e 74 66 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ntf(sqlite3 *db,
2f890 20 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74   int *pRc, const
2f8a0 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
2f8b0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30  ){.  char *z = 0
2f8c0 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
2f8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76  LITE_OK ){.    v
2f8e0 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76  a_list ap;.    v
2f8f0 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
2f900 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  );.    z = sqlit
2f910 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
2f920 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
2f930 64 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  d(ap);.    if( z
2f940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ==0 ){.      *pR
2f950 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2f960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f970 20 20 20 73 68 65 6c 6c 45 78 65 63 28 64 62 2c     shellExec(db,
2f980 20 70 52 63 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a   pRc, z);.    }.
2f990 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2f9a0 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (z);.  }.}../*.*
2f9b0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
2f9c0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2f9d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f9e0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2f9f0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
2fa00 77 69 73 65 2c 20 61 6e 20 61 74 74 65 6d 70 74  wise, an attempt
2fa10 20 69 73 20 6d 61 64 65 20 74 6f 20 61 6c 6c 6f   is made to allo
2fa20 63 61 74 65 2c 20 7a 65 72 6f 20 61 6e 64 20 72  cate, zero and r
2fa30 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
2fa40 2a 2a 20 74 6f 20 61 20 62 75 66 66 65 72 20 6e  ** to a buffer n
2fa50 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73 69  Byte bytes in si
2fa60 7a 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  ze. If an OOM er
2fa70 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63  ror occurs, *pRc
2fa80 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 53 51   is set.** to SQ
2fa90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e  LITE_NOMEM and N
2faa0 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ULL returned..*/
2fab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 68  .static void *sh
2fac0 65 6c 6c 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a 70  ellMalloc(int *p
2fad0 52 63 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Rc, sqlite3_int6
2fae0 34 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  4 nByte){.  void
2faf0 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
2fb00 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
2fb10 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  K ){.    pRet = 
2fb20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
2fb30 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
2fb40 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
2fb50 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2fb60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2fb70 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
2fb80 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Ret, 0, nByte);.
2fb90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2fba0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
2fbb0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
2fbc0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2fbd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2fbe0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2fbf0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
2fc00 77 69 73 65 2c 20 7a 46 6d 74 20 69 73 20 74 72  wise, zFmt is tr
2fc10 65 61 74 65 64 20 61 73 20 61 20 70 72 69 6e 74  eated as a print
2fc20 66 28 29 20 73 74 79 6c 65 20 73 74 72 69 6e 67  f() style string
2fc30 2e 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  . The result of.
2fc40 2a 2a 20 66 6f 72 6d 61 74 74 69 6e 67 20 69 74  ** formatting it
2fc50 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 79 20   along with any 
2fc60 74 72 61 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e  trailing argumen
2fc70 74 73 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ts is written in
2fc80 74 6f 20 61 20 0a 2a 2a 20 62 75 66 66 65 72 20  to a .** buffer 
2fc90 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2fca0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 20  lite3_malloc(), 
2fcb0 61 6e 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 77  and pointer to w
2fcc0 68 69 63 68 20 69 73 20 72 65 74 75 72 6e 65 64  hich is returned
2fcd0 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
2fce0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
2fcf0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
2fd00 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
2fd10 68 69 73 20 62 75 66 66 65 72 0a 2a 2a 20 75 73  his buffer.** us
2fd20 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
2fd30 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a  lite3_free()..**
2fd40 20 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65   .** If an OOM e
2fd50 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 28 2a 70  rror occurs, (*p
2fd60 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51  Rc) is set to SQ
2fd70 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 61  LITE_NOMEM and a
2fd80 20 4e 55 4c 4c 20 0a 2a 2a 20 70 6f 69 6e 74 65   NULL .** pointe
2fd90 72 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  r returned..*/.s
2fda0 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65 6c  tatic char *shel
2fdb0 6c 4d 50 72 69 6e 74 66 28 69 6e 74 20 2a 70 52  lMPrintf(int *pR
2fdc0 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  c, const char *z
2fdd0 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  Fmt, ...){.  cha
2fde0 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
2fdf0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
2fe00 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  ){.    va_list a
2fe10 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  p;.    va_start(
2fe20 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a  ap, zFmt);.    z
2fe30 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
2fe40 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
2fe50 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2fe60 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
2fe70 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
2fe80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2fe90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
2fea0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 72 75  }../*.** When ru
2feb0 6e 6e 69 6e 67 20 74 68 65 20 22 2e 72 65 63 6f  nning the ".reco
2fec0 76 65 72 22 20 63 6f 6d 6d 61 6e 64 2c 20 65 61  ver" command, ea
2fed0 63 68 20 6f 75 74 70 75 74 20 74 61 62 6c 65 2c  ch output table,
2fee0 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c   and the special
2fef0 0a 2a 2a 20 6f 72 70 68 61 6e 65 64 20 72 6f 77  .** orphaned row
2ff00 20 74 61 62 6c 65 20 69 66 20 69 74 20 69 73 20   table if it is 
2ff10 72 65 71 75 69 72 65 64 2c 20 69 73 20 72 65 70  required, is rep
2ff20 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e 20 69  resented by an i
2ff30 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
2ff40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2ff50 63 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ct..*/.typedef s
2ff60 74 72 75 63 74 20 52 65 63 6f 76 65 72 54 61 62  truct RecoverTab
2ff70 6c 65 20 52 65 63 6f 76 65 72 54 61 62 6c 65 3b  le RecoverTable;
2ff80 0a 73 74 72 75 63 74 20 52 65 63 6f 76 65 72 54  .struct RecoverT
2ff90 61 62 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a  able {.  char *z
2ffa0 51 75 6f 74 65 64 3b 20 20 20 20 20 20 20 20 20  Quoted;         
2ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74           /* Quot
2ffc0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 61  ed version of ta
2ffd0 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  ble name */.  in
2ffe0 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30000 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
30010 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ns in table */. 
30020 20 63 68 61 72 20 2a 2a 61 7a 6c 43 6f 6c 3b 20   char **azlCol; 
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30040 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
30050 75 6d 6e 20 6c 69 73 74 73 20 2a 2f 0a 20 20 69  umn lists */.  i
30060 6e 74 20 69 50 6b 3b 20 20 20 20 20 20 20 20 20  nt iPk;         
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30080 2a 20 49 6e 64 65 78 20 6f 66 20 49 50 4b 20 63  * Index of IPK c
30090 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  olumn */.};../*.
300a0 2a 2a 20 46 72 65 65 20 61 20 52 65 63 6f 76 65  ** Free a Recove
300b0 72 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 6c  rTable object al
300c0 6c 6f 63 61 74 65 64 20 62 79 20 72 65 63 6f 76  located by recov
300d0 65 72 46 69 6e 64 54 61 62 6c 65 28 29 20 6f 72  erFindTable() or
300e0 0a 2a 2a 20 72 65 63 6f 76 65 72 4f 72 70 68 61  .** recoverOrpha
300f0 6e 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61  nTable()..*/.sta
30100 74 69 63 20 76 6f 69 64 20 72 65 63 6f 76 65 72  tic void recover
30110 46 72 65 65 54 61 62 6c 65 28 52 65 63 6f 76 65  FreeTable(Recove
30120 72 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  rTable *pTab){. 
30130 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
30140 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
30150 61 62 2d 3e 7a 51 75 6f 74 65 64 29 3b 0a 20 20  ab->zQuoted);.  
30160 20 20 69 66 28 20 70 54 61 62 2d 3e 61 7a 6c 43    if( pTab->azlC
30170 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ol ){.      int 
30180 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
30190 3b 20 69 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ; i<=pTab->nCol;
301a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
301b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62  qlite3_free(pTab
301c0 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ->azlCol[i]);.  
301d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
301e0 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61  te3_free(pTab->a
301f0 7a 6c 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zlCol);.    }.  
30200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
30210 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Tab);.  }.}../*.
30220 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30230 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 28   is a no-op if (
30240 2a 70 52 63 29 20 69 73 20 6e 6f 74 20 53 51 4c  *pRc) is not SQL
30250 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69  ITE_OK when it i
30260 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68  s called..** Oth
30270 65 72 77 69 73 65 2c 20 69 74 20 61 6c 6c 6f 63  erwise, it alloc
30280 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
30290 20 61 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20   a RecoverTable 
302a0 6f 62 6a 65 63 74 20 62 61 73 65 64 20 6f 6e 20  object based on 
302b0 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 66 6f 75  the.** final fou
302c0 72 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  r arguments pass
302d0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
302e0 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 72  ion. It is the r
302f0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
30300 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
30310 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
30320 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  e the returned o
30330 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20 72  bject using.** r
30340 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28  ecoverFreeTable(
30350 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63  )..*/.static Rec
30360 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76  overTable *recov
30370 65 72 4e 65 77 54 61 62 6c 65 28 0a 20 20 69 6e  erNewTable(.  in
30380 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
30390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
303a0 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
303b0 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
303c0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
303d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
303e0 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63   of table */.  c
303f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30410 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  * CREATE TABLE s
30420 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
30430 74 20 62 49 6e 74 6b 65 79 2c 20 0a 20 20 69 6e  t bIntkey, .  in
30440 74 20 6e 43 6f 6c 0a 29 7b 0a 20 20 73 71 6c 69  t nCol.){.  sqli
30450 74 65 33 20 2a 64 62 74 6d 70 20 3d 20 30 3b 20  te3 *dbtmp = 0; 
30460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
30470 71 6c 69 74 65 33 20 68 61 6e 64 6c 65 20 66 6f  qlite3 handle fo
30480 72 20 74 65 73 74 69 6e 67 20 43 52 45 41 54 45  r testing CREATE
30490 20 54 41 42 4c 45 20 2a 2f 0a 20 20 69 6e 74 20   TABLE */.  int 
304a0 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 52 65 63  rc = *pRc;.  Rec
304b0 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62 20  overTable *pTab 
304c0 3d 20 30 3b 0a 0a 20 20 70 54 61 62 20 3d 20 28  = 0;..  pTab = (
304d0 52 65 63 6f 76 65 72 54 61 62 6c 65 2a 29 73 68  RecoverTable*)sh
304e0 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73  ellMalloc(&rc, s
304f0 69 7a 65 6f 66 28 52 65 63 6f 76 65 72 54 61 62  izeof(RecoverTab
30500 6c 65 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  le));.  if( rc==
30510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30520 20 69 6e 74 20 6e 53 71 6c 43 6f 6c 20 3d 20 30   int nSqlCol = 0
30530 3b 0a 20 20 20 20 69 6e 74 20 62 53 71 6c 49 6e  ;.    int bSqlIn
30540 74 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tkey = 0;.    sq
30550 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
30560 74 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  t = 0;.    .    
30570 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
30580 6e 28 22 22 2c 20 26 64 62 74 6d 70 29 3b 0a 20  n("", &dbtmp);. 
30590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
305a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
305b0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
305c0 63 74 69 6f 6e 28 64 62 74 6d 70 2c 20 22 73 68  ction(dbtmp, "sh
305d0 65 6c 6c 5f 69 64 71 75 6f 74 65 22 2c 20 31 2c  ell_idquote", 1,
305e0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
305f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30610 68 65 6c 6c 49 64 51 75 6f 74 65 2c 20 30 2c 20  hellIdQuote, 0, 
30620 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
30630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30640 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
30650 6c 69 74 65 33 5f 65 78 65 63 28 64 62 74 6d 70  lite3_exec(dbtmp
30660 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
30670 6c 65 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 22 2c  le_schema = on",
30680 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
30690 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
306a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
306b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
306c0 63 28 64 62 74 6d 70 2c 20 7a 53 71 6c 2c 20 30  c(dbtmp, zSql, 0
306d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
306e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
306f0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ROR ){.        r
30700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30710 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69         goto fini
30720 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  shed;.      }.  
30730 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 50 72 65    }.    shellPre
30740 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
30750 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
30760 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
30770 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 72  count(*) FROM pr
30780 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28  agma_table_info(
30790 25 51 29 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  %Q)", zName.    
307a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
307b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
307c0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
307d0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
307e0 20 20 20 20 20 6e 53 71 6c 43 6f 6c 20 3d 20 73       nSqlCol = s
307f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
30800 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
30810 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
30820 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
30830 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
30840 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c  QLITE_OK || nSql
30850 43 6f 6c 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  Col<nCol ){.    
30860 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b    goto finished;
30870 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 68 65 6c  .    }..    shel
30880 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 64  lPreparePrintf(d
30890 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d  btmp, &rc, &pStm
308a0 74 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  t, .      "SELEC
308b0 54 20 28 22 0a 20 20 20 20 20 20 22 20 20 53 45  T (".      "  SE
308c0 4c 45 43 54 20 73 75 62 73 74 72 28 64 61 74 61  LECT substr(data
308d0 2c 31 2c 31 29 3d 3d 58 27 30 44 27 20 46 52 4f  ,1,1)==X'0D' FRO
308e0 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20  M sqlite_dbpage 
308f0 57 48 45 52 45 20 70 67 6e 6f 3d 72 6f 6f 74 70  WHERE pgno=rootp
30900 61 67 65 22 0a 20 20 20 20 20 20 22 29 20 46 52  age".      ") FR
30910 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
30920 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51   WHERE name = %Q
30930 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  ", zName.    );.
30940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30950 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
30960 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
30970 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
30980 20 20 62 53 71 6c 49 6e 74 6b 65 79 20 3d 20 73    bSqlIntkey = s
30990 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
309a0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
309b0 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
309c0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
309d0 3b 0a 0a 20 20 20 20 69 66 28 20 62 49 6e 74 6b  ;..    if( bIntk
309e0 65 79 3d 3d 62 53 71 6c 49 6e 74 6b 65 79 20 29  ey==bSqlIntkey )
309f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
30a00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
30a10 2a 7a 50 6b 20 3d 20 22 5f 72 6f 77 69 64 5f 22  *zPk = "_rowid_"
30a20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30a30 73 74 6d 74 20 2a 70 50 6b 46 69 6e 64 65 72 20  stmt *pPkFinder 
30a40 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  = 0;..      /* I
30a50 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
30a60 6b 65 79 20 74 61 62 6c 65 20 61 6e 64 20 74 68  key table and th
30a70 65 72 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45  ere is an INTEGE
30a80 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  R PRIMARY KEY,. 
30a90 20 20 20 20 20 2a 2a 20 73 65 74 20 7a 50 6b 20       ** set zPk 
30aa0 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  to the name of t
30ab0 68 65 20 50 4b 20 63 6f 6c 75 6d 6e 2c 20 61 6e  he PK column, an
30ac0 64 20 70 54 61 62 2d 3e 69 50 6b 20 74 6f 20 74  d pTab->iPk to t
30ad0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a  he index.      *
30ae0 2a 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2c  * of the column,
30af0 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 73 20 61   where columns a
30b00 72 65 20 30 2d 6e 75 6d 62 65 72 65 64 20 66 72  re 0-numbered fr
30b10 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
30b20 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69  ..      ** Or, i
30b30 66 20 74 68 69 73 20 69 73 20 61 20 57 49 54 48  f this is a WITH
30b40 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
30b50 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
30b60 6f 20 49 50 4b 20 63 6f 6c 75 6d 6e 2c 0a 20 20  o IPK column,.  
30b70 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 7a 50 6b      ** leave zPk
30b80 20 61 73 20 22 5f 72 6f 77 69 64 5f 22 20 61 6e   as "_rowid_" an
30b90 64 20 70 54 61 62 2d 3e 69 50 6b 20 61 74 20 2d  d pTab->iPk at -
30ba0 32 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  2.  */.      pTa
30bb0 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20  b->iPk = -2;.   
30bc0 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 20 29     if( bIntkey )
30bd0 7b 0a 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50  {.        shellP
30be0 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 74  reparePrintf(dbt
30bf0 6d 70 2c 20 26 72 63 2c 20 26 70 50 6b 46 69 6e  mp, &rc, &pPkFin
30c00 64 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  der, .          
30c10 22 53 45 4c 45 43 54 20 63 69 64 2c 20 6e 61 6d  "SELECT cid, nam
30c20 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61  e FROM pragma_ta
30c30 62 6c 65 5f 69 6e 66 6f 28 25 51 29 20 22 0a 20  ble_info(%Q) ". 
30c40 20 20 20 20 20 20 20 20 20 22 20 20 57 48 45 52           "  WHER
30c50 45 20 70 6b 3d 31 20 41 4e 44 20 74 79 70 65 3d  E pk=1 AND type=
30c60 27 69 6e 74 65 67 65 72 27 20 43 4f 4c 4c 41 54  'integer' COLLAT
30c70 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
30c80 20 20 20 20 22 20 20 41 4e 44 20 4e 4f 54 20 45      "  AND NOT E
30c90 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 63 69  XISTS (SELECT ci
30ca0 64 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61  d FROM pragma_ta
30cb0 62 6c 65 5f 69 6e 66 6f 28 25 51 29 20 57 48 45  ble_info(%Q) WHE
30cc0 52 45 20 70 6b 3d 32 29 22 0a 20 20 20 20 20 20  RE pk=2)".      
30cd0 20 20 20 20 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61      , zName, zNa
30ce0 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
30cf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30d00 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
30d10 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
30d20 74 65 70 28 70 50 6b 46 69 6e 64 65 72 29 20 29  tep(pPkFinder) )
30d30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
30d40 2d 3e 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f  ->iPk = sqlite3_
30d50 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50 6b 46 69  column_int(pPkFi
30d60 6e 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  nder, 0);.      
30d70 20 20 20 20 7a 50 6b 20 3d 20 28 63 6f 6e 73 74      zPk = (const
30d80 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
30d90 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 50 6b 46 69  olumn_text(pPkFi
30da0 6e 64 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  nder, 1);.      
30db0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
30dc0 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64     pTab->zQuoted
30dd0 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
30de0 26 72 63 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a  &rc, "\"%w\"", z
30df0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 54 61  Name);.      pTa
30e00 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61  b->azlCol = (cha
30e10 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28  r**)shellMalloc(
30e20 26 72 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  &rc, sizeof(char
30e30 2a 29 20 2a 20 28 6e 53 71 6c 43 6f 6c 2b 31 29  *) * (nSqlCol+1)
30e40 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  );.      pTab->n
30e50 43 6f 6c 20 3d 20 6e 53 71 6c 43 6f 6c 3b 0a 0a  Col = nSqlCol;..
30e60 20 20 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65        if( bIntke
30e70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  y ){.        pTa
30e80 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73  b->azlCol[0] = s
30e90 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c  hellMPrintf(&rc,
30ea0 20 22 5c 22 25 77 5c 22 22 2c 20 7a 50 6b 29 3b   "\"%w\"", zPk);
30eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30ec0 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43        pTab->azlC
30ed0 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c 4d 50 72  ol[0] = shellMPr
30ee0 69 6e 74 66 28 26 72 63 2c 20 22 22 29 3b 0a 20  intf(&rc, "");. 
30ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
30f00 20 31 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50   1;.      shellP
30f10 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 74  reparePrintf(dbt
30f20 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  mp, &rc, &pStmt,
30f30 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c   .          "SEL
30f40 45 43 54 20 25 51 20 7c 7c 20 67 72 6f 75 70 5f  ECT %Q || group_
30f50 63 6f 6e 63 61 74 28 73 68 65 6c 6c 5f 69 64 71  concat(shell_idq
30f60 75 6f 74 65 28 6e 61 6d 65 29 2c 20 27 2c 20 27  uote(name), ', '
30f70 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ) ".          " 
30f80 20 46 49 4c 54 45 52 20 28 57 48 45 52 45 20 63   FILTER (WHERE c
30f90 69 64 21 3d 25 64 29 20 4f 56 45 52 20 28 4f 52  id!=%d) OVER (OR
30fa0 44 45 52 20 42 59 20 25 73 20 63 69 64 29 20 22  DER BY %s cid) "
30fb0 0a 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d  .          "FROM
30fc0 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
30fd0 66 6f 28 25 51 29 22 2c 20 0a 20 20 20 20 20 20  fo(%Q)", .      
30fe0 20 20 20 20 62 49 6e 74 6b 65 79 20 3f 20 22 2c      bIntkey ? ",
30ff0 20 22 20 3a 20 22 22 2c 20 70 54 61 62 2d 3e 69   " : "", pTab->i
31000 50 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 62  Pk, .          b
31010 49 6e 74 6b 65 79 20 3f 20 22 22 20 3a 20 22 28  Intkey ? "" : "(
31020 43 41 53 45 20 57 48 45 4e 20 70 6b 3d 30 20 54  CASE WHEN pk=0 T
31030 48 45 4e 20 31 30 30 30 30 30 30 20 45 4c 53 45  HEN 1000000 ELSE
31040 20 70 6b 20 45 4e 44 29 2c 20 22 2c 0a 20 20 20   pk END), ",.   
31050 20 20 20 20 20 20 20 7a 4e 61 6d 65 0a 20 20 20         zName.   
31060 20 20 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c     );.      whil
31070 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
31080 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
31090 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
310a0 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mt) ){.        c
310b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
310c0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
310d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
310e0 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
310f0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c         pTab->azl
31100 43 6f 6c 5b 69 5d 20 3d 20 73 68 65 6c 6c 4d 50  Col[i] = shellMP
31110 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73 25 73  rintf(&rc, "%s%s
31120 22 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b  ", pTab->azlCol[
31130 30 5d 2c 20 7a 54 65 78 74 29 3b 0a 20 20 20 20  0], zText);.    
31140 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
31150 0a 20 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61  .      shellFina
31160 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
31170 3b 0a 0a 20 20 20 20 20 20 73 68 65 6c 6c 46 69  ;..      shellFi
31180 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 50 6b 46  nalize(&rc, pPkF
31190 69 6e 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  inder);.    }.  
311a0 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20  }.. finished:.  
311b0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
311c0 74 6d 70 29 3b 0a 20 20 2a 70 52 63 20 3d 20 72  tmp);.  *pRc = r
311d0 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
311e0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 54 61 62 20  ITE_OK || (pTab 
311f0 26 26 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64  && pTab->zQuoted
31200 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 63 6f  ==0) ){.    reco
31210 76 65 72 46 72 65 65 54 61 62 6c 65 28 70 54 61  verFreeTable(pTa
31220 62 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 30  b);.    pTab = 0
31230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
31240 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
31250 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31260 61 6c 6c 65 64 20 74 6f 20 73 65 61 72 63 68 20  alled to search 
31270 74 68 65 20 73 63 68 65 6d 61 20 72 65 63 6f 76  the schema recov
31280 65 72 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ered from the.**
31290 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
312a0 61 62 6c 65 20 6f 66 20 74 68 65 20 28 70 6f 73  able of the (pos
312b0 73 69 62 6c 79 29 20 63 6f 72 72 75 70 74 20 64  sibly) corrupt d
312c0 61 74 61 62 61 73 65 20 61 73 20 70 61 72 74 0a  atabase as part.
312d0 2a 2a 20 6f 66 20 61 20 22 2e 72 65 63 6f 76 65  ** of a ".recove
312e0 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 70 65 63  r" command. Spec
312f0 69 66 69 63 61 6c 6c 79 2c 20 66 6f 72 20 61 20  ifically, for a 
31300 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
31310 70 61 67 65 0a 2a 2a 20 69 52 6f 6f 74 20 61 6e  page.** iRoot an
31320 64 20 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20  d at least nCol 
31330 63 6f 6c 75 6d 6e 73 2e 20 41 64 64 69 74 69 6f  columns. Additio
31340 6e 61 6c 6c 79 2c 20 69 66 20 62 49 6e 74 6b 65  nally, if bIntke
31350 79 20 69 73 20 30 2c 20 74 68 65 0a 2a 2a 20 74  y is 0, the.** t
31360 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 57  able must be a W
31370 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
31380 6c 65 2c 20 6f 72 20 69 66 20 6e 6f 6e 2d 7a 65  le, or if non-ze
31390 72 6f 2c 20 6e 6f 74 20 6f 6e 65 20 6f 66 0a 2a  ro, not one of.*
313a0 2a 20 74 68 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  * those..**.** I
313b0 66 20 61 20 74 61 62 6c 65 20 69 73 20 66 6f 75  f a table is fou
313c0 6e 64 2c 20 61 20 28 52 65 63 6f 76 65 72 54 61  nd, a (RecoverTa
313d0 62 6c 65 2a 29 20 6f 62 6a 65 63 74 20 69 73 20  ble*) object is 
313e0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
313f0 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  .** no such tabl
31400 65 20 69 73 20 66 6f 75 6e 64 2c 20 62 75 74 20  e is found, but 
31410 62 49 6e 74 6b 65 79 20 69 73 20 66 61 6c 73 65  bIntkey is false
31420 20 61 6e 64 20 69 52 6f 6f 74 20 69 73 20 74 68   and iRoot is th
31430 65 20 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  e .** root page 
31440 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 74  of an index in t
31450 68 65 20 72 65 63 6f 76 65 72 65 64 20 73 63 68  he recovered sch
31460 65 6d 61 2c 20 74 68 65 6e 20 28 2a 70 62 4e 6f  ema, then (*pbNo
31470 6f 70 29 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  op) is.** set to
31480 20 74 72 75 65 20 61 6e 64 20 4e 55 4c 4c 20 72   true and NULL r
31490 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
314a0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
314b0 20 74 61 62 6c 65 20 6f 72 0a 2a 2a 20 69 6e 64   table or.** ind
314c0 65 78 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ex, NULL is retu
314d0 72 6e 65 64 20 61 6e 64 20 28 2a 70 62 4e 6f 6f  rned and (*pbNoo
314e0 70 29 20 73 65 74 20 74 6f 20 30 2c 20 69 6e 64  p) set to 0, ind
314f0 69 63 61 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20  icating that.** 
31500 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
31510 64 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  d write data to 
31520 74 68 65 20 6f 72 70 68 61 6e 73 20 74 61 62 6c  the orphans tabl
31530 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63  e..*/.static Rec
31540 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76  overTable *recov
31550 65 72 46 69 6e 64 54 61 62 6c 65 28 0a 20 20 53  erFindTable(.  S
31560 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
31570 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
31580 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 6f 62  * Shell state ob
31590 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
315a0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
315b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
315c0 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
315d0 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 6f 74 2c 20  */.  int iRoot, 
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
31600 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20  e of table */.  
31610 69 6e 74 20 62 49 6e 74 6b 65 79 2c 20 20 20 20  int bIntkey,    
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31630 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 69  /* True for an i
31640 6e 74 6b 65 79 20 74 61 62 6c 65 20 2a 2f 0a 20  ntkey table */. 
31650 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
31680 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a  lumns in table *
31690 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 6f 6f 70 20  /.  int *pbNoop 
316a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65      /* OUT: True
316c0 20 69 66 20 69 52 6f 6f 74 20 69 73 20 72 6f 6f   if iRoot is roo
316d0 74 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  t of index */.){
316e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
316f0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 52 65  *pStmt = 0;.  Re
31700 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 52 65 74  coverTable *pRet
31710 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 4e 6f 6f   = 0;.  int bNoo
31720 70 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  p = 0;.  const c
31730 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
31740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
31750 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  me = 0;..  /* Se
31760 61 72 63 68 20 74 68 65 20 72 65 63 6f 76 65 72  arch the recover
31770 65 64 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6e  ed schema for an
31780 20 6f 62 6a 65 63 74 20 77 69 74 68 20 72 6f 6f   object with roo
31790 74 20 70 61 67 65 20 69 52 6f 6f 74 2e 20 2a 2f  t page iRoot. */
317a0 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  .  shellPrepareP
317b0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
317c0 2c 20 70 52 63 2c 20 26 70 53 74 6d 74 2c 0a 20  , pRc, &pStmt,. 
317d0 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70       "SELECT typ
317e0 65 2c 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  e, name, sql FRO
317f0 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  M recovery.schem
31800 61 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65  a WHERE rootpage
31810 3d 25 64 22 2c 20 69 52 6f 6f 74 0a 20 20 29 3b  =%d", iRoot.  );
31820 0a 20 20 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d  .  while( *pRc==
31830 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
31840 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
31850 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
31860 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31870 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63  zType = (const c
31880 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
31890 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
318a0 30 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 74  0);.    if( bInt
318b0 6b 65 79 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  key==0 && sqlite
318c0 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c  3_stricmp(zType,
318d0 20 22 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a   "index")==0 ){.
318e0 20 20 20 20 20 20 62 4e 6f 6f 70 20 3d 20 31 3b        bNoop = 1;
318f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31900 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
31910 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 79 70  te3_stricmp(zTyp
31920 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29  e, "table")==0 )
31930 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
31940 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
31950 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
31960 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
31970 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20    zSql = (const 
31980 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
31990 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
319a0 20 32 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20   2);.      pRet 
319b0 3d 20 72 65 63 6f 76 65 72 4e 65 77 54 61 62 6c  = recoverNewTabl
319c0 65 28 70 52 63 2c 20 7a 4e 61 6d 65 2c 20 7a 53  e(pRc, zName, zS
319d0 71 6c 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f  ql, bIntkey, nCo
319e0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
319f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68  .    }.  }..  sh
31a00 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c  ellFinalize(pRc,
31a10 20 70 53 74 6d 74 29 3b 0a 20 20 2a 70 62 4e 6f   pStmt);.  *pbNo
31a20 6f 70 20 3d 20 62 4e 6f 6f 70 3b 0a 20 20 72 65  op = bNoop;.  re
31a30 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
31a40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 52 65 63  .** Return a Rec
31a50 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63 74  overTable object
31a60 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
31a70 65 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 2e  e orphans table.
31a80 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76  .*/.static Recov
31a90 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72  erTable *recover
31aa0 4f 72 70 68 61 6e 54 61 62 6c 65 28 0a 20 20 53  OrphanTable(.  S
31ab0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
31ac0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
31ad0 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 6f 62  * Shell state ob
31ae0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
31af0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
31b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
31b10 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
31b20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31b30 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20  *zLostAndFound, 
31b40 20 20 20 20 20 2f 2a 20 42 61 73 65 20 6e 61 6d       /* Base nam
31b50 65 20 66 6f 72 20 6f 72 70 68 61 6e 73 20 74 61  e for orphans ta
31b60 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
31b70 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
31b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31b90 65 72 20 6f 66 20 75 73 65 72 20 64 61 74 61 20  er of user data 
31ba0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20  columns */.){.  
31bb0 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54  RecoverTable *pT
31bc0 61 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 43  ab = 0;.  if( nC
31bd0 6f 6c 3e 3d 30 20 26 26 20 2a 70 52 63 3d 3d 53  ol>=0 && *pRc==S
31be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31bf0 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54  int i;..    /* T
31c00 68 69 73 20 62 6c 6f 63 6b 20 64 65 74 65 72 6d  his block determ
31c10 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ines the name of
31c20 20 74 68 65 20 6f 72 70 68 61 6e 20 74 61 62 6c   the orphan tabl
31c30 65 2e 20 54 68 65 20 70 72 65 66 65 72 65 64 0a  e. The prefered.
31c40 20 20 20 20 2a 2a 20 6e 61 6d 65 20 69 73 20 7a      ** name is z
31c50 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2e 20 42 75  LostAndFound. Bu
31c60 74 20 69 66 20 74 68 61 74 20 63 6c 61 73 68 65  t if that clashe
31c70 73 20 77 69 74 68 20 61 6e 6f 74 68 65 72 20 6e  s with another n
31c80 61 6d 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ame.    ** in th
31c90 65 20 72 65 63 6f 76 65 72 65 64 20 73 63 68 65  e recovered sche
31ca0 6d 61 2c 20 74 72 79 20 7a 4c 6f 73 74 41 6e 64  ma, try zLostAnd
31cb0 46 6f 75 6e 64 5f 30 2c 20 7a 4c 6f 73 74 41 6e  Found_0, zLostAn
31cc0 64 46 6f 75 6e 64 5f 31 0a 20 20 20 20 2a 2a 20  dFound_1.    ** 
31cd0 61 6e 64 20 73 6f 20 6f 6e 20 75 6e 74 69 6c 20  and so on until 
31ce0 61 20 6e 6f 6e 2d 63 6c 61 73 68 69 6e 67 20 6e  a non-clashing n
31cf0 61 6d 65 20 69 73 20 66 6f 75 6e 64 2e 20 20 2a  ame is found.  *
31d00 2f 0a 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d  /.    int iTab =
31d10 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   0;.    char *zT
31d20 61 62 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  ab = shellMPrint
31d30 66 28 70 52 63 2c 20 22 25 73 22 2c 20 7a 4c 6f  f(pRc, "%s", zLo
31d40 73 74 41 6e 64 46 6f 75 6e 64 29 3b 0a 20 20 20  stAndFound);.   
31d50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
31d60 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 68  Test = 0;.    sh
31d70 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74  ellPrepare(pStat
31d80 65 2d 3e 64 62 2c 20 70 52 63 2c 0a 20 20 20 20  e->db, pRc,.    
31d90 20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52      "SELECT 1 FR
31da0 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  OM recovery.sche
31db0 6d 61 20 57 48 45 52 45 20 6e 61 6d 65 3d 3f 22  ma WHERE name=?"
31dc0 2c 20 26 70 54 65 73 74 0a 20 20 20 20 29 3b 0a  , &pTest.    );.
31dd0 20 20 20 20 69 66 28 20 70 54 65 73 74 20 29 20      if( pTest ) 
31de0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
31df0 74 28 70 54 65 73 74 2c 20 31 2c 20 7a 54 61 62  t(pTest, 1, zTab
31e00 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
31e10 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 77 68 69  NSIENT);.    whi
31e20 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  le( *pRc==SQLITE
31e30 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
31e40 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
31e50 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pTest) ){.      
31e60 73 68 65 6c 6c 52 65 73 65 74 28 70 52 63 2c 20  shellReset(pRc, 
31e70 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  pTest);.      sq
31e80 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62 29  lite3_free(zTab)
31e90 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 73  ;.      zTab = s
31ea0 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c  hellMPrintf(pRc,
31eb0 20 22 25 73 5f 25 64 22 2c 20 7a 4c 6f 73 74 41   "%s_%d", zLostA
31ec0 6e 64 46 6f 75 6e 64 2c 20 69 54 61 62 2b 2b 29  ndFound, iTab++)
31ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
31ee0 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
31ef0 20 31 2c 20 7a 54 61 62 2c 20 2d 31 2c 20 53 51   1, zTab, -1, SQ
31f00 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
31f10 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
31f20 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 54  Finalize(pRc, pT
31f30 65 73 74 29 3b 0a 0a 20 20 20 20 70 54 61 62 20  est);..    pTab 
31f40 3d 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a  = (RecoverTable*
31f50 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63  )shellMalloc(pRc
31f60 2c 20 73 69 7a 65 6f 66 28 52 65 63 6f 76 65 72  , sizeof(Recover
31f70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
31f80 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
31f90 54 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73  Tab->zQuoted = s
31fa0 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c  hellMPrintf(pRc,
31fb0 20 22 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 29   "\"%w\"", zTab)
31fc0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
31fd0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20  ol = nCol;.     
31fe0 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b   pTab->iPk = -2;
31ff0 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  .      if( nCol>
32000 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  0 ){.        pTa
32010 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61  b->azlCol = (cha
32020 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28  r**)shellMalloc(
32030 70 52 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  pRc, sizeof(char
32040 2a 29 20 2a 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a  *) * (nCol+1));.
32050 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
32060 2d 3e 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  ->azlCol ){.    
32070 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43        pTab->azlC
32080 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c  ol[nCol] = shell
32090 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 22 29  MPrintf(pRc, "")
320a0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
320b0 69 3d 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20  i=nCol-1; i>=0; 
320c0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i--){.          
320d0 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69    pTab->azlCol[i
320e0 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  ] = shellMPrintf
320f0 28 70 52 63 2c 20 22 25 73 2c 20 4e 55 4c 4c 22  (pRc, "%s, NULL"
32100 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69  , pTab->azlCol[i
32110 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1]);.          
32120 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32130 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 2a    }..      if( *
32140 70 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc!=SQLITE_OK )
32150 7b 0a 20 20 20 20 20 20 20 20 72 65 63 6f 76 65  {.        recove
32160 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29  rFreeTable(pTab)
32170 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
32180 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
32190 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
321a0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
321b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
321c0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 72  REATE TABLE %s(r
321d0 6f 6f 74 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c  ootpgno INTEGER,
321e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
321f0 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 6e 66  pgno INTEGER, nf
32200 69 65 6c 64 20 49 4e 54 45 47 45 52 2c 20 69 64  ield INTEGER, id
32210 20 49 4e 54 45 47 45 52 22 2c 20 70 54 61 62 2d   INTEGER", pTab-
32220 3e 7a 51 75 6f 74 65 64 0a 20 20 20 20 20 20 20  >zQuoted.       
32230 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
32240 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
32250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
32260 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
32270 6f 75 74 2c 20 22 2c 20 63 25 64 22 2c 20 69 29  out, ", c%d", i)
32280 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32290 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
322a0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c  State->out, ");\
322b0 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
322c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
322d0 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 7d 0a 20  ree(zTab);.  }. 
322e0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
322f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
32300 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
32310 6f 20 72 65 63 6f 76 65 72 20 64 61 74 61 20 66  o recover data f
32320 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
32330 2e 20 41 20 73 63 72 69 70 74 0a 2a 2a 20 74 6f  . A script.** to
32340 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
32350 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
32360 6e 69 6e 67 20 61 6c 6c 20 72 65 63 6f 76 65 72  ning all recover
32370 65 64 20 64 61 74 61 20 69 73 20 6f 75 74 70 75  ed data is outpu
32380 74 0a 2a 2a 20 6f 6e 20 73 74 72 65 61 6d 20 70  t.** on stream p
32390 53 74 61 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73  State->out..*/.s
323a0 74 61 74 69 63 20 69 6e 74 20 72 65 63 6f 76 65  tatic int recove
323b0 72 44 61 74 61 62 61 73 65 43 6d 64 28 53 68 65  rDatabaseCmd(She
323c0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
323d0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
323e0 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  **azArg){.  int 
323f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32400 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
32410 70 4c 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  pLoop = 0;      
32420 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
32430 68 20 61 6c 6c 20 72 6f 6f 74 20 70 61 67 65 73  h all root pages
32440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
32450 6d 74 20 2a 70 50 61 67 65 73 20 3d 20 30 3b 20  mt *pPages = 0; 
32460 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
32470 72 6f 75 67 68 20 61 6c 6c 20 70 61 67 65 73 20  rough all pages 
32480 69 6e 20 61 20 67 72 6f 75 70 20 2a 2f 0a 20 20  in a group */.  
32490 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43  sqlite3_stmt *pC
324a0 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
324b0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
324c0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 20 70  all cells in a p
324d0 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  age */.  const c
324e0 68 61 72 20 2a 7a 52 65 63 6f 76 65 72 79 44 62  har *zRecoveryDb
324f0 20 3d 20 22 22 3b 20 20 20 2f 2a 20 4e 61 6d 65   = "";   /* Name
32500 20 6f 66 20 22 72 65 63 6f 76 65 72 79 22 20 64   of "recovery" d
32510 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
32520 73 74 20 63 68 61 72 20 2a 7a 4c 6f 73 74 41 6e  st char *zLostAn
32530 64 46 6f 75 6e 64 20 3d 20 22 6c 6f 73 74 5f 61  dFound = "lost_a
32540 6e 64 5f 66 6f 75 6e 64 22 3b 0a 20 20 69 6e 74  nd_found";.  int
32550 20 69 3b 0a 20 20 69 6e 74 20 6e 4f 72 70 68 61   i;.  int nOrpha
32560 6e 20 3d 20 2d 31 3b 0a 20 20 52 65 63 6f 76 65  n = -1;.  Recove
32570 72 54 61 62 6c 65 20 2a 70 4f 72 70 68 61 6e 20  rTable *pOrphan 
32580 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62 46 72 65  = 0;..  int bFre
32590 65 6c 69 73 74 20 3d 20 31 3b 20 20 20 20 20 20  elist = 1;      
325a0 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69 66 20          /* 0 if 
325b0 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75  --freelist-corru
325c0 70 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20  pt is specified 
325d0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
325e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
325f0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
32600 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  i];.    int n;. 
32610 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
32620 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
32630 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  z++;.    n = str
32640 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
32650 28 20 6e 3c 3d 31 37 20 26 26 20 6d 65 6d 63 6d  ( n<=17 && memcm
32660 70 28 22 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72  p("-freelist-cor
32670 72 75 70 74 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20  rupt", z, n)==0 
32680 29 7b 0a 20 20 20 20 20 20 62 46 72 65 65 6c 69  ){.      bFreeli
32690 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
326a0 65 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 32 20  e.    if( n<=12 
326b0 26 26 20 6d 65 6d 63 6d 70 28 22 2d 72 65 63 6f  && memcmp("-reco
326c0 76 65 72 79 2d 64 62 22 2c 20 7a 2c 20 6e 29 3d  very-db", z, n)=
326d0 3d 30 20 26 26 20 69 3c 28 6e 41 72 67 2d 31 29  =0 && i<(nArg-1)
326e0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
326f0 20 20 20 20 20 7a 52 65 63 6f 76 65 72 79 44 62       zRecoveryDb
32700 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
32710 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6e   }else.    if( n
32720 3c 3d 31 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  <=15 && memcmp("
32730 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 22  -lost-and-found"
32740 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c  , z, n)==0 && i<
32750 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
32760 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 4c 6f    i++;.      zLo
32770 73 74 41 6e 64 46 6f 75 6e 64 20 3d 20 61 7a 41  stAndFound = azA
32780 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rg[i];.    }.   
32790 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77   else{.      raw
327a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
327b0 22 75 6e 65 78 70 65 63 74 65 64 20 6f 70 74 69  "unexpected opti
327c0 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  on: %s\n", azArg
327d0 5b 69 5d 29 3b 20 0a 20 20 20 20 20 20 72 61 77  [i]); .      raw
327e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
327f0 22 6f 70 74 69 6f 6e 73 20 61 72 65 3a 5c 6e 22  "options are:\n"
32800 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
32810 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
32820 20 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72   --freelist-corr
32830 75 70 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  upt\n");.      r
32840 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32850 2c 20 22 20 20 20 20 2d 2d 72 65 63 6f 76 65 72  , "    --recover
32860 79 2d 64 62 20 44 41 54 41 42 41 53 45 5c 6e 22  y-db DATABASE\n"
32870 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
32880 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
32890 20 2d 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e   --lost-and-foun
328a0 64 20 54 41 42 4c 45 2d 4e 41 4d 45 5c 6e 22 29  d TABLE-NAME\n")
328b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
328c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
328d0 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28 70  hellExecPrintf(p
328e0 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a  State->db, &rc,.
328f0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 61 6e      /* Attach an
32900 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
32910 61 73 65 20 6e 61 6d 65 64 20 27 72 65 63 6f 76  ase named 'recov
32920 65 72 79 27 2e 20 43 72 65 61 74 65 20 61 6e 20  ery'. Create an 
32930 69 6e 64 65 78 65 64 20 0a 20 20 20 20 2a 2a 20  indexed .    ** 
32940 63 61 63 68 65 20 6f 66 20 74 68 65 20 73 71 6c  cache of the sql
32950 69 74 65 5f 64 62 70 74 72 20 76 69 72 74 75 61  ite_dbptr virtua
32960 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  l table. */.    
32970 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
32980 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 3b 22 0a 20  _schema = on;". 
32990 20 20 20 22 41 54 54 41 43 48 20 25 51 20 41 53     "ATTACH %Q AS
329a0 20 72 65 63 6f 76 65 72 79 3b 22 0a 20 20 20 20   recovery;".    
329b0 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
329c0 58 49 53 54 53 20 72 65 63 6f 76 65 72 79 2e 64  XISTS recovery.d
329d0 62 70 74 72 3b 22 0a 20 20 20 20 22 44 52 4f 50  bptr;".    "DROP
329e0 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
329f0 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69   recovery.freeli
32a00 73 74 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54  st;".    "DROP T
32a10 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 72  ABLE IF EXISTS r
32a20 65 63 6f 76 65 72 79 2e 6d 61 70 3b 22 0a 20 20  ecovery.map;".  
32a30 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46    "DROP TABLE IF
32a40 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72 79   EXISTS recovery
32a50 2e 73 63 68 65 6d 61 3b 22 0a 20 20 20 20 22 43  .schema;".    "C
32a60 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 63 6f  REATE TABLE reco
32a70 76 65 72 79 2e 66 72 65 65 6c 69 73 74 28 70 67  very.freelist(pg
32a80 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
32a90 52 59 20 4b 45 59 29 3b 22 2c 20 7a 52 65 63 6f  RY KEY);", zReco
32aa0 76 65 72 79 44 62 0a 20 20 29 3b 0a 0a 20 20 69  veryDb.  );..  i
32ab0 66 28 20 62 46 72 65 65 6c 69 73 74 20 29 7b 0a  f( bFreelist ){.
32ac0 20 20 20 20 73 68 65 6c 6c 45 78 65 63 28 70 53      shellExec(pS
32ad0 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20  tate->db, &rc,. 
32ae0 20 20 20 20 20 22 57 49 54 48 20 74 72 75 6e 6b       "WITH trunk
32af0 28 70 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20  (pgno) AS (".   
32b00 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 68 65     "  SELECT she
32b10 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 20  ll_int32(".     
32b20 20 22 20 20 20 20 20 20 28 53 45 4c 45 43 54 20   "      (SELECT 
32b30 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65  data FROM sqlite
32b40 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67  _dbpage WHERE pg
32b50 6e 6f 3d 31 29 2c 20 38 29 20 41 53 20 78 20 22  no=1), 8) AS x "
32b60 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 57 48  .      "      WH
32b70 45 52 45 20 78 3e 30 22 0a 20 20 20 20 20 20 22  ERE x>0".      "
32b80 20 20 20 20 55 4e 49 4f 4e 22 0a 20 20 20 20 20      UNION".     
32b90 20 22 20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c   "  SELECT shell
32ba0 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 20 20 22  _int32(".      "
32bb0 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 64 61        (SELECT da
32bc0 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
32bd0 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f  bpage WHERE pgno
32be0 3d 74 72 75 6e 6b 2e 70 67 6e 6f 29 2c 20 30 29  =trunk.pgno), 0)
32bf0 20 41 53 20 78 20 22 0a 20 20 20 20 20 20 22 20   AS x ".      " 
32c00 20 20 20 20 20 46 52 4f 4d 20 74 72 75 6e 6b 20       FROM trunk 
32c10 57 48 45 52 45 20 78 3e 30 22 0a 20 20 20 20 20  WHERE x>0".     
32c20 20 22 29 2c 22 0a 20 20 20 20 20 20 22 66 72 65   "),".      "fre
32c30 65 6c 69 73 74 28 64 61 74 61 2c 20 6e 2c 20 66  elist(data, n, f
32c40 72 65 65 70 67 6e 6f 29 20 41 53 20 28 22 0a 20  reepgno) AS (". 
32c50 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 64       "  SELECT d
32c60 61 74 61 2c 20 6d 69 6e 28 31 36 33 38 34 2c 20  ata, min(16384, 
32c70 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61  shell_int32(data
32c80 2c 20 31 29 2d 31 29 2c 20 74 2e 70 67 6e 6f 20  , 1)-1), t.pgno 
32c90 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 46  ".      "      F
32ca0 52 4f 4d 20 74 72 75 6e 6b 20 74 2c 20 73 71 6c  ROM trunk t, sql
32cb0 69 74 65 5f 64 62 70 61 67 65 20 73 20 57 48 45  ite_dbpage s WHE
32cc0 52 45 20 73 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f  RE s.pgno=t.pgno
32cd0 22 0a 20 20 20 20 20 20 22 20 20 20 20 55 4e 49  ".      "    UNI
32ce0 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 22 20  ON ALL".      " 
32cf0 20 53 45 4c 45 43 54 20 64 61 74 61 2c 20 6e 2d   SELECT data, n-
32d00 31 2c 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64  1, shell_int32(d
32d10 61 74 61 2c 20 32 2b 6e 29 20 22 0a 20 20 20 20  ata, 2+n) ".    
32d20 20 20 22 20 20 20 20 20 20 46 52 4f 4d 20 66 72    "      FROM fr
32d30 65 65 6c 69 73 74 20 57 48 45 52 45 20 6e 3e 3d  eelist WHERE n>=
32d40 30 22 0a 20 20 20 20 20 20 22 29 22 0a 20 20 20  0".      ")".   
32d50 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
32d60 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69   recovery.freeli
32d70 73 74 20 53 45 4c 45 43 54 20 66 72 65 65 70 67  st SELECT freepg
32d80 6e 6f 20 46 52 4f 4d 20 66 72 65 65 6c 69 73 74  no FROM freelist
32d90 3b 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  ;".    );.  }.. 
32da0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
32db0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
32dc0 74 61 62 61 73 65 2c 20 61 64 64 20 61 6c 6c 20  tabase, add all 
32dd0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
32de0 73 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 72  s to.  ** the fr
32df0 65 65 6c 69 73 74 20 74 61 62 6c 65 2e 20 44 6f  eelist table. Do
32e00 20 74 68 69 73 20 72 65 67 61 72 64 6c 65 73 73   this regardless
32e10 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
32e20 6f 74 20 0a 20 20 2a 2a 20 2d 2d 66 72 65 65 6c  ot .  ** --freel
32e30 69 73 74 2d 63 6f 72 72 75 70 74 20 77 61 73 20  ist-corrupt was 
32e40 73 70 65 63 69 66 69 65 64 2e 20 20 2a 2f 0a 20  specified.  */. 
32e50 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74   shellExec(pStat
32e60 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20  e->db, &rc, .   
32e70 20 22 57 49 54 48 20 70 74 72 6d 61 70 28 70 67   "WITH ptrmap(pg
32e80 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20 22 20  no) AS (".    " 
32e90 20 53 45 4c 45 43 54 20 32 20 57 48 45 52 45 20   SELECT 2 WHERE 
32ea0 73 68 65 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20  shell_int32(".  
32eb0 20 20 22 20 20 20 20 28 53 45 4c 45 43 54 20 64    "    (SELECT d
32ec0 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ata FROM sqlite_
32ed0 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e  dbpage WHERE pgn
32ee0 6f 3d 31 29 2c 20 31 33 22 0a 20 20 20 20 22 20  o=1), 13".    " 
32ef0 20 29 22 0a 20 20 20 20 22 20 20 20 20 55 4e 49   )".    "    UNI
32f00 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 22 20 20  ON ALL ".    "  
32f10 53 45 4c 45 43 54 20 70 67 6e 6f 2b 31 2b 28 53  SELECT pgno+1+(S
32f20 45 4c 45 43 54 20 70 61 67 65 5f 73 69 7a 65 20  ELECT page_size 
32f30 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67 65  FROM pragma_page
32f40 5f 73 69 7a 65 29 2f 35 20 41 53 20 70 70 20 22  _size)/5 AS pp "
32f50 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 70 74 72  .    "  FROM ptr
32f60 6d 61 70 20 57 48 45 52 45 20 70 70 3c 3d 28 53  map WHERE pp<=(S
32f70 45 4c 45 43 54 20 70 61 67 65 5f 63 6f 75 6e 74  ELECT page_count
32f80 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67   FROM pragma_pag
32f90 65 5f 63 6f 75 6e 74 29 22 0a 20 20 20 20 22 29  e_count)".    ")
32fa0 22 0a 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  ".    "REPLACE I
32fb0 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 66 72 65  NTO recovery.fre
32fc0 65 6c 69 73 74 20 53 45 4c 45 43 54 20 70 67 6e  elist SELECT pgn
32fd0 6f 20 46 52 4f 4d 20 70 74 72 6d 61 70 22 0a 20  o FROM ptrmap". 
32fe0 20 29 3b 0a 0a 20 20 73 68 65 6c 6c 45 78 65 63   );..  shellExec
32ff0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
33000 2c 20 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  , .    "CREATE T
33010 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 64 62  ABLE recovery.db
33020 70 74 72 28 22 0a 20 20 20 20 22 20 20 20 20 20  ptr(".    "     
33030 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c 20 50 52   pgno, child, PR
33040 49 4d 41 52 59 20 4b 45 59 28 63 68 69 6c 64 2c  IMARY KEY(child,
33050 20 70 67 6e 6f 29 22 0a 20 20 20 20 22 29 20 57   pgno)".    ") W
33060 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20  ITHOUT ROWID;". 
33070 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
33080 4e 4f 52 45 20 49 4e 54 4f 20 72 65 63 6f 76 65  NORE INTO recove
33090 72 79 2e 64 62 70 74 72 28 70 67 6e 6f 2c 20 63  ry.dbptr(pgno, c
330a0 68 69 6c 64 29 20 22 0a 20 20 20 20 22 20 20 20  hild) ".    "   
330b0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
330c0 71 6c 69 74 65 5f 64 62 70 74 72 22 0a 20 20 20  qlite_dbptr".   
330d0 20 22 20 20 20 20 20 20 57 48 45 52 45 20 70 67   "      WHERE pg
330e0 6e 6f 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69  no NOT IN freeli
330f0 73 74 20 41 4e 44 20 63 68 69 6c 64 20 4e 4f 54  st AND child NOT
33100 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a 0a   IN freelist;"..
33110 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e      /* Delete an
33120 79 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  y pointer to pag
33130 65 20 31 2e 20 54 68 69 73 20 65 6e 73 75 72 65  e 1. This ensure
33140 73 20 74 68 61 74 20 70 61 67 65 20 31 20 69 73  s that page 1 is
33150 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20   considered.    
33160 2a 2a 20 61 20 72 6f 6f 74 20 70 61 67 65 2c 20  ** a root page, 
33170 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f  regardless of ho
33180 77 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 62  w corrupt the db
33190 20 69 73 2e 20 2a 2f 0a 20 20 20 20 22 44 45 4c   is. */.    "DEL
331a0 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  ETE FROM recover
331b0 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68  y.dbptr WHERE ch
331c0 69 6c 64 20 3d 20 31 3b 22 0a 0a 20 20 20 20 2f  ild = 1;"..    /
331d0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 70 6f 69  * Delete all poi
331e0 6e 74 65 72 73 20 74 6f 20 61 6e 79 20 70 61 67  nters to any pag
331f0 65 73 20 74 68 61 74 20 68 61 76 65 20 6d 6f 72  es that have mor
33200 65 20 74 68 61 6e 20 6f 6e 65 20 70 6f 69 6e 74  e than one point
33210 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  er.    ** to the
33220 6d 2e 20 53 75 63 68 20 70 61 67 65 73 20 77 69  m. Such pages wi
33230 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ll be treated as
33240 20 72 6f 6f 74 20 70 61 67 65 73 20 77 68 65 6e   root pages when
33250 20 72 65 63 6f 76 65 72 69 6e 67 0a 20 20 20 20   recovering.    
33260 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20  ** data.  */.   
33270 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65   "DELETE FROM re
33280 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45  covery.dbptr WHE
33290 52 45 20 63 68 69 6c 64 20 49 4e 20 28 22 0a 20  RE child IN (". 
332a0 20 20 20 22 20 20 53 45 4c 45 43 54 20 63 68 69     "  SELECT chi
332b0 6c 64 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  ld FROM recovery
332c0 2e 64 62 70 74 72 20 47 52 4f 55 50 20 42 59 20  .dbptr GROUP BY 
332d0 63 68 69 6c 64 20 48 41 56 49 4e 47 20 63 6f 75  child HAVING cou
332e0 6e 74 28 2a 29 3e 31 22 0a 20 20 20 20 22 29 3b  nt(*)>1".    ");
332f0 22 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  "..    /* Create
33300 20 74 68 65 20 22 6d 61 70 22 20 74 61 62 6c 65   the "map" table
33310 20 74 68 61 74 20 77 69 6c 6c 20 28 65 76 65 6e   that will (even
33320 74 75 61 6c 6c 79 29 20 63 6f 6e 74 61 69 6e 20  tually) contain 
33330 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20  instructions.   
33340 20 2a 2a 20 66 6f 72 20 64 65 61 6c 69 6e 67 20   ** for dealing 
33350 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 69  with each page i
33360 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
33370 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
33380 72 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  re .    ** recor
33390 64 73 2e 20 2a 2f 0a 20 20 20 20 22 43 52 45 41  ds. */.    "CREA
333a0 54 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72  TE TABLE recover
333b0 79 2e 6d 61 70 28 22 0a 20 20 20 20 20 20 22 70  y.map(".      "p
333c0 67 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gno INTEGER PRIM
333d0 41 52 59 20 4b 45 59 2c 20 6d 61 78 6c 65 6e 20  ARY KEY, maxlen 
333e0 49 4e 54 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f  INT, intkey, roo
333f0 74 20 49 4e 54 22 0a 20 20 20 20 22 29 3b 22 0a  t INT".    ");".
33400 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
33410 20 74 61 62 6c 65 20 5b 6d 61 70 5d 2e 20 49 66   table [map]. If
33420 20 74 68 65 72 65 20 61 72 65 20 63 69 72 63 75   there are circu
33430 6c 61 72 20 6c 6f 6f 70 73 20 6f 66 20 70 61 67  lar loops of pag
33440 65 73 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  es in the.    **
33450 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
33460 6f 6c 6c 6f 77 69 6e 67 20 61 64 64 73 20 61 6c  ollowing adds al
33470 6c 20 70 61 67 65 73 20 69 6e 20 73 75 63 68 20  l pages in such 
33480 61 20 6c 6f 6f 70 20 74 6f 20 74 68 65 20 6d 61  a loop to the ma
33490 70 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 69  p.    ** as indi
334a0 76 69 64 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  vidual root page
334b0 73 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  s. This could be
334c0 20 68 61 6e 64 6c 65 64 20 62 65 74 74 65 72 2e   handled better.
334d0 20 20 2a 2f 0a 20 20 20 20 22 57 49 54 48 20 70    */.    "WITH p
334e0 61 67 65 73 28 69 2c 20 6d 61 78 6c 65 6e 29 20  ages(i, maxlen) 
334f0 41 53 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  AS (".    "  SEL
33500 45 43 54 20 70 61 67 65 5f 63 6f 75 6e 74 2c 20  ECT page_count, 
33510 28 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  (".    "    SELE
33520 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29 20  CT max(field+1) 
33530 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61  FROM sqlite_dbda
33540 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 70 61  ta WHERE pgno=pa
33550 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22 20  ge_count".    " 
33560 20 29 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70   ) FROM pragma_p
33570 61 67 65 5f 63 6f 75 6e 74 20 57 48 45 52 45 20  age_count WHERE 
33580 70 61 67 65 5f 63 6f 75 6e 74 3e 30 22 0a 20 20  page_count>0".  
33590 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c    "    UNION ALL
335a0 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
335b0 69 2d 31 2c 20 28 22 0a 20 20 20 20 22 20 20 20  i-1, (".    "   
335c0 20 53 45 4c 45 43 54 20 6d 61 78 28 66 69 65 6c   SELECT max(fiel
335d0 64 2b 31 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  d+1) FROM sqlite
335e0 5f 64 62 64 61 74 61 20 57 48 45 52 45 20 70 67  _dbdata WHERE pg
335f0 6e 6f 3d 69 2d 31 22 0a 20 20 20 20 22 20 20 29  no=i-1".    "  )
33600 20 46 52 4f 4d 20 70 61 67 65 73 20 57 48 45 52   FROM pages WHER
33610 45 20 69 3e 3d 32 22 0a 20 20 20 20 22 29 22 0a  E i>=2".    ")".
33620 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
33630 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 28 70 67   recovery.map(pg
33640 6e 6f 2c 20 6d 61 78 6c 65 6e 2c 20 69 6e 74 6b  no, maxlen, intk
33650 65 79 2c 20 72 6f 6f 74 29 20 22 0a 20 20 20 20  ey, root) ".    
33660 22 20 20 53 45 4c 45 43 54 20 69 2c 20 6d 61 78  "  SELECT i, max
33670 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 28 22 0a 20 20  len, NULL, (".  
33680 20 20 22 20 20 20 20 57 49 54 48 20 70 28 6f 72    "    WITH p(or
33690 69 67 2c 20 70 67 6e 6f 2c 20 70 61 72 65 6e 74  ig, pgno, parent
336a0 29 20 41 53 20 28 22 0a 20 20 20 20 22 20 20 20  ) AS (".    "   
336b0 20 20 20 53 45 4c 45 43 54 20 30 2c 20 69 2c 20     SELECT 0, i, 
336c0 28 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f  (SELECT pgno FRO
336d0 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  M recovery.dbptr
336e0 20 57 48 45 52 45 20 63 68 69 6c 64 3d 69 29 22   WHERE child=i)"
336f0 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 55 4e  .    "        UN
33700 49 4f 4e 20 22 0a 20 20 20 20 22 20 20 20 20 20  ION ".    "     
33710 20 53 45 4c 45 43 54 20 69 2c 20 70 2e 70 61 72   SELECT i, p.par
33720 65 6e 74 2c 20 22 0a 20 20 20 20 22 20 20 20 20  ent, ".    "    
33730 20 20 20 20 28 53 45 4c 45 43 54 20 70 67 6e 6f      (SELECT pgno
33740 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
33750 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64  bptr WHERE child
33760 3d 70 2e 70 61 72 65 6e 74 29 20 46 52 4f 4d 20  =p.parent) FROM 
33770 70 22 0a 20 20 20 20 22 20 20 20 20 29 22 0a 20  p".    "    )". 
33780 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 70     "    SELECT p
33790 67 6e 6f 20 46 52 4f 4d 20 70 20 57 48 45 52 45  gno FROM p WHERE
337a0 20 28 70 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c   (parent IS NULL
337b0 20 4f 52 20 70 67 6e 6f 20 3d 20 6f 72 69 67 29   OR pgno = orig)
337c0 22 0a 20 20 20 20 22 29 20 22 0a 20 20 20 20 22  ".    ") ".    "
337d0 46 52 4f 4d 20 70 61 67 65 73 20 57 48 45 52 45  FROM pages WHERE
337e0 20 6d 61 78 6c 65 6e 20 3e 20 30 20 41 4e 44 20   maxlen > 0 AND 
337f0 69 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69 73  i NOT IN freelis
33800 74 3b 22 0a 20 20 20 20 22 55 50 44 41 54 45 20  t;".    "UPDATE 
33810 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 41 53 20  recovery.map AS 
33820 6f 20 53 45 54 20 69 6e 74 6b 65 79 20 3d 20 28  o SET intkey = (
33830 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
33840 73 75 62 73 74 72 28 64 61 74 61 2c 20 31 2c 20  substr(data, 1, 
33850 31 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20 73  1)==X'0D' FROM s
33860 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45  qlite_dbpage WHE
33870 52 45 20 70 67 6e 6f 3d 6f 2e 70 67 6e 6f 22 0a  RE pgno=o.pgno".
33880 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a      ");"..    /*
33890 20 45 78 74 72 61 63 74 20 64 61 74 61 20 66 72   Extract data fr
338a0 6f 6d 20 70 61 67 65 20 31 20 61 6e 64 20 61 6e  om page 1 and an
338b0 79 20 6c 69 6e 6b 65 64 20 70 61 67 65 73 20 69  y linked pages i
338c0 6e 74 6f 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  nto table.    **
338d0 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
338e0 2e 20 57 69 74 68 20 74 68 65 20 73 61 6d 65 20  . With the same 
338f0 73 63 68 65 6d 61 20 61 73 20 61 6e 20 73 71 6c  schema as an sql
33900 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
33910 2e 20 20 2a 2f 0a 20 20 20 20 22 43 52 45 41 54  .  */.    "CREAT
33920 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79  E TABLE recovery
33930 2e 73 63 68 65 6d 61 28 74 79 70 65 2c 20 6e 61  .schema(type, na
33940 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f  me, tbl_name, ro
33950 6f 74 70 61 67 65 2c 20 73 71 6c 29 3b 22 0a 20  otpage, sql);". 
33960 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
33970 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20  recovery.schema 
33980 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
33990 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69  max(CASE WHEN fi
339a0 65 6c 64 3d 30 20 54 48 45 4e 20 76 61 6c 75 65  eld=0 THEN value
339b0 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c   ELSE NULL END),
339c0 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53  ".    "  max(CAS
339d0 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 31 20 54  E WHEN field=1 T
339e0 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e  HEN value ELSE N
339f0 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22  ULL END),".    "
33a00 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20    max(CASE WHEN 
33a10 66 69 65 6c 64 3d 32 20 54 48 45 4e 20 76 61 6c  field=2 THEN val
33a20 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44  ue ELSE NULL END
33a30 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43  ),".    "  max(C
33a40 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 33  ASE WHEN field=3
33a50 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45   THEN value ELSE
33a60 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20   NULL END),".   
33a70 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45   "  max(CASE WHE
33a80 4e 20 66 69 65 6c 64 3d 34 20 54 48 45 4e 20 76  N field=4 THEN v
33a90 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45  alue ELSE NULL E
33aa0 4e 44 29 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  ND)".    "FROM s
33ab0 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48 45  qlite_dbdata WHE
33ac0 52 45 20 70 67 6e 6f 20 49 4e 20 28 22 0a 20 20  RE pgno IN (".  
33ad0 20 20 22 20 20 53 45 4c 45 43 54 20 70 67 6e 6f    "  SELECT pgno
33ae0 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d   FROM recovery.m
33af0 61 70 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 22  ap WHERE root=1"
33b00 0a 20 20 20 20 22 29 22 0a 20 20 20 20 22 47 52  .    ")".    "GR
33b10 4f 55 50 20 42 59 20 70 67 6e 6f 2c 20 63 65 6c  OUP BY pgno, cel
33b20 6c 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  l;".    "CREATE 
33b30 49 4e 44 45 58 20 72 65 63 6f 76 65 72 79 2e 73  INDEX recovery.s
33b40 63 68 65 6d 61 5f 72 6f 6f 74 70 61 67 65 20 4f  chema_rootpage O
33b50 4e 20 73 63 68 65 6d 61 28 72 6f 6f 74 70 61 67  N schema(rootpag
33b60 65 29 3b 22 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  e);".  );..  /* 
33b70 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
33b80 6f 6e 2c 20 74 68 65 6e 20 70 72 69 6e 74 20 6f  on, then print o
33b90 75 74 20 61 6c 6c 20 6e 6f 6e 2d 76 69 72 74 75  ut all non-virtu
33ba0 61 6c 2c 20 6e 6f 6e 2d 22 73 71 6c 69 74 65 5f  al, non-"sqlite_
33bb0 25 22 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  %" .  ** CREATE 
33bc0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
33bd0 20 74 68 61 74 20 65 78 74 72 61 63 74 65 64 20   that extracted 
33be0 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69 6e  from the existin
33bf0 67 20 73 63 68 65 6d 61 2e 20 20 2a 2f 0a 20 20  g schema.  */.  
33c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33c10 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
33c20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
33c30 3b 0a 20 20 20 20 2f 2a 20 22 2e 72 65 63 6f 76  ;.    /* ".recov
33c40 65 72 22 20 6d 69 67 68 74 20 6f 75 74 70 75 74  er" might output
33c50 20 63 6f 6e 74 65 6e 74 20 69 6e 20 61 6e 20 6f   content in an o
33c60 72 64 65 72 20 77 68 69 63 68 20 63 61 75 73 65  rder which cause
33c70 73 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  s immediate.    
33c80 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ** foreign key c
33c90 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
33ca0 20 76 69 6f 6c 61 74 65 64 2e 20 53 6f 20 64 69   violated. So di
33cb0 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65  sable foreign-ke
33cc0 79 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61  y.    ** constra
33cd0 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
33ce0 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
33cf0 65 6d 73 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ems when running
33d00 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
33d10 2a 2a 20 73 63 72 69 70 74 2e 20 2a 2f 0a 20 20  ** script. */.  
33d20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
33d30 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  ate->out, "PRAGM
33d40 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f  A foreign_keys=O
33d50 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77  FF;\n");.    raw
33d60 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
33d70 6f 75 74 2c 20 22 42 45 47 49 4e 3b 5c 6e 22 29  out, "BEGIN;\n")
33d80 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
33d90 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50  (pState->out, "P
33da0 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
33db0 63 68 65 6d 61 20 3d 20 6f 6e 3b 5c 6e 22 29 3b  chema = on;\n");
33dc0 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
33dd0 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  e(pState->db, &r
33de0 63 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  c,.        "SELE
33df0 43 54 20 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f  CT sql FROM reco
33e00 76 65 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20  very.schema ".  
33e10 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
33e20 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 73 71  e='table' AND sq
33e30 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20 74  l LIKE 'create t
33e40 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d 74 0a  able%'", &pStmt.
33e50 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
33e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33e70 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
33e80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
33e90 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  t) ){.      cons
33ea0 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54  t char *zCreateT
33eb0 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  able = (const ch
33ec0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
33ed0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
33ee0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
33ef0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
33f00 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
33f10 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 3b  F NOT EXISTS %s;
33f20 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
33f30 26 7a 43 72 65 61 74 65 54 61 62 6c 65 5b 31 32  &zCreateTable[12
33f40 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ].      );.    }
33f50 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
33f60 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
33f70 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
33f80 20 6f 75 74 20 69 66 20 61 6e 20 6f 72 70 68 61   out if an orpha
33f90 6e 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  n table will be 
33fa0 72 65 71 75 69 72 65 64 2e 20 41 6e 64 20 69 66  required. And if
33fb0 20 73 6f 2c 20 68 6f 77 20 6d 61 6e 79 0a 20 20   so, how many.  
33fc0 2a 2a 20 75 73 65 72 20 63 6f 6c 75 6d 6e 73 20  ** user columns 
33fd0 69 74 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  it should contai
33fe0 6e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70  n */.  shellPrep
33ff0 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
34000 26 72 63 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  &rc, .      "SEL
34010 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78  ECT coalesce(max
34020 28 6d 61 78 6c 65 6e 29 2c 20 2d 32 29 20 46 52  (maxlen), -2) FR
34030 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 20  OM recovery.map 
34040 57 48 45 52 45 20 72 6f 6f 74 3e 31 22 0a 20 20  WHERE root>1".  
34050 20 20 20 20 2c 20 26 70 4c 6f 6f 70 0a 20 20 29      , &pLoop.  )
34060 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
34070 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
34080 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
34090 70 28 70 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20  p(pLoop) ){.    
340a0 6e 4f 72 70 68 61 6e 20 3d 20 73 71 6c 69 74 65  nOrphan = sqlite
340b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f  3_column_int(pLo
340c0 6f 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 68  op, 0);.  }.  sh
340d0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
340e0 20 70 4c 6f 6f 70 29 3b 0a 20 20 70 4c 6f 6f 70   pLoop);.  pLoop
340f0 20 3d 20 30 3b 0a 0a 20 20 73 68 65 6c 6c 50 72   = 0;..  shellPr
34100 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62  epare(pState->db
34110 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45  , &rc,.      "SE
34120 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72  LECT pgno FROM r
34130 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52  ecovery.map WHER
34140 45 20 72 6f 6f 74 3d 3f 22 2c 20 26 70 50 61 67  E root=?", &pPag
34150 65 73 0a 20 20 29 3b 0a 20 20 73 68 65 6c 6c 50  es.  );.  shellP
34160 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64  repare(pState->d
34170 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22 53  b, &rc,.      "S
34180 45 4c 45 43 54 20 6d 61 78 28 66 69 65 6c 64 29  ELECT max(field)
34190 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73  , group_concat(s
341a0 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c  hell_escape_crnl
341b0 28 71 75 6f 74 65 28 76 61 6c 75 65 29 29 2c 20  (quote(value)), 
341c0 27 2c 20 27 29 22 0a 20 20 20 20 20 20 22 2c 20  ', ')".      ", 
341d0 6d 69 6e 28 66 69 65 6c 64 29 20 22 0a 20 20 20  min(field) ".   
341e0 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
341f0 64 62 64 61 74 61 20 57 48 45 52 45 20 70 67 6e  dbdata WHERE pgn
34200 6f 20 3d 20 3f 20 41 4e 44 20 66 69 65 6c 64 20  o = ? AND field 
34210 21 3d 20 3f 22 0a 20 20 20 20 20 20 22 47 52 4f  != ?".      "GRO
34220 55 50 20 42 59 20 63 65 6c 6c 22 2c 20 26 70 43  UP BY cell", &pC
34230 65 6c 6c 73 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  ells.  );..  /* 
34240 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
34250 68 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  h root page. */.
34260 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
34270 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20  State->db, &rc, 
34280 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72  .      "SELECT r
34290 6f 6f 74 2c 20 69 6e 74 6b 65 79 2c 20 6d 61 78  oot, intkey, max
342a0 28 6d 61 78 6c 65 6e 29 20 46 52 4f 4d 20 72 65  (maxlen) FROM re
342b0 63 6f 76 65 72 79 2e 6d 61 70 22 20 0a 20 20 20  covery.map" .   
342c0 20 20 20 22 20 57 48 45 52 45 20 72 6f 6f 74 3e     " WHERE root>
342d0 31 20 47 52 4f 55 50 20 42 59 20 72 6f 6f 74 2c  1 GROUP BY root,
342e0 20 69 6e 74 6b 65 79 20 4f 52 44 45 52 20 42 59   intkey ORDER BY
342f0 20 72 6f 6f 74 3d 28 22 0a 20 20 20 20 20 20 22   root=(".      "
34300 20 20 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67    SELECT rootpag
34310 65 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  e FROM recovery.
34320 73 63 68 65 6d 61 20 57 48 45 52 45 20 6e 61 6d  schema WHERE nam
34330 65 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  e='sqlite_sequen
34340 63 65 27 22 0a 20 20 20 20 20 20 22 29 22 2c 20  ce'".      ")", 
34350 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20 20 77 68  &pLoop.  );.  wh
34360 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
34370 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
34380 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
34390 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 69 6e 74  Loop) ){.    int
343a0 20 69 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   iRoot = sqlite3
343b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f  _column_int(pLoo
343c0 70 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 62  p, 0);.    int b
343d0 49 6e 74 6b 65 79 20 3d 20 73 71 6c 69 74 65 33  Intkey = sqlite3
343e0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f  _column_int(pLoo
343f0 70 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e  p, 1);.    int n
34400 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
34410 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20  lumn_int(pLoop, 
34420 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 4e 6f 6f  2);.    int bNoo
34430 70 20 3d 20 30 3b 0a 20 20 20 20 52 65 63 6f 76  p = 0;.    Recov
34440 65 72 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a  erTable *pTab;..
34450 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 74      assert( bInt
34460 6b 65 79 3d 3d 30 20 7c 7c 20 62 49 6e 74 6b 65  key==0 || bIntke
34470 79 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  y==1 );.    pTab
34480 20 3d 20 72 65 63 6f 76 65 72 46 69 6e 64 54 61   = recoverFindTa
34490 62 6c 65 28 70 53 74 61 74 65 2c 20 26 72 63 2c  ble(pState, &rc,
344a0 20 69 52 6f 6f 74 2c 20 62 49 6e 74 6b 65 79 2c   iRoot, bIntkey,
344b0 20 6e 43 6f 6c 2c 20 26 62 4e 6f 6f 70 29 3b 0a   nCol, &bNoop);.
344c0 20 20 20 20 69 66 28 20 62 4e 6f 6f 70 20 7c 7c      if( bNoop ||
344d0 20 72 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a   rc ) continue;.
344e0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
344f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ){.      if( pOr
34500 70 68 61 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  phan==0 ){.     
34510 20 20 20 70 4f 72 70 68 61 6e 20 3d 20 72 65 63     pOrphan = rec
34520 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65 28  overOrphanTable(
34530 70 53 74 61 74 65 2c 20 26 72 63 2c 20 7a 4c 6f  pState, &rc, zLo
34540 73 74 41 6e 64 46 6f 75 6e 64 2c 20 6e 4f 72 70  stAndFound, nOrp
34550 68 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  han);.      }.  
34560 20 20 20 20 70 54 61 62 20 3d 20 70 4f 72 70 68      pTab = pOrph
34570 61 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  an;.      if( pT
34580 61 62 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ab==0 ) break;. 
34590 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
345a0 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
345b0 28 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 2c 20  (pTab->zQuoted, 
345c0 22 5c 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  "\"sqlite_sequen
345d0 63 65 5c 22 22 29 20 29 7b 0a 20 20 20 20 20 20  ce\"") ){.      
345e0 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
345f0 65 2d 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45 20  e->out, "DELETE 
34600 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75  FROM sqlite_sequ
34610 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  ence;\n");.    }
34620 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
34630 64 5f 69 6e 74 28 70 50 61 67 65 73 2c 20 31 2c  d_int(pPages, 1,
34640 20 69 52 6f 6f 74 29 3b 0a 20 20 20 20 73 71 6c   iRoot);.    sql
34650 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43  ite3_bind_int(pC
34660 65 6c 6c 73 2c 20 32 2c 20 70 54 61 62 2d 3e 69  ells, 2, pTab->i
34670 50 6b 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  Pk);..    while(
34680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34690 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
346a0 6c 69 74 65 33 5f 73 74 65 70 28 70 50 61 67 65  lite3_step(pPage
346b0 73 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  s) ){.      int 
346c0 69 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f  iPgno = sqlite3_
346d0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50 61 67 65  column_int(pPage
346e0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  s, 0);.      sql
346f0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43  ite3_bind_int(pC
34700 65 6c 6c 73 2c 20 31 2c 20 69 50 67 6e 6f 29 3b  ells, 1, iPgno);
34710 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
34720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
34730 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
34740 65 33 5f 73 74 65 70 28 70 43 65 6c 6c 73 29 20  e3_step(pCells) 
34750 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
34760 46 69 65 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f  Field = sqlite3_
34770 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c  column_int(pCell
34780 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
34790 6e 74 20 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65  nt iMin = sqlite
347a0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 65  3_column_int(pCe
347b0 6c 6c 73 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  lls, 2);.       
347c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
347d0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
347e0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
347f0 74 65 78 74 28 70 43 65 6c 6c 73 2c 20 31 29 3b  text(pCells, 1);
34800 0a 0a 20 20 20 20 20 20 20 20 52 65 63 6f 76 65  ..        Recove
34810 72 54 61 62 6c 65 20 2a 70 54 61 62 32 20 3d 20  rTable *pTab2 = 
34820 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
34830 28 20 70 54 61 62 21 3d 70 4f 72 70 68 61 6e 20  ( pTab!=pOrphan 
34840 26 26 20 28 69 4d 69 6e 3c 30 29 21 3d 62 49 6e  && (iMin<0)!=bIn
34850 74 6b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tkey ){.        
34860 20 20 69 66 28 20 70 4f 72 70 68 61 6e 3d 3d 30    if( pOrphan==0
34870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34880 70 4f 72 70 68 61 6e 20 3d 20 72 65 63 6f 76 65  pOrphan = recove
34890 72 4f 72 70 68 61 6e 54 61 62 6c 65 28 70 53 74  rOrphanTable(pSt
348a0 61 74 65 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41  ate, &rc, zLostA
348b0 6e 64 46 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e  ndFound, nOrphan
348c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
348d0 20 20 20 20 20 20 20 20 20 70 54 61 62 32 20 3d           pTab2 =
348e0 20 70 4f 72 70 68 61 6e 3b 0a 20 20 20 20 20 20   pOrphan;.      
348f0 20 20 20 20 69 66 28 20 70 54 61 62 32 3d 3d 30      if( pTab2==0
34900 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
34910 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6e 46 69    }..        nFi
34920 65 6c 64 20 3d 20 6e 46 69 65 6c 64 2b 31 3b 0a  eld = nField+1;.
34930 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
34940 32 3d 3d 70 4f 72 70 68 61 6e 20 29 7b 0a 20 20  2==pOrphan ){.  
34950 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
34960 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
34970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
34980 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 20 56  INSERT INTO %s V
34990 41 4c 55 45 53 28 25 64 2c 20 25 64 2c 20 25 64  ALUES(%d, %d, %d
349a0 2c 20 25 73 25 73 25 73 29 3b 5c 6e 22 2c 0a 20  , %s%s%s);\n",. 
349b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
349c0 62 32 2d 3e 7a 51 75 6f 74 65 64 2c 20 69 52 6f  b2->zQuoted, iRo
349d0 6f 74 2c 20 69 50 67 6e 6f 2c 20 6e 46 69 65 6c  ot, iPgno, nFiel
349e0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
349f0 20 69 4d 69 6e 3c 30 20 3f 20 22 22 20 3a 20 22   iMin<0 ? "" : "
34a00 4e 55 4c 4c 2c 20 22 2c 20 7a 56 61 6c 2c 20 70  NULL, ", zVal, p
34a10 54 61 62 32 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69  Tab2->azlCol[nFi
34a20 65 6c 64 5d 0a 20 20 20 20 20 20 20 20 20 20 29  eld].          )
34a30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
34a40 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
34a50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
34a60 74 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  t, "INSERT INTO 
34a70 25 73 28 25 73 29 20 56 41 4c 55 45 53 28 20 25  %s(%s) VALUES( %
34a80 73 20 29 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20  s );\n", .      
34a90 20 20 20 20 20 20 20 20 70 54 61 62 32 2d 3e 7a          pTab2->z
34aa0 51 75 6f 74 65 64 2c 20 70 54 61 62 32 2d 3e 61  Quoted, pTab2->a
34ab0 7a 6c 43 6f 6c 5b 6e 46 69 65 6c 64 5d 2c 20 7a  zlCol[nField], z
34ac0 56 61 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b  Val.          );
34ad0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34ae0 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
34af0 73 65 74 28 26 72 63 2c 20 70 43 65 6c 6c 73 29  set(&rc, pCells)
34b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  ;.    }.    shel
34b10 6c 52 65 73 65 74 28 26 72 63 2c 20 70 50 61 67  lReset(&rc, pPag
34b20 65 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  es);.    if( pTa
34b30 62 21 3d 70 4f 72 70 68 61 6e 20 29 20 72 65 63  b!=pOrphan ) rec
34b40 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28 70 54  overFreeTable(pT
34b50 61 62 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c  ab);.  }.  shell
34b60 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c  Finalize(&rc, pL
34b70 6f 6f 70 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e  oop);.  shellFin
34b80 61 6c 69 7a 65 28 26 72 63 2c 20 70 50 61 67 65  alize(&rc, pPage
34b90 73 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c  s);.  shellFinal
34ba0 69 7a 65 28 26 72 63 2c 20 70 43 65 6c 6c 73 29  ize(&rc, pCells)
34bb0 3b 0a 20 20 72 65 63 6f 76 65 72 46 72 65 65 54  ;.  recoverFreeT
34bc0 61 62 6c 65 28 70 4f 72 70 68 61 6e 29 3b 0a 0a  able(pOrphan);..
34bd0 20 20 2f 2a 20 54 68 65 20 72 65 73 74 20 6f 66    /* The rest of
34be0 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20   the schema */. 
34bf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34c00 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
34c10 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
34c20 30 3b 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70  0;.    shellPrep
34c30 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
34c40 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 22 53  &rc, .        "S
34c50 45 4c 45 43 54 20 73 71 6c 2c 20 6e 61 6d 65 20  ELECT sql, name 
34c60 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63  FROM recovery.sc
34c70 68 65 6d 61 20 22 0a 20 20 20 20 20 20 20 20 22  hema ".        "
34c80 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4c 49  WHERE sql NOT LI
34c90 4b 45 20 27 63 72 65 61 74 65 20 74 61 62 6c 65  KE 'create table
34ca0 25 27 22 2c 20 26 70 53 74 6d 74 0a 20 20 20 20  %'", &pStmt.    
34cb0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
34cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
34cd0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
34ce0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
34cf0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
34d00 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ar *zSql = (cons
34d10 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
34d20 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
34d30 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
34d40 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
34d50 70 28 7a 53 71 6c 2c 20 22 63 72 65 61 74 65 20  p(zSql, "create 
34d60 76 69 72 74 22 2c 20 31 31 29 3d 3d 30 20 29 7b  virt", 11)==0 ){
34d70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
34d80 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
34d90 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
34da0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
34db0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
34dc0 20 63 68 61 72 20 2a 7a 50 72 69 6e 74 20 3d 20   char *zPrint = 
34dd0 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63  shellMPrintf(&rc
34de0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  , .          "IN
34df0 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
34e00 5f 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28 27  _master VALUES('
34e10 74 61 62 6c 65 27 2c 20 25 51 2c 20 25 51 2c 20  table', %Q, %Q, 
34e20 30 2c 20 25 51 29 22 2c 0a 20 20 20 20 20 20 20  0, %Q)",.       
34e30 20 20 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c     zName, zName,
34e40 20 7a 53 71 6c 0a 20 20 20 20 20 20 20 20 29 3b   zSql.        );
34e50 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
34e60 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
34e70 20 22 25 73 3b 5c 6e 22 2c 20 7a 50 72 69 6e 74   "%s;\n", zPrint
34e80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34e90 65 33 5f 66 72 65 65 28 7a 50 72 69 6e 74 29 3b  e3_free(zPrint);
34ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34eb0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34ec0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25  (pState->out, "%
34ed0 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  s;\n", zSql);.  
34ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34ef0 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
34f00 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  c, pStmt);.  }..
34f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  _OK ){.    raw_p
34f30 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
34f40 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
34f50 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20 6f 66 66  ble_schema = off
34f60 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70  ;\n");.    raw_p
34f70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
34f80 74 2c 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b  t, "COMMIT;\n");
34f90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65  .  }.  sqlite3_e
34fa0 78 65 63 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  xec(pState->db, 
34fb0 22 44 45 54 41 43 48 20 72 65 63 6f 76 65 72 79  "DETACH recovery
34fc0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72  ", 0, 0, 0);.  r
34fd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
34fe0 69 66 20 2f 2a 20 21 28 53 51 4c 49 54 45 5f 4f  if /* !(SQLITE_O
34ff0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
35000 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
35010 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
35020 45 5f 56 54 41 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_VTAB) */.../*.
35030 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c  ** If an input l
35040 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ine begins with 
35050 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  "." then invoke 
35060 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
35070 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  ** process that 
35080 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  line..**.** Retu
35090 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
350a0 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
350b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
350c0 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61  atic int do_meta
350d0 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a  _command(char *z
350e0 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65  Line, ShellState
350f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20   *p){.  int h = 
35100 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  1;.  int nArg = 
35110 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20  0;.  int n, c;. 
35120 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
35130 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a  har *azArg[50];.
35140 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35150 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
35160 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72  E.  if( p->exper
35170 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
35180 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c   expertFinish(p,
35190 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
351a0 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  if..  /* Parse t
351b0 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e  he input line in
351c0 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  to tokens..  */.
351d0 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
351e0 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53  ] && nArg<ArrayS
351f0 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20  ize(azArg) ){.  
35200 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
35210 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
35220 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69  +; }.    if( zLi
35230 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b  ne[h]==0 ) break
35240 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  ;.    if( zLine[
35250 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e  h]=='\'' || zLin
35260 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  e[h]=='"' ){.   
35270 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a     int delim = z
35280 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20  Line[h++];.     
35290 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
352a0 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20   &zLine[h];.    
352b0 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
352c0 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64  ] && zLine[h]!=d
352d0 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
352e0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c  if( zLine[h]=='\
352f0 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27  \' && delim=='"'
35300 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d   && zLine[h+1]!=
35310 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) h++;.       
35320 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   h++;.      }.  
35330 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
35340 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  ==delim ){.     
35350 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20     zLine[h++] = 
35360 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
35370 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20   if( delim=='"' 
35380 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  ) resolve_backsl
35390 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
353a0 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -1]);.    }else{
353b0 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
353c0 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
353d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
353e0 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70  Line[h] && !IsSp
353f0 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
35400 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   h++; }.      if
35410 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69  ( zLine[h] ) zLi
35420 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[h++] = 0;.   
35430 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73     resolve_backs
35440 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
35450 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g-1]);.    }.  }
35460 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
35470 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20  he input line.. 
35480 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d   */.  if( nArg==
35490 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  0 ) return 0; /*
354a0 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65   no tokens, no e
354b0 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74  rror */.  n = st
354c0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29  rlen30(azArg[0])
354d0 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d  ;.  c = azArg[0]
354e0 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70  [0];.  clearTemp
354f0 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  File(p);..#ifnde
35500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35510 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
35520 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
35530 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
35540 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uth", n)==0 ){. 
35550 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
35560 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
35570 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
35580 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c  e: .auth ON|OFF\
35590 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
355a0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
355b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
355c0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
355d0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
355e0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
355f0 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
35600 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
35610 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
35620 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20  shellAuth, p);. 
35630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35640 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
35650 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c  orizer(p->db, 0,
35660 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
35670 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  se.#endif..#if !
35680 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
35690 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
356a0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
356b0 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20  ITE_HAVE_ZLIB). 
356c0 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73   if( c=='a' && s
356d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
356e0 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d   "archive", n)==
356f0 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
35700 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
35710 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c   arDotCommand(p,
35720 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29   0, azArg, nArg)
35730 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
35740 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20  ..  if( (c=='b' 
35750 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
35760 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
35770 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  ckup", n)==0).  
35780 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e   || (c=='s' && n
35790 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
357a0 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c  zArg[0], "save",
357b0 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20   n)==0).  ){.   
357c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
357d0 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  stFile = 0;.    
357e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
357f0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
35800 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c   *pDest;.    sql
35810 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
35820 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b  ckup;.    int j;
35830 0a 20 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20  .    int bAsync 
35840 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
35850 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
35860 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41     for(j=1; j<nA
35870 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; j++){.      
35880 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
35890 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
358a0 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
358b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31  .        if( z[1
358c0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
358d0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
358e0 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d  (z, "-append")==
358f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
35900 56 66 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b  Vfs = "apndvfs";
35910 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
35920 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
35930 70 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d  p(z, "-async")==
35940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
35950 41 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  Async = 1;.     
35960 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
35970 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
35980 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
35990 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
359a0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a  : %s\n", azArg[j
359b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ]);.          re
359c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
359d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
359e0 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
359f0 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  {.        zDestF
35a00 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
35a10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35a20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zDb==0 ){.      
35a30 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c    zDb = zDestFil
35a40 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  e;.        zDest
35a50 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
35a60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35a70 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
35a80 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
35a90 20 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f   .backup ?DB? ?O
35aa0 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45  PTIONS? FILENAME
35ab0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  \n");.        re
35ac0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
35ad0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
35ae0 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
35af0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35b00 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20  tderr, "missing 
35b10 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e  FILENAME argumen
35b20 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29  t on .backup\n")
35b30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
35b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35b50 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22  zDb==0 ) zDb = "
35b60 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20  main";.    rc = 
35b70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
35b80 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
35b90 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
35ba0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
35bb0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
35bc0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
35bd0 7a 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72  zVfs);.    if( r
35be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35bf0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35c00 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
35c10 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
35c20 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
35c30 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  le);.      close
35c40 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20  _db(pDest);.    
35c50 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
35c60 7d 0a 20 20 20 20 69 66 28 20 62 41 73 79 6e 63  }.    if( bAsync
35c70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35c80 33 5f 65 78 65 63 28 70 44 65 73 74 2c 20 22 50  3_exec(pDest, "P
35c90 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
35ca0 73 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f  s=OFF; PRAGMA jo
35cb0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22  urnal_mode=OFF;"
35cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35cd0 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20       0, 0, 0);. 
35ce0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
35cf0 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63  (p, 0);.    pBac
35d00 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
35d10 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
35d20 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20   "main", p->db, 
35d30 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  zDb);.    if( pB
35d40 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
35d50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35d60 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
35d70 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
35d80 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
35d90 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73     close_db(pDes
35da0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
35db0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
35dc0 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
35dd0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
35de0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
35df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
35e00 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
35e10 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
35e20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35e30 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
35e40 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
35e50 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
35e60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35e70 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
35e80 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
35e90 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  st));.      rc =
35ea0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c   1;.    }.    cl
35eb0 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20  ose_db(pDest);. 
35ec0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
35ed0 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
35ee0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
35ef0 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20  , "bail", n)==0 
35f00 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
35f10 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c  =2 ){.      bail
35f20 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c  _on_error = bool
35f30 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
35f40 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
35f50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35f60 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
35f70 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .bail on|off\n")
35f80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
35f90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
35fa0 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
35fb0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
35fc0 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79  zArg[0], "binary
35fd0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
35fe0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
35ff0 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e       if( boolean
36000 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
36010 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42 69  ){.        setBi
36020 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  naryMode(p->out,
36030 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
36040 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54 65 78  {.        setTex
36050 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
36060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36070 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
36080 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
36090 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e  sage: .binary on
360a0 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
360b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
360c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
360d0 27 63 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a  'c' && strcmp(az
360e0 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20  Arg[0],"cd")==0 
360f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
36100 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =2 ){.#if define
36110 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
36120 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20  ined(WIN32).    
36130 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
36140 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
36150 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41  8_to_unicode(azA
36160 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[1]);.      rc
36170 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44 69   = !SetCurrentDi
36180 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20  rectoryW(z);.   
36190 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
361a0 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
361b0 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67  rc = chdir(azArg
361c0 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  [1]);.#endif.   
361d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
361e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
361f0 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
36200 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   change to direc
36210 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  tory \"%s\"\n", 
36220 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
36230 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
36240 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36250 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
36260 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
36270 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29  cd DIRECTORY\n")
36280 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
36290 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
362a0 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65   /* The undocume
362b0 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e  nted ".breakpoin
362c0 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  t" command cause
362d0 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  s a call to the 
362e0 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69  no-op.  ** routi
362f0 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72  ne named test_br
36300 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f  eakpoint()..  */
36310 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
36320 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
36330 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61  (azArg[0], "brea
36340 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29  kpoint", n)==0 )
36350 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b  {.    test_break
36360 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65  point();.  }else
36370 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
36380 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
36390 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61  p(azArg[0], "cha
363a0 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  nges", n)==0 ){.
363b0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
363c0 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
363d0 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
363e0 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61  _CountChanges, a
363f0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
36400 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
36410 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
36420 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f  sage: .changes o
36430 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
36440 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
36450 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e   }else..  /* Can
36460 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72  cel output redir
36470 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ection, if it is
36480 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28   currently set (
36490 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20  by .testcase).  
364a0 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68 65  ** Then read the
364b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
364c0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
364d0 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72   file and compar
364e0 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61  e against.  ** a
364f0 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65  zArg[1].  If the
36500 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
36510 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72  es, report an er
36520 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20  ror and exit..  
36530 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  */.  if( c=='c' 
36540 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
36550 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68  mp(azArg[0], "ch
36560 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eck", n)==0 ){. 
36570 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20     char *zRes = 
36580 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65  0;.    output_re
36590 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20  set(p);.    if( 
365a0 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
365b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
365c0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65  rr, "Usage: .che
365d0 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c  ck GLOB-PATTERN\
365e0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
365f0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
36600 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c   (zRes = readFil
36610 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e("testcase-out.
36620 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  txt", 0))==0 ){.
36630 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36640 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
36650 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65   cannot read 'te
36660 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
36670 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
36680 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
36690 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61   testcase_glob(a
366a0 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30  zArg[1],zRes)==0
366b0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
366c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
366e0 74 65 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c  testcase-%s FAIL
366f0 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b  ED\n Expected: [
36700 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20  %s]\n      Got: 
36710 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
36720 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65            p->zTe
36730 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d  stcase, azArg[1]
36740 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72  , zRes);.      r
36750 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
36760 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
36770 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73  ntf(stdout, "tes
36780 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20  tcase-%s ok\n", 
36790 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20  p->zTestcase);. 
367a0 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b       p->nCheck++
367b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
367c0 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a  te3_free(zRes);.
367d0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
367e0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
367f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e  (azArg[0], "clon
36800 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
36810 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
36820 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65        tryToClone
36830 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  (p, azArg[1]);. 
36840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36850 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36860 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e  r, "Usage: .clon
36870 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  e FILENAME\n");.
36880 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36890 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
368a0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31  f( c=='d' && n>1
368b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
368c0 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73  g[0], "databases
368d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
368e0 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
368f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
36900 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e  sg = 0;.    open
36910 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d  _db(p, 0);.    m
36920 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
36930 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
36940 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
36950 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
36960 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
36970 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
36980 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
36990 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61  intf(sizeof(data
369a0 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64  .colSeparator),d
369b0 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
369c0 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61  ,": ");.    data
369d0 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  .cnt = 0;.    sq
369e0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
369f0 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  , "SELECT name, 
36a00 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61  file FROM pragma
36a10 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c  _database_list",
36a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36a30 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
36a40 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
36a50 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
36a60 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
36a70 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
36a80 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
36a90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36aa0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
36ab0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36ac0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
36ad0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d  f( c=='d' && n>=
36ae0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
36af0 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67  rg[0], "dbconfig
36b00 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36b10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
36b20 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69  uct DbConfigChoi
36b30 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ces {.      cons
36b40 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
36b50 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20       int op;.   
36b60 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d   } aDbConfig[] =
36b70 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e   {.        { "en
36b80 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20  able_fkey",     
36b90 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
36ba0 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20  IG_ENABLE_FKEY  
36bb0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
36bc0 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72      { "enable_tr
36bd0 69 67 67 65 72 22 2c 20 20 20 20 20 53 51 4c 49  igger",     SQLI
36be0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
36bf0 4c 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  LE_TRIGGER      
36c00 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
36c10 65 6e 61 62 6c 65 5f 76 69 65 77 22 2c 20 20 20  enable_view",   
36c20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
36c30 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 56 49 45 57  NFIG_ENABLE_VIEW
36c40 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
36c50 20 20 20 20 20 20 7b 20 22 66 74 73 33 5f 74 6f        { "fts3_to
36c60 6b 65 6e 69 7a 65 72 22 2c 20 20 20 20 20 53 51  kenizer",     SQ
36c70 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
36c80 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49  ABLE_FTS3_TOKENI
36c90 5a 45 52 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ZER },.        {
36ca0 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e   "load_extension
36cb0 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ",     SQLITE_DB
36cc0 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f  CONFIG_ENABLE_LO
36cd0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a  AD_EXTENSION },.
36ce0 20 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 63 6b          { "no_ck
36cf0 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20 20 20  pt_on_close",   
36d00 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
36d10 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
36d20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
36d30 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67 22   { "enable_qpsg"
36d40 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
36d50 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
36d60 51 50 53 47 20 20 20 20 20 20 20 20 20 20 20 7d  QPSG           }
36d70 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72 69  ,.        { "tri
36d80 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20  gger_eqp",      
36d90 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
36da0 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20  G_TRIGGER_EQP   
36db0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36dc0 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61     { "reset_data
36dd0 62 61 73 65 22 2c 20 20 20 20 20 53 51 4c 49 54  base",     SQLIT
36de0 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54  E_DBCONFIG_RESET
36df0 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20  _DATABASE       
36e00 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64   },.        { "d
36e10 65 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20  efensive",      
36e20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
36e30 46 49 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20  FIG_DEFENSIVE   
36e40 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
36e50 20 20 20 20 20 7b 20 22 77 72 69 74 61 62 6c 65       { "writable
36e60 5f 73 63 68 65 6d 61 22 2c 20 20 20 20 53 51 4c  _schema",    SQL
36e70 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49  ITE_DBCONFIG_WRI
36e80 54 41 42 4c 45 5f 53 43 48 45 4d 41 20 20 20 20  TABLE_SCHEMA    
36e90 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
36ea0 22 6c 65 67 61 63 79 5f 61 6c 74 65 72 5f 74 61  "legacy_alter_ta
36eb0 62 6c 65 22 2c 20 53 51 4c 49 54 45 5f 44 42 43  ble", SQLITE_DBC
36ec0 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c 54  ONFIG_LEGACY_ALT
36ed0 45 52 5f 54 41 42 4c 45 20 20 20 20 7d 2c 0a 20  ER_TABLE    },. 
36ee0 20 20 20 20 20 20 20 7b 20 22 64 71 73 5f 64 6d         { "dqs_dm
36ef0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  l",            S
36f00 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44  QLITE_DBCONFIG_D
36f10 51 53 5f 44 4d 4c 20 20 20 20 20 20 20 20 20 20  QS_DML          
36f20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
36f30 7b 20 22 64 71 73 5f 64 64 6c 22 2c 20 20 20 20  { "dqs_ddl",    
36f40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
36f50 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20  BCONFIG_DQS_DDL 
36f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
36f70 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
36f80 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f  ii, v;.    open_
36f90 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f  db(p, 0);.    fo
36fa0 72 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79  r(ii=0; ii<Array
36fb0 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b  Size(aDbConfig);
36fc0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
36fd0 28 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63  ( nArg>1 && strc
36fe0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62  mp(azArg[1], aDb
36ff0 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
37000 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
37010 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
37020 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
37030 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
37040 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  p->db, aDbConfig
37050 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e  [ii].op, boolean
37060 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c  Value(azArg[2]),
37070 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
37080 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
37090 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43  nfig(p->db, aDbC
370a0 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31  onfig[ii].op, -1
370b0 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66  , &v);.      utf
370c0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
370d0 20 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44   "%18s %s\n", aD
370e0 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d  bConfig[ii].zNam
370f0 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f  e, v ? "on" : "o
37100 66 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff");.      if( 
37110 6e 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a  nArg>1 ) break;.
37120 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
37130 72 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61  rg>1 && ii==Arra
37140 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29  ySize(aDbConfig)
37150 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
37160 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
37170 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62  rror: unknown db
37180 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22  config \"%s\"\n"
37190 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
371a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
371b0 74 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22  tderr, "Enter \"
371c0 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68  .dbconfig\" with
371d0 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
371e0 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20  r a list\n");.  
371f0 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a    }   .  }else..
37200 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
37210 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
37220 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66  azArg[0], "dbinf
37230 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
37240 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e   rc = shell_dbin
37250 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41  fo_command(p, nA
37260 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
37270 6c 73 65 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  lse..#if !define
37280 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
37290 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
372a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
372b0 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
372c0 29 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26  ).  if( c=='r' &
372d0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
372e0 30 5d 2c 20 22 72 65 63 6f 76 65 72 22 2c 20 6e  0], "recover", n
372f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
37300 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
37310 63 20 3d 20 72 65 63 6f 76 65 72 44 61 74 61 62  c = recoverDatab
37320 61 73 65 43 6d 64 28 70 2c 20 6e 41 72 67 2c 20  aseCmd(p, nArg, 
37330 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a  azArg);.  }else.
37340 23 65 6e 64 69 66 20 2f 2a 20 21 28 53 51 4c 49  #endif /* !(SQLI
37350 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
37360 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
37370 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44  (SQLITE_ENABLE_D
37380 42 50 41 47 45 5f 56 54 41 42 29 20 2a 2f 0a 0a  BPAGE_VTAB) */..
37390 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
373a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
373b0 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20  , "dump", n)==0 
373c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
373d0 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20  r *zLike = 0;.  
373e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
373f0 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
37400 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
37410 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53  ;.    int savedS
37420 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  hellFlags = p->s
37430 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68  hellFlgs;.    Sh
37440 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  ellClearFlag(p, 
37450 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
37460 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  wid|SHFLG_Newlin
37470 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a  es|SHFLG_Echo);.
37480 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
37490 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
374a0 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d   if( azArg[i][0]
374b0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
374c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
374d0 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20   azArg[i]+1;.   
374e0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
374f0 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
37500 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
37510 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22  preserve-rowids"
37520 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
37530 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
37540 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
37550 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
37560 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73  err, "The --pres
37570 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69  erve-rowids opti
37580 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  on is not compat
37590 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20  ible".          
375a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375b0 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45     " with SQLITE
375c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
375d0 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
375e0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
375f0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
37600 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73  mmand_exit;.#els
37610 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  e.          Shel
37620 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
37630 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
37640 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
37650 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
37660 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77  f( strcmp(z,"new
37670 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  lines")==0 ){.  
37680 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74          ShellSet
37690 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
376a0 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20  wlines);.       
376b0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
376c0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
376d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
376e0 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
376f0 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c  %s\" on \".dump\
37700 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "\n", azArg[i]);
37710 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37720 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
37730 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
37740 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
37750 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
37760 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Like ){.        
37770 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
37780 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70  r, "Usage: .dump
37790 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77   ?--preserve-row
377a0 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20  ids? ".         
377b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377c0 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20    "?--newlines? 
377d0 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
377e0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
377f0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
37800 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
37810 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
37820 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
37830 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
37840 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 70   }.    }..    op
37850 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a 20 20  en_db(p, 0);..  
37860 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
37870 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c  g back a "dump",
37880 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67   the content mig
37890 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20  ht appear in an 
378a0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69  order.    ** whi
378b0 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69  ch causes immedi
378c0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate fore