/ Hex Artifact Content
Login

Artifact e0f0758b6ab506d8ab12502fd2b8c55546bb9e4bb772374344a5a1b73f5bc2b9:


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 20 20 22 20 20 20 20 2d 2d 61 6c 6c 65 78 63 65    "    --allexce
1cb40 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 55  pt             U
1cb50 6e 72 65 67 69 73 74 65 72 20 65 76 65 72 79 74  nregister everyt
1cb60 68 69 6e 67 20 65 78 63 65 70 74 20 74 68 6f 73  hing except thos
1cb70 65 20 6e 61 6d 65 64 22 2c 0a 23 65 6e 64 69 66  e named",.#endif
1cb80 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55  .  ".vfsinfo ?AU
1cb90 58 3f 20 20 20 20 20 20 20 20 20 20 20 49 6e 66  X?           Inf
1cba0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1cbb0 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53  he top-level VFS
1cbc0 22 2c 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20  ",.  ".vfslist  
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1cbe0 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  ist all availabl
1cbf0 65 20 56 46 53 65 73 22 2c 0a 20 20 22 2e 76 66  e VFSes",.  ".vf
1cc00 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20  sname ?AUX?     
1cc10 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20        Print the 
1cc20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
1cc30 73 74 61 63 6b 22 2c 0a 20 20 22 2e 77 69 64 74  stack",.  ".widt
1cc40 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20  h NUM1 NUM2 ... 
1cc50 20 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77      Set column w
1cc60 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75  idths for \"colu
1cc70 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a 20 20 22 20  mn\" mode",.  " 
1cc80 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c      Negative val
1cc90 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66  ues right-justif
1cca0 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75  y",.};../*.** Ou
1ccb0 74 70 75 74 20 68 65 6c 70 20 74 65 78 74 2e 0a  tput help text..
1ccc0 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20 64  **.** zPattern d
1ccd0 65 73 63 72 69 62 65 73 20 74 68 65 20 73 65 74  escribes the set
1cce0 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72   of commands for
1ccf0 20 77 68 69 63 68 20 68 65 6c 70 20 74 65 78 74   which help text
1cd00 20 69 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a   is provided..**
1cd10 20 49 66 20 7a 50 61 74 74 65 72 6e 20 69 73 20   If zPattern is 
1cd20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73 68 6f 77 20  NULL, then show 
1cd30 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75  all commands, bu
1cd40 74 20 6f 6e 6c 79 20 67 69 76 65 20 61 20 6f 6e  t only give a on
1cd50 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65 73 63 72 69  e-line.** descri
1cd60 70 74 69 6f 6e 20 6f 66 20 65 61 63 68 2e 0a 2a  ption of each..*
1cd70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cd80 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65  number of matche
1cd90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1cda0 20 73 68 6f 77 48 65 6c 70 28 46 49 4c 45 20 2a   showHelp(FILE *
1cdb0 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
1cdc0 2a 7a 50 61 74 74 65 72 6e 29 7b 0a 20 20 69 6e  *zPattern){.  in
1cdd0 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  t i = 0;.  int j
1cde0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   = 0;.  int n = 
1cdf0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 3b  0;.  char *zPat;
1ce00 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d  .  if( zPattern=
1ce10 3d 30 0a 20 20 20 7c 7c 20 7a 50 61 74 74 65 72  =0.   || zPatter
1ce20 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c 20  n[0]=='0'.   || 
1ce30 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c  strcmp(zPattern,
1ce40 22 2d 61 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73  "-a")==0.   || s
1ce50 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22  trcmp(zPattern,"
1ce60 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a 20  -all")==0.  ){. 
1ce70 20 20 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20 63     /* Show all c
1ce80 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c  ommands, but onl
1ce90 79 20 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20 63  y one line per c
1cea0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66  ommand */.    if
1ceb0 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 20  ( zPattern==0 ) 
1cec0 7a 50 61 74 74 65 72 6e 20 3d 20 22 22 3b 0a 20  zPattern = "";. 
1ced0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1cee0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1cef0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1cf00 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27   azHelp[i][0]=='
1cf10 2e 27 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30  .' || zPattern[0
1cf20 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ] ){.        utf
1cf30 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1cf40 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29  s\n", azHelp[i])
1cf50 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
1cf60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cf70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f  else{.    /* Loo
1cf80 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74  k for commands t
1cf90 68 61 74 20 66 6f 72 20 77 68 69 63 68 20 7a 50  hat for which zP
1cfa0 61 74 74 65 72 6e 20 69 73 20 61 6e 20 65 78 61  attern is an exa
1cfb0 63 74 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 20  ct prefix */.   
1cfc0 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f   zPat = sqlite3_
1cfd0 6d 70 72 69 6e 74 66 28 22 2e 25 73 2a 22 2c 20  mprintf(".%s*", 
1cfe0 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66  zPattern);.    f
1cff0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
1d000 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b  ize(azHelp); i++
1d010 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
1d020 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 50 61  ite3_strglob(zPa
1d030 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30  t, azHelp[i])==0
1d040 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1d050 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1d060 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b  \n", azHelp[i]);
1d070 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31  .        j = i+1
1d080 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
1d090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d0a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1d0b0 61 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 29  at);.    if( n )
1d0c0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 31  {.      if( n==1
1d0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77   ){.        /* w
1d0e0 68 65 6e 20 7a 50 61 74 74 65 72 6e 20 69 73 20  hen zPattern is 
1d0f0 61 20 70 72 65 66 69 78 20 6f 66 20 65 78 61 63  a prefix of exac
1d100 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c  tly one command,
1d110 20 74 68 65 6e 20 69 6e 63 6c 75 64 65 20 74 68   then include th
1d120 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74  e.        ** det
1d130 61 69 6c 73 20 6f 66 20 74 68 61 74 20 63 6f 6d  ails of that com
1d140 6d 61 6e 64 2c 20 77 68 69 63 68 20 73 68 6f 75  mand, which shou
1d150 6c 64 20 62 65 67 69 6e 20 61 74 20 6f 66 66 73  ld begin at offs
1d160 65 74 20 6a 20 2a 2f 0a 20 20 20 20 20 20 20 20  et j */.        
1d170 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69  while( j<ArraySi
1d180 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20  ze(azHelp)-1 && 
1d190 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e  azHelp[j][0]!='.
1d1a0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ' ){.          u
1d1b0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1d1c0 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a  "%s\n", azHelp[j
1d1d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b  ]);.          j+
1d1e0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1d1f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1d200 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  n n;.    }.    /
1d210 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61  * Look for comma
1d220 6e 64 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  nds that contain
1d230 20 7a 50 61 74 74 65 72 6e 20 61 6e 79 77 68 65   zPattern anywhe
1d240 72 65 2e 20 20 53 68 6f 77 20 74 68 65 20 63 6f  re.  Show the co
1d250 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 74 65  mplete.    ** te
1d260 78 74 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e  xt of all comman
1d270 64 73 20 74 68 61 74 20 6d 61 74 63 68 2e 20 2a  ds that match. *
1d280 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c  /.    zPat = sql
1d290 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 25  ite3_mprintf("%%
1d2a0 25 73 25 25 22 2c 20 7a 50 61 74 74 65 72 6e 29  %s%%", zPattern)
1d2b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1d2c0 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c  <ArraySize(azHel
1d2d0 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
1d2e0 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d  if( azHelp[i][0]
1d2f0 3d 3d 27 2e 27 20 29 20 6a 20 3d 20 69 3b 0a 20  =='.' ) j = i;. 
1d300 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1d310 5f 73 74 72 6c 69 6b 65 28 7a 50 61 74 2c 20 61  _strlike(zPat, a
1d320 7a 48 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30 20  zHelp[i], 0)==0 
1d330 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1d340 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
1d350 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a  n", azHelp[j]);.
1d360 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
1d370 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c  <ArraySize(azHel
1d380 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a  p)-1 && azHelp[j
1d390 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20  +1][0]!='.' ){. 
1d3a0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
1d3b0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1d3c0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1d3d0 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20   azHelp[j]);.   
1d3e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1d3f0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6e 2b   = j;.        n+
1d400 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1d410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1d420 65 28 7a 50 61 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zPat);.  }.  r
1d430 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46  eturn n;.}../* F
1d440 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1d450 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
1d460 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65  rocess_input(She
1d470 6c 6c 53 74 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a  llState *p);../*
1d480 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1d490 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61  tent of file zNa
1d4a0 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  me into memory o
1d4b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1d4c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a  ite3_malloc64().
1d4d0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ** and return a 
1d4e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
1d4f0 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65  uffer. The calle
1d500 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1d510 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20   for freeing.** 
1d520 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  the memory..**.*
1d530 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 70  * If parameter p
1d540 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c  nByte is not NUL
1d550 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20  L, (*pnByte) is 
1d560 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1d570 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65  r of bytes.** re
1d580 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f  ad..**.** For co
1d590 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c  nvenience, a nul
1d5a0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
1d5b0 20 69 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e   is always appen
1d5c0 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
1d5d0 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  read.** from the
1d5e0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
1d5f0 20 62 75 66 66 65 72 20 69 73 20 72 65 74 75 72   buffer is retur
1d600 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65 20 69  ned. This byte i
1d610 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69  s not included i
1d620 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76  n.** the final v
1d630 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65  alue of (*pnByte
1d640 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65  ), if applicable
1d650 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20  ..**.** NULL is 
1d660 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20  returned if any 
1d670 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1d680 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20  ered. The final 
1d690 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65  value of *pnByte
1d6a0 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64  .** is undefined
1d6b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1d6c0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
1d6d0 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  eadFile(const ch
1d6e0 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a  ar *zName, int *
1d6f0 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20  pnByte){.  FILE 
1d700 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d  *in = fopen(zNam
1d710 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67  e, "rb");.  long
1d720 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e   nIn;.  size_t n
1d730 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42  Read;.  char *pB
1d740 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  uf;.  if( in==0 
1d750 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73  ) return 0;.  fs
1d760 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f  eek(in, 0, SEEK_
1d770 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74  END);.  nIn = ft
1d780 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e  ell(in);.  rewin
1d790 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20  d(in);.  pBuf = 
1d7a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1d7b0 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28  ( nIn+1 );.  if(
1d7c0 20 70 42 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f   pBuf==0 ){ fclo
1d7d0 73 65 28 69 6e 29 3b 20 72 65 74 75 72 6e 20 30  se(in); return 0
1d7e0 3b 20 7d 0a 20 20 6e 52 65 61 64 20 3d 20 66 72  ; }.  nRead = fr
1d7f0 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31  ead(pBuf, nIn, 1
1d800 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  , in);.  fclose(
1d810 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  in);.  if( nRead
1d820 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
1d830 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20  e3_free(pBuf);. 
1d840 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d850 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30  .  pBuf[nIn] = 0
1d860 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20 29  ;.  if( pnByte )
1d870 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a   *pnByte = nIn;.
1d880 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
1d890 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1d8a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1d8b0 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ION)./*.** Close
1d8c0 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65   a single OpenSe
1d8d0 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64  ssion object and
1d8e0 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   release all of 
1d8f0 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  its associated.*
1d900 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  * resources..*/.
1d910 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73  static void sess
1d920 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65  ion_close(OpenSe
1d930 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29  ssion *pSession)
1d940 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
1d950 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65  ite3session_dele
1d960 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b  te(pSession->p);
1d970 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1d980 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29  pSession->zName)
1d990 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1d9a0 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
1d9b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1d9c0 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
1d9d0 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b  n->azFilter[i]);
1d9e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1d9f0 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
1da00 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65  Filter);.  memse
1da10 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73  t(pSession, 0, s
1da20 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f  izeof(OpenSessio
1da30 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n));.}.#endif../
1da40 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f  *.** Close all O
1da50 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63  penSession objec
1da60 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ts and release a
1da70 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72 65  ll associated re
1da80 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20  sources..*/.#if 
1da90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1daa0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
1dab0 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
1dac0 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65  on_close_all(She
1dad0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
1dae0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1daf0 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20   i<p->nSession; 
1db00 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f  i++){.    sessio
1db10 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73  n_close(&p->aSes
1db20 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  sion[i]);.  }.  
1db30 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b  p->nSession = 0;
1db40 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1db50 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f  e session_close_
1db60 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  all(X).#endif../
1db70 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1db80 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74  ion of the xFilt
1db90 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
1dba0 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e  an open session.
1dbb0 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61    Omit.** any ta
1dbc0 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e  bles named by ".
1dbd0 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20  session filter" 
1dbe0 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65  but let all othe
1dbf0 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e  r table through.
1dc00 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1dc10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1dc20 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e  SSION).static in
1dc30 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72  t session_filter
1dc40 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e  (void *pCtx, con
1dc50 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
1dc60 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70    OpenSession *p
1dc70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53  Session = (OpenS
1dc80 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20  ession*)pCtx;.  
1dc90 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1dca0 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46  ; i<pSession->nF
1dcb0 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ilter; i++){.   
1dcc0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1dcd0 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61  glob(pSession->a
1dce0 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62  zFilter[i], zTab
1dcf0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1dd00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1dd10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1dd20 20 54 72 79 20 74 6f 20 64 65 64 75 63 65 20 74   Try to deduce t
1dd30 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20  he type of file 
1dd40 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20  for zName based 
1dd50 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20  on its content. 
1dd60 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f   Return.** one o
1dd70 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  f the SHELL_OPEN
1dd80 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a  _* constants..**
1dd90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1dda0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
1ddb0 72 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 69  r is empty but i
1ddc0 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69  ts name looks li
1ddd0 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68  ke a ZIP.** arch
1dde0 69 76 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74  ive and the dflt
1ddf0 5a 69 70 20 66 6c 61 67 20 69 73 20 74 72 75 65  Zip flag is true
1de00 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74  , then assume it
1de10 20 69 73 20 61 20 5a 49 50 20 61 72 63 68 69 76   is a ZIP archiv
1de20 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
1de30 20 61 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e   assume an ordin
1de40 61 72 79 20 64 61 74 61 62 61 73 65 20 72 65 67  ary database reg
1de50 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66  ardless of the f
1de60 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68  ilename if.** th
1de70 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65  e type cannot be
1de80 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d   determined from
1de90 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
1dea0 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54   deduceDatabaseT
1deb0 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
1dec0 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a  zName, int dfltZ
1ded0 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  ip){.  FILE *f =
1dee0 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72   fopen(zName, "r
1def0 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b  b");.  size_t n;
1df00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c  .  int rc = SHEL
1df10 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20  L_OPEN_UNSPEC;. 
1df20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1df30 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20  .  if( f==0 ){. 
1df40 20 20 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26     if( dfltZip &
1df50 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
1df60 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c  e("%.zip",zName,
1df70 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
1df80 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45  return SHELL_OPE
1df90 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
1dfa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 72 65 74  else{.       ret
1dfb0 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  urn SHELL_OPEN_N
1dfc0 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  ORMAL;.    }.  }
1dfd0 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75  .  n = fread(zBu
1dfe0 66 2c 20 31 36 2c 20 31 2c 20 66 29 3b 0a 20 20  f, 16, 1, f);.  
1dff0 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63  if( n==1 && memc
1e000 6d 70 28 7a 42 75 66 2c 20 22 53 51 4c 69 74 65  mp(zBuf, "SQLite
1e010 20 66 6f 72 6d 61 74 20 33 22 2c 20 31 36 29 3d   format 3", 16)=
1e020 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65  =0 ){.    fclose
1e030 28 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (f);.    return 
1e040 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1e050 4c 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66  L;.  }.  fseek(f
1e060 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29  , -25, SEEK_END)
1e070 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42  ;.  n = fread(zB
1e080 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20  uf, 25, 1, f);. 
1e090 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d   if( n==1 && mem
1e0a0 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61 72 74  cmp(zBuf, "Start
1e0b0 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31  -Of-SQLite3-", 1
1e0c0 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  7)==0 ){.    rc 
1e0d0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  = SHELL_OPEN_APP
1e0e0 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b  ENDVFS;.  }else{
1e0f0 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20 2d 32  .    fseek(f, -2
1e100 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  2, SEEK_END);.  
1e110 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
1e120 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20  , 22, 1, f);.   
1e130 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75   if( n==1 && zBu
1e140 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42  f[0]==0x50 && zB
1e150 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a  uf[1]==0x4b && z
1e160 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20  Buf[2]==0x05.   
1e170 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d      && zBuf[3]==
1e180 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20 72 63  0x06 ){.      rc
1e190 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49   = SHELL_OPEN_ZI
1e1a0 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65  PFILE;.    }else
1e1b0 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c   if( n==0 && dfl
1e1c0 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f  tZip && sqlite3_
1e1d0 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c  strlike("%.zip",
1e1e0 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  zName,0)==0 ){. 
1e1f0 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f       rc = SHELL_
1e200 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20  OPEN_ZIPFILE;.  
1e210 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65    }.  }.  fclose
1e220 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (f);.  return rc
1e230 3b 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;  .}..#ifdef SQ
1e240 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
1e250 52 49 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65  RIALIZE./*.** Re
1e260 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 69 6e 2d  construct an in-
1e270 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1e280 75 73 69 6e 67 20 74 68 65 20 6f 75 74 70 75 74  using the output
1e290 20 66 72 6f 6d 20 74 68 65 20 22 64 62 74 6f 74   from the "dbtot
1e2a0 78 74 22 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20  xt".** program. 
1e2b0 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 66 72   Read content fr
1e2c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70  om the file in p
1e2d0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2e 20 20  ->zDbFilename.  
1e2e0 49 66 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  If p->zDbFilenam
1e2f0 65 0a 2a 2a 20 69 73 20 30 2c 20 74 68 65 6e 20  e.** is 0, then 
1e300 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e 64 61  read from standa
1e310 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61  rd input..*/.sta
1e320 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
1e330 72 20 2a 72 65 61 64 48 65 78 44 62 28 53 68 65  r *readHexDb(She
1e340 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1e350 2a 70 6e 44 61 74 61 29 7b 0a 20 20 75 6e 73 69  *pnData){.  unsi
1e360 67 6e 65 64 20 63 68 61 72 20 2a 61 20 3d 20 30  gned char *a = 0
1e370 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
1e380 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   int n = 0;.  in
1e390 74 20 70 67 73 7a 20 3d 20 30 3b 0a 20 20 69 6e  t pgsz = 0;.  in
1e3a0 74 20 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  t iOffset = 0;. 
1e3b0 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74   int j, k;.  int
1e3c0 20 72 63 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b   rc;.  FILE *in;
1e3d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
1e3e0 78 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 4c  x[16];.  char zL
1e3f0 69 6e 65 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  ine[1000];.  if(
1e400 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
1e410 29 7b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65  ){.    in = fope
1e420 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
1e430 2c 20 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20  , "r");.    if( 
1e440 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  in==0 ){.      u
1e450 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e460 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "cannot open 
1e470 5c 22 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69  \"%s\" for readi
1e480 6e 67 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c  ng\n", p->zDbFil
1e490 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  ename);.      re
1e4a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1e4b0 20 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d    nLine = 0;.  }
1e4c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 20 3d 20 70  else{.    in = p
1e4d0 2d 3e 69 6e 3b 0a 20 20 20 20 6e 4c 69 6e 65 20  ->in;.    nLine 
1e4e0 3d 20 70 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  = p->lineno;.   
1e4f0 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 69 6e 20   if( in==0 ) in 
1e500 3d 20 73 74 64 69 6e 3b 0a 20 20 7d 0a 20 20 2a  = stdin;.  }.  *
1e510 70 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 6e 4c  pnData = 0;.  nL
1e520 69 6e 65 2b 2b 3b 0a 20 20 69 66 28 20 66 67 65  ine++;.  if( fge
1e530 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66  ts(zLine, sizeof
1e540 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 3d 3d 30 20  (zLine), in)==0 
1e550 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62  ) goto readHexDb
1e560 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20 73  _error;.  rc = s
1e570 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20  scanf(zLine, "| 
1e580 73 69 7a 65 20 25 64 20 70 61 67 65 73 69 7a 65  size %d pagesize
1e590 20 25 64 22 2c 20 26 6e 2c 20 26 70 67 73 7a 29   %d", &n, &pgsz)
1e5a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 32 20 29 20  ;.  if( rc!=2 ) 
1e5b0 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65  goto readHexDb_e
1e5c0 72 72 6f 72 3b 0a 20 20 69 66 28 20 6e 3c 30 20  rror;.  if( n<0 
1e5d0 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62  ) goto readHexDb
1e5e0 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 67  _error;.  if( pg
1e5f0 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a 3e 36  sz<512 || pgsz>6
1e600 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 26 28 70  5536 || (pgsz&(p
1e610 67 73 7a 2d 31 29 29 21 3d 30 20 29 20 67 6f 74  gsz-1))!=0 ) got
1e620 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e630 72 3b 0a 20 20 6e 20 3d 20 28 6e 2b 70 67 73 7a  r;.  n = (n+pgsz
1e640 2d 31 29 26 7e 28 70 67 73 7a 2d 31 29 3b 20 20  -1)&~(pgsz-1);  
1e650 2f 2a 20 52 6f 75 6e 64 20 6e 20 75 70 20 74 6f  /* Round n up to
1e660 20 74 68 65 20 6e 65 78 74 20 6d 75 6c 74 69 70   the next multip
1e670 6c 65 20 6f 66 20 70 67 73 7a 20 2a 2f 0a 20 20  le of pgsz */.  
1e680 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  a = sqlite3_mall
1e690 6f 63 28 20 6e 20 3f 20 6e 20 3a 20 31 20 29 3b  oc( n ? n : 1 );
1e6a0 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
1e6b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e6c0 74 64 65 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d  tderr, "Out of m
1e6d0 65 6d 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20  emory!\n");.    
1e6e0 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65  goto readHexDb_e
1e6f0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  rror;.  }.  mems
1e700 65 74 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69  et(a, 0, n);.  i
1e710 66 28 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70  f( pgsz<512 || p
1e720 67 73 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67  gsz>65536 || (pg
1e730 73 7a 20 26 20 28 70 67 73 7a 2d 31 29 29 21 3d  sz & (pgsz-1))!=
1e740 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
1e750 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 69 6e  intf(stderr, "in
1e760 76 61 6c 69 64 20 70 61 67 65 73 69 7a 65 5c 6e  valid pagesize\n
1e770 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61  ");.    goto rea
1e780 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20  dHexDb_error;.  
1e790 7d 0a 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b  }.  for(nLine++;
1e7a0 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69   fgets(zLine, si
1e7b0 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29  zeof(zLine), in)
1e7c0 21 3d 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20  !=0; nLine++){. 
1e7d0 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a     rc = sscanf(z
1e7e0 4c 69 6e 65 2c 20 22 7c 20 70 61 67 65 20 25 64  Line, "| page %d
1e7f0 20 6f 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c   offset %d", &j,
1e800 20 26 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63   &k);.    if( rc
1e810 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  ==2 ){.      iOf
1e820 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20  fset = k;.      
1e830 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1e840 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
1e850 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c  zLine, "| end ",
1e860 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   6)==0 ){.      
1e870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e880 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69   rc = sscanf(zLi
1e890 6e 65 2c 22 7c 20 25 64 3a 20 25 78 20 25 78 20  ne,"| %d: %x %x 
1e8a0 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e8b0 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e8c0 20 25 78 20 25 78 20 25 78 22 2c 0a 20 20 20 20   %x %x %x",.    
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20              &j, 
1e8e0 26 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78  &x[0], &x[1], &x
1e8f0 5b 32 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34  [2], &x[3], &x[4
1e900 5d 2c 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c  ], &x[5], &x[6],
1e910 20 26 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20   &x[7],.        
1e920 20 20 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26          &x[8], &
1e930 78 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78  x[9], &x[10], &x
1e940 5b 31 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78  [11], &x[12], &x
1e950 5b 31 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78  [13], &x[14], &x
1e960 5b 31 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  [15]);.    if( r
1e970 63 3d 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b  c==17 ){.      k
1e980 20 3d 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20   = iOffset+j;.  
1e990 20 20 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20      if( k+16<=n 
1e9a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1e9b0 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
1e9c0 69 3d 30 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b  i=0; ii<16; ii++
1e9d0 29 20 61 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69  ) a[k+ii] = x[ii
1e9e0 5d 26 30 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a  ]&0xff;.      }.
1e9f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44      }.  }.  *pnD
1ea00 61 74 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69  ata = n;.  if( i
1ea10 6e 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20  n!=p->in ){.    
1ea20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65  fclose(in);.  }e
1ea30 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65  lse{.    p->line
1ea40 6e 6f 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a  no = nLine;.  }.
1ea50 20 20 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61    return a;..rea
1ea60 64 48 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20  dHexDb_error:.  
1ea70 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29 7b  if( in!=p->in ){
1ea80 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
1ea90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
1eaa0 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
1eab0 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  , sizeof(zLine),
1eac0 20 70 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20   p->in)!=0 ){.  
1ead0 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20      nLine++;.   
1eae0 20 20 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c     if(strncmp(zL
1eaf0 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36  ine, "| end ", 6
1eb00 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1eb10 20 20 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e    }.    p->linen
1eb20 6f 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20  o = nLine;.  }. 
1eb30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
1eb40 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1eb50 73 74 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e  stderr,"Error on
1eb60 20 6c 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65   line %d of --he
1eb70 78 64 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c  xdb input\n", nL
1eb80 69 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ine);.  return 0
1eb90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1eba0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
1ebb0 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a  RIALIZE */../*.*
1ebc0 2a 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  * Scalar functio
1ebd0 6e 20 22 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2e  n "shell_int32".
1ebe0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1ebf0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
1ec00 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
1ec10 61 20 62 6c 6f 62 2e 20 54 68 65 20 73 65 63 6f  a blob. The seco
1ec20 6e 64 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  nd a non-negativ
1ec30 65 20 69 6e 74 65 67 65 72 2e 20 54 68 69 73 20  e integer. This 
1ec40 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 61 64  function.** read
1ec50 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
1ec60 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61  32-bit big-endia
1ec70 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 62  n integer from b
1ec80 79 74 65 0a 2a 2a 20 6f 66 66 73 65 74 20 28 34  yte.** offset (4
1ec90 2a 3c 61 72 67 32 3e 29 20 6f 66 20 74 68 65 20  *<arg2>) of the 
1eca0 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
1ecb0 76 6f 69 64 20 73 68 65 6c 6c 49 6e 74 33 32 28  void shellInt32(
1ecc0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1ecd0 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
1ece0 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c  int argc, .  sql
1ecf0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1ed00 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  v.){.  const uns
1ed10 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f  igned char *pBlo
1ed20 62 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a  b;.  int nBlob;.
1ed30 20 20 69 6e 74 20 69 49 6e 74 3b 0a 0a 20 20 55    int iInt;..  U
1ed40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ed50 61 72 67 63 29 3b 0a 20 20 6e 42 6c 6f 62 20 3d  argc);.  nBlob =
1ed60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1ed70 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
1ed80 20 70 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20   pBlob = (const 
1ed90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 73  unsigned char*)s
1eda0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1edb0 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 49  b(argv[0]);.  iI
1edc0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  nt = sqlite3_val
1edd0 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
1ede0 0a 0a 20 20 69 66 28 20 69 49 6e 74 3e 3d 30 20  ..  if( iInt>=0 
1edf0 26 26 20 28 69 49 6e 74 2b 31 29 2a 34 3c 3d 6e  && (iInt+1)*4<=n
1ee00 42 6c 6f 62 20 29 7b 0a 20 20 20 20 63 6f 6e 73  Blob ){.    cons
1ee10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ee20 2a 61 20 3d 20 26 70 42 6c 6f 62 5b 69 49 6e 74  *a = &pBlob[iInt
1ee30 2a 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *4];.    sqlite3
1ee40 5f 69 6e 74 36 34 20 69 56 61 6c 20 3d 20 28 28  _int64 iVal = ((
1ee50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b  sqlite3_int64)a[
1ee60 30 5d 3c 3c 32 34 29 0a 20 20 20 20 20 20 20 20  0]<<24).        
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1ee80 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
1ee90 29 61 5b 31 5d 3c 3c 31 36 29 0a 20 20 20 20 20  )a[1]<<16).     
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e    + ((sqlite3_in
1eec0 74 36 34 29 61 5b 32 5d 3c 3c 20 38 29 0a 20 20  t64)a[2]<< 8).  
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33       + ((sqlite3
1eef0 5f 69 6e 74 36 34 29 61 5b 33 5d 3c 3c 20 30 29  _int64)a[3]<< 0)
1ef00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
1ef10 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
1ef20 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 7d  xt, iVal);.  }.}
1ef30 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66  ../*.** Scalar f
1ef40 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 69  unction "shell_i
1ef50 64 71 75 6f 74 65 28 58 29 22 20 72 65 74 75 72  dquote(X)" retur
1ef60 6e 73 20 73 74 72 69 6e 67 20 58 20 71 75 6f 74  ns string X quot
1ef70 65 64 20 61 73 20 61 6e 20 69 64 65 6e 74 69 66  ed as an identif
1ef80 69 65 72 2c 0a 2a 2a 20 75 73 69 6e 67 20 22 2e  ier,.** using ".
1ef90 2e 2e 22 20 77 69 74 68 20 69 6e 74 65 72 6e 61  .." with interna
1efa0 6c 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 20 63  l double-quote c
1efb0 68 61 72 61 63 74 65 72 73 20 64 6f 75 62 6c 65  haracters double
1efc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1efd0 64 20 73 68 65 6c 6c 49 64 51 75 6f 74 65 28 0a  d shellIdQuote(.
1efe0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1eff0 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
1f000 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69  nt argc, .  sqli
1f010 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1f020 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1f030 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
1f040 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
1f050 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1f060 5d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ]);.  UNUSED_PAR
1f070 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
1f080 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
1f090 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1f0a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
1f0b0 5c 22 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  \"", zName);.   
1f0c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f0d0 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c  text(context, z,
1f0e0 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
1f0f0 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
1f100 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   Scalar function
1f110 20 22 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63   "shell_escape_c
1f120 72 6e 6c 22 20 75 73 65 64 20 62 79 20 74 68 65  rnl" used by the
1f130 20 2e 72 65 63 6f 76 65 72 20 63 6f 6d 6d 61 6e   .recover comman
1f140 64 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  d..** The argume
1f150 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1f160 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
1f170 65 20 6f 75 74 70 75 74 20 6f 66 20 62 75 69 6c  e output of buil
1f180 74 2d 69 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  t-in.** function
1f190 20 71 75 6f 74 65 28 29 2e 20 49 66 20 74 68 65   quote(). If the
1f1a0 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
1f1b0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   of the input is
1f1c0 20 22 27 22 2c 20 0a 2a 2a 20 69 6e 64 69 63 61   "'", .** indica
1f1d0 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 76 61  ting that the va
1f1e0 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 71 75  lue passed to qu
1f1f0 6f 74 65 28 29 20 77 61 73 20 61 20 74 65 78 74  ote() was a text
1f200 20 76 61 6c 75 65 2c 0a 2a 2a 20 74 68 65 6e 20   value,.** then 
1f210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
1f220 61 72 63 68 65 73 20 74 68 65 20 69 6e 70 75 74  arches the input
1f230 20 66 6f 72 20 22 5c 6e 22 20 61 6e 64 20 22 5c   for "\n" and "\
1f240 72 22 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  r" characters.**
1f250 20 61 6e 64 20 61 64 64 73 20 61 20 77 72 61 70   and adds a wrap
1f260 70 65 72 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  per similar to t
1f270 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1f280 0a 2a 2a 20 20 20 72 65 70 6c 61 63 65 28 72 65  .**   replace(re
1f290 70 6c 61 63 65 28 3c 69 6e 70 75 74 3e 2c 20 27  place(<input>, '
1f2a0 5c 6e 27 2c 20 63 68 61 72 28 31 30 29 2c 20 27  \n', char(10), '
1f2b0 5c 72 27 2c 20 63 68 61 72 28 31 33 29 29 3b 0a  \r', char(13));.
1f2c0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
1f2d0 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
1f2e0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   of the input is
1f2f0 20 6e 6f 74 20 22 27 22 2c 20 74 68 65 6e 20 61   not "'", then a
1f300 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20   copy.** of the 
1f310 69 6e 70 75 74 20 69 73 20 72 65 74 75 72 6e 65  input is returne
1f320 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1f330 64 20 73 68 65 6c 6c 45 73 63 61 70 65 43 72 6e  d shellEscapeCrn
1f340 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  l(.  sqlite3_con
1f350 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
1f360 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73    int argc, .  s
1f370 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1f380 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
1f390 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
1f3a0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1f3b0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1f3c0 76 5b 30 5d 29 3b 0a 20 20 55 4e 55 53 45 44 5f  v[0]);.  UNUSED_
1f3d0 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
1f3e0 0a 20 20 69 66 28 20 7a 54 65 78 74 5b 30 5d 3d  .  if( zText[0]=
1f3f0 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 69 6e 74  ='\'' ){.    int
1f400 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   nText = sqlite3
1f410 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
1f420 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69  v[0]);.    int i
1f430 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31  ;.    char zBuf1
1f440 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a  [20];.    char z
1f450 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20 63 6f  Buf2[20];.    co
1f460 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20  nst char *zNL = 
1f470 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
1f480 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20  r *zCR = 0;.    
1f490 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
1f4a0 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 0a 20   int nNL = 0;.. 
1f4b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78     for(i=0; zTex
1f4c0 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t[i]; i++){.    
1f4d0 20 20 69 66 28 20 7a 4e 4c 3d 3d 30 20 26 26 20    if( zNL==0 && 
1f4e0 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29  zText[i]=='\n' )
1f4f0 7b 0a 20 20 20 20 20 20 20 20 7a 4e 4c 20 3d 20  {.        zNL = 
1f500 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 54  unused_string(zT
1f510 65 78 74 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30  ext, "\\n", "\\0
1f520 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20  12", zBuf1);.   
1f530 20 20 20 20 20 6e 4e 4c 20 3d 20 28 69 6e 74 29       nNL = (int)
1f540 73 74 72 6c 65 6e 28 7a 4e 4c 29 3b 0a 20 20 20  strlen(zNL);.   
1f550 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
1f560 43 52 3d 3d 30 20 26 26 20 7a 54 65 78 74 5b 69  CR==0 && zText[i
1f570 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20  ]=='\r' ){.     
1f580 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f     zCR = unused_
1f590 73 74 72 69 6e 67 28 7a 54 65 78 74 2c 20 22 5c  string(zText, "\
1f5a0 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42  \r", "\\015", zB
1f5b0 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  uf2);.        nC
1f5c0 52 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  R = (int)strlen(
1f5d0 7a 43 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zCR);.      }.  
1f5e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 4e 4c    }..    if( zNL
1f5f0 20 7c 7c 20 7a 43 52 20 29 7b 0a 20 20 20 20 20   || zCR ){.     
1f600 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20   int iOut = 0;. 
1f610 20 20 20 20 20 69 36 34 20 6e 4d 61 78 20 3d 20       i64 nMax = 
1f620 28 6e 4e 4c 20 3e 20 6e 43 52 29 20 3f 20 6e 4e  (nNL > nCR) ? nN
1f630 4c 20 3a 20 6e 43 52 3b 0a 20 20 20 20 20 20 69  L : nCR;.      i
1f640 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 61 78  64 nAlloc = nMax
1f650 20 2a 20 6e 54 65 78 74 20 2b 20 28 6e 4d 61 78   * nText + (nMax
1f660 2b 36 34 29 2a 32 3b 0a 20 20 20 20 20 20 63 68  +64)*2;.      ch
1f670 61 72 20 2a 7a 4f 75 74 20 3d 20 28 63 68 61 72  ar *zOut = (char
1f680 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
1f690 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  64(nAlloc);.    
1f6a0 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
1f6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f6c0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
1f6d0 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
1f6e0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1f6f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1f700 20 7a 4e 4c 20 26 26 20 7a 43 52 20 29 7b 0a 20   zNL && zCR ){. 
1f710 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
1f720 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72 65 70 6c  Out[iOut], "repl
1f730 61 63 65 28 72 65 70 6c 61 63 65 28 22 2c 20 31  ace(replace(", 1
1f740 36 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 75 74  6);.        iOut
1f750 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 7d 65   += 16;.      }e
1f760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1f770 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f780 20 22 72 65 70 6c 61 63 65 28 22 2c 20 38 29 3b   "replace(", 8);
1f790 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d  .        iOut +=
1f7a0 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   8;.      }.    
1f7b0 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74    for(i=0; zText
1f7c0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
1f7d0 20 20 20 69 66 28 20 7a 54 65 78 74 5b 69 5d 3d     if( zText[i]=
1f7e0 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
1f7f0 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
1f800 69 4f 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29  iOut], zNL, nNL)
1f810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75 74  ;.          iOut
1f820 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20 20 20   += nNL;.       
1f830 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 65 78 74   }else if( zText
1f840 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  [i]=='\r' ){.   
1f850 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
1f860 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20  Out[iOut], zCR, 
1f870 6e 43 52 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nCR);.          
1f880 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a 20 20 20  iOut += nCR;.   
1f890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f8a0 20 20 20 20 20 20 7a 4f 75 74 5b 69 4f 75 74 5d        zOut[iOut]
1f8b0 20 3d 20 7a 54 65 78 74 5b 69 5d 3b 0a 20 20 20   = zText[i];.   
1f8c0 20 20 20 20 20 20 20 69 4f 75 74 2b 2b 3b 0a 20         iOut++;. 
1f8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f8e0 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 4c 20  ..      if( zNL 
1f8f0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1f900 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22  y(&zOut[iOut], "
1f910 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d  ,'", 2); iOut +=
1f920 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   2;.        memc
1f930 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20  py(&zOut[iOut], 
1f940 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20 69 4f 75 74 20  zNL, nNL); iOut 
1f950 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20  += nNL;.        
1f960 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f970 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31 30 29  t], "', char(10)
1f980 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d  )", 12); iOut +=
1f990 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   12;.      }.   
1f9a0 20 20 20 69 66 28 20 7a 43 52 20 29 7b 0a 20 20     if( zCR ){.  
1f9b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f        memcpy(&zO
1f9c0 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22 2c 20  ut[iOut], ",'", 
1f9d0 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b 0a 20  2); iOut += 2;. 
1f9e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
1f9f0 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20  Out[iOut], zCR, 
1fa00 6e 43 52 29 3b 20 69 4f 75 74 20 2b 3d 20 6e 43  nCR); iOut += nC
1fa10 52 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  R;.        memcp
1fa20 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22  y(&zOut[iOut], "
1fa30 27 2c 20 63 68 61 72 28 31 33 29 29 22 2c 20 31  ', char(13))", 1
1fa40 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32 3b 0a  2); iOut += 12;.
1fa50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
1fa60 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
1fa70 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 4f 75 74  xt(context, zOut
1fa80 2c 20 69 4f 75 74 2c 20 53 51 4c 49 54 45 5f 54  , iOut, SQLITE_T
1fa90 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
1faa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
1fab0 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
1fac0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
1fad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
1fae0 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
1faf0 67 76 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20 46 6c  gv[0]);.}../* Fl
1fb00 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28  ags for open_db(
1fb10 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  )..**.** The def
1fb20 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66  ault behavior of
1fb30 20 6f 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f   open_db() is to
1fb40 20 65 78 69 74 28 31 29 20 69 66 20 74 68 65 20   exit(1) if the 
1fb50 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74  database fails t
1fb60 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20  o.** open.  The 
1fb70 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1fb80 45 20 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74  E flag changes t
1fb90 68 61 74 20 73 6f 20 74 68 61 74 20 69 74 20 70  hat so that it p
1fba0 72 69 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a  rints an error.*
1fbb0 2a 20 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75  * but still retu
1fbc0 72 6e 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  rns without call
1fbd0 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20  ing exit..**.** 
1fbe0 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46  The OPEN_DB_ZIPF
1fbf0 49 4c 45 20 66 6c 61 67 20 63 61 75 73 65 73 20  ILE flag causes 
1fc00 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65  open_db() to pre
1fc10 66 65 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  fer to open file
1fc20 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72  s as a.** ZIP ar
1fc30 63 68 69 76 65 20 69 66 20 74 68 65 20 66 69 6c  chive if the fil
1fc40 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1fc50 20 6f 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64   or is empty and
1fc60 20 69 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65   its name matche
1fc70 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70  s.** the *.zip p
1fc80 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69  attern..*/.#defi
1fc90 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41  ne OPEN_DB_KEEPA
1fca0 4c 49 56 45 20 20 20 30 78 30 30 31 20 20 20 2f  LIVE   0x001   /
1fcb0 2a 20 52 65 74 75 72 6e 20 61 66 74 65 72 20 65  * Return after e
1fcc0 72 72 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a  rror if true */.
1fcd0 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f  #define OPEN_DB_
1fce0 5a 49 50 46 49 4c 45 20 20 20 20 20 30 78 30 30  ZIPFILE     0x00
1fcf0 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a  2   /* Open as Z
1fd00 49 50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68  IP if name match
1fd10 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a  es *.zip */../*.
1fd20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1fd30 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1fd40 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  n.  If it is not
1fd50 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20  , then open it. 
1fd60 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   If.** the datab
1fd70 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65  ase fails to ope
1fd80 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f  n, print an erro
1fd90 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78  r message and ex
1fda0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
1fdb0 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c  id open_db(Shell
1fdc0 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70  State *p, int op
1fdd0 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20  enFlags){.  if( 
1fde0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
1fdf0 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d  if( p->openMode=
1fe00 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50  =SHELL_OPEN_UNSP
1fe10 45 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  EC ){.      if( 
1fe20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  p->zDbFilename==
1fe30 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  0 || p->zDbFilen
1fe40 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ame[0]==0 ){.   
1fe50 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
1fe60 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f   = SHELL_OPEN_NO
1fe70 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RMAL;.      }els
1fe80 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  e{.        p->op
1fe90 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64  enMode = (u8)ded
1fea0 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
1feb0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1fec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f                (o
1fee0 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f  penFlags & OPEN_
1fef0 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b  DB_ZIPFILE)!=0);
1ff00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ff10 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
1ff20 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  enMode ){.      
1ff30 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1ff40 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20  APPENDVFS: {.   
1ff50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1ff60 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  n_v2(p->zDbFilen
1ff70 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20  ame, &p->db, .  
1ff80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ff90 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1ffa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1ffb0 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20  E, "apndvfs");. 
1ffc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ffd0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1ffe0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44   SHELL_OPEN_HEXD
1fff0 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  B:.      case SH
20000 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41  ELL_OPEN_DESERIA
20010 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  LIZE: {.        
20020 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20  sqlite3_open(0, 
20030 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
20040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20050 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
20060 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b  _OPEN_ZIPFILE: {
20070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20080 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22  _open(":memory:"
20090 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
200a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
200b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
200c0 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
200d0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
200e0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a  te3_open_v2(p->z
200f0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
20100 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
20110 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  READONLY, 0);.  
20120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20130 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
20140 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
20150 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  C:.      case SH
20160 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a  ELL_OPEN_NORMAL:
20170 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
20180 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  e3_open(p->zDbFi
20190 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b  lename, &p->db);
201a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
201b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
201c0 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e    globalDb = p->
201d0 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  db;.    if( p->d
201e0 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  b==0 || SQLITE_O
201f0 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
20200 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
20210 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
20220 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e  tderr,"Error: un
20230 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
20240 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
20250 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
20260 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73  ->zDbFilename, s
20270 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
20280 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28  >db));.      if(
20290 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45   openFlags & OPE
202a0 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 29  N_DB_KEEPALIVE )
202b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
202c0 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a  3_open(":memory:
202d0 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ", &p->db);.    
202e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
202f0 20 20 7d 0a 20 20 20 20 20 20 65 78 69 74 28 31    }.      exit(1
20300 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
20310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
20320 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
20330 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
20340 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
20350 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
20360 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
20370 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
20380 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
20390 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
203a0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
203b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
203c0 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
203d0 20 30 2c 20 30 29 3b 0a 23 69 66 20 21 64 65 66   0, 0);.#if !def
203e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
203f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
20400 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
20410 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
20420 54 41 42 29 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB).    sqlite3
20430 5f 64 62 64 61 74 61 5f 69 6e 69 74 28 70 2d 3e  _dbdata_init(p->
20440 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  db, 0, 0);.#endi
20450 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
20460 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71  HAVE_ZLIB.    sq
20470 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e  lite3_zipfile_in
20480 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
20490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c  .    sqlite3_sql
204a0 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  ar_init(p->db, 0
204b0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
204c0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
204d0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
204e0 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d  "shell_add_schem
204f0 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54  a", 3, SQLITE_UT
20500 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d     shellAddSchem
20530 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20  aName, 0, 0);.  
20540 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20550 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20560 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73   "shell_module_s
20570 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54  chema", 1, SQLIT
20580 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205a0 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75         shellModu
205b0 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b  leSchema, 0, 0);
205c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
205d0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
205e0 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e  db, "shell_putsn
205f0 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
20600 46 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20  F8, p,.         
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63     shellPutsFunc
20630 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
20640 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
20650 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
20660 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 22 2c  ll_escape_crnl",
20670 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
20680 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 73 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 2c  shellEscapeCrnl,
206b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
206c0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
206d0 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
206e0 6c 5f 69 6e 74 33 32 22 2c 20 32 2c 20 53 51 4c  l_int32", 2, SQL
206f0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20710 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 49 6e           shellIn
20720 74 33 32 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  t32, 0, 0);.    
20730 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
20740 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
20750 73 68 65 6c 6c 5f 69 64 71 75 6f 74 65 22 2c 20  shell_idquote", 
20760 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
20770 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20790 68 65 6c 6c 49 64 51 75 6f 74 65 2c 20 30 2c 20  hellIdQuote, 0, 
207a0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
207b0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
207c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
207d0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
207e0 64 62 2c 20 22 65 64 69 74 22 2c 20 31 2c 20 53  db, "edit", 1, S
207f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46             editF
20820 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
20830 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
20840 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
20850 65 64 69 74 22 2c 20 32 2c 20 53 51 4c 49 54 45  edit", 2, SQLITE
20860 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 20 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20        editFunc, 
20890 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
208a0 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
208b0 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  e==SHELL_OPEN_ZI
208c0 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 63  PFILE ){.      c
208d0 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
208e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
208f0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49        "CREATE VI
20900 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69 70 20  RTUAL TABLE zip 
20910 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51  USING zipfile(%Q
20920 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  );", p->zDbFilen
20930 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
20940 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
20950 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
20960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20970 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
20980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20990 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
209a0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 69 66  .    else.    if
209b0 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
209c0 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
209d0 41 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f 70 65 6e  ALIZE || p->open
209e0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
209f0 5f 48 45 58 44 42 20 29 7b 0a 20 20 20 20 20 20  _HEXDB ){.      
20a00 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 69 6e  int rc;.      in
20a10 74 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  t nData = 0;.   
20a20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
20a30 20 2a 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *aData;.      i
20a40 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d  f( p->openMode==
20a50 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52  SHELL_OPEN_DESER
20a60 49 41 4c 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  IALIZE ){.      
20a70 20 20 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67    aData = (unsig
20a80 6e 65 64 20 63 68 61 72 2a 29 72 65 61 64 46 69  ned char*)readFi
20a90 6c 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  le(p->zDbFilenam
20aa0 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  e, &nData);.    
20ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20ac0 20 61 44 61 74 61 20 3d 20 72 65 61 64 48 65 78   aData = readHex
20ad0 44 62 28 70 2c 20 26 6e 44 61 74 61 29 3b 0a 20  Db(p, &nData);. 
20ae0 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
20af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
20b00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
20b10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
20b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
20b30 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c  serialize(p->db,
20b40 20 22 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20   "main", aData, 
20b50 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20  nData, nData,.  
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
20b80 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c  IZE_RESIZEABLE |
20b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ba0 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
20bb0 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f  IALIZE_FREEONCLO
20bc0 53 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  SE);.      if( r
20bd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
20be0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
20bf0 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
20c00 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72  _deserialize() r
20c10 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
20c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20c30 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20   if( p->szMax>0 
20c40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20c50 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
20c60 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  p->db, "main", S
20c70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
20c80 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61  _LIMIT, &p->szMa
20c90 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
20ca0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
20cb0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
20cc0 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   close the datab
20cd0 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  aes connection. 
20ce0 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   Report errors..
20cf0 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62  */.void close_db
20d00 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
20d10 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20d20 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69  3_close(db);.  i
20d30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
20d40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
20d50 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
20d60 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73  _close() returns
20d70 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %d: %s\n",.    
20d80 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f      rc, sqlite3_
20d90 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
20da0 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45   .}..#if HAVE_RE
20db0 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45  ADLINE || HAVE_E
20dc0 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65  DITLINE./*.** Re
20dd0 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f  adline completio
20de0 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73  n callbacks.*/.s
20df0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
20e00 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
20e10 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20  generator(const 
20e20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20  char *text, int 
20e30 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63  state){.  static
20e40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20e50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
20e60 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74   *zRet;.  if( st
20e70 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ate==0 ){.    ch
20e80 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71  ar *zSql;.    sq
20e90 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20ea0 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
20eb0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20ec0 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
20ed0 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c  CT candidate COL
20ee0 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20  LATE nocase".   
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
20f10 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f  completion(%Q) O
20f20 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74  RDER BY 1", text
20f30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
20f40 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
20f50 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
20f60 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
20f70 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
20f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
20f90 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
20fa0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
20fb0 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70     zRet = strdup
20fc0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
20fd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20fe0 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
20ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
21000 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
21010 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
21020 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  0;.    zRet = 0;
21030 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
21040 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61  et;.}.static cha
21050 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  r **readline_com
21060 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  pletion(const ch
21070 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69  ar *zText, int i
21080 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29  Start, int iEnd)
21090 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64  {.  rl_attempted
210a0 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72  _completion_over
210b0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
210c0 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74  l_completion_mat
210d0 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64  ches(zText, read
210e0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
210f0 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23  generator);.}..#
21100 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f  elif HAVE_LINENO
21110 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f  ISE./*.** Lineno
21120 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ise completion c
21130 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69  allback.*/.stati
21140 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65  c void linenoise
21150 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
21160 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c  t char *zLine, l
21170 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69  inenoiseCompleti
21180 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20  ons *lc){.  int 
21190 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30  nLine = strlen30
211a0 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69  (zLine);.  int i
211b0 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69  , iStart;.  sqli
211c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
211d0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
211e0 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  l;.  char zBuf[1
211f0 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69  000];..  if( nLi
21200 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d  ne>sizeof(zBuf)-
21210 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  30 ) return;.  i
21220 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  f( zLine[0]=='.'
21230 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23   || zLine[0]=='#
21240 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72  ') return;.  for
21250 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30  (i=nLine-1; i>=0
21260 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69   && (isalnum(zLi
21270 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b  ne[i]) || zLine[
21280 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d  i]=='_'); i--){}
21290 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d  .  if( i==nLine-
212a0 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53  1 ) return;.  iS
212b0 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65  tart = i+1;.  me
212c0 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65  mcpy(zBuf, zLine
212d0 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71  , iStart);.  zSq
212e0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
212f0 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
21300 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
21310 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
21340 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51  completion(%Q,%Q
21350 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20  ) ORDER BY 1",. 
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69          &zLine[i
21380 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a  Start], zLine);.
21390 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
213a0 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
213b0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
213c0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
213d0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c  ree(zSql);.  sql
213e0 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
213f0 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Db, "PRAGMA page
21400 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30  _count", 0, 0, 0
21410 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73  ); /* Load the s
21420 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65  chema */.  while
21430 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
21440 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
21450 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
21460 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e  har *zCompletion
21470 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
21480 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
21490 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
214a0 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69     int nCompleti
214b0 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  on = sqlite3_col
214c0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
214d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74   0);.    if( iSt
214e0 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  art+nCompletion 
214f0 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  < sizeof(zBuf)-1
21500 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
21510 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43  (zBuf+iStart, zC
21520 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70  ompletion, nComp
21530 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20  letion+1);.     
21540 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d   linenoiseAddCom
21550 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66  pletion(lc, zBuf
21560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
21570 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
21580 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pStmt);.}.#endif
21590 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e  ../*.** Do C-lan
215a0 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75  guage style dequ
215b0 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  oting..**.**    
215c0 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a  \a    -> alarm.*
215d0 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61  *    \b    -> ba
215e0 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74  ckspace.**    \t
215f0 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20      -> tab.**   
21600 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e   \n    -> newlin
21610 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e  e.**    \v    ->
21620 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a   vertical tab.**
21630 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72      \f    -> for
21640 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20  m feed.**    \r 
21650 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72     -> carriage r
21660 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20  eturn.**    \s  
21670 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20    -> space.**   
21680 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
21690 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20    \'    -> '.** 
216a0 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b     \\    -> back
216b0 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e  slash.**    \NNN
216c0 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
216d0 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
216e0 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l.*/.static void
216f0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
21700 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20  shes(char *z){. 
21710 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
21720 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  r c;.  while( *z
21730 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a   && *z!='\\' ) z
21740 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
21750 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
21760 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
21770 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  f( c=='\\' && z[
21780 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]!=0 ){.     
21790 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20   c = z[++i];.   
217a0 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b     if( c=='a' ){
217b0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61  .        c = '\a
217c0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
217d0 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20  f( c=='b' ){.   
217e0 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20       c = '\b';. 
217f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
21800 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
21810 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
21820 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e   }else if( c=='n
21830 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
21840 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\n';.      }el
21850 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b  se if( c=='v' ){
21860 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76  .        c = '\v
21870 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21880 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20  f( c=='f' ){.   
21890 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20       c = '\f';. 
218a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
218b0 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20  =='r' ){.       
218c0 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20   c = '\r';.     
218d0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
218e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
218f0 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '"';.      }els
21900 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b  e if( c=='\'' ){
21910 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27  .        c = '\'
21920 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21930 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
21940 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a        c = '\\';.
21950 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21960 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27  c>='0' && c<='7'
21970 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d   ){.        c -=
21980 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '0';.        if
21990 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
219a0 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
219b0 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
219c0 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
219d0 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
219e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
219f0 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
21a00 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
21a10 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
21a20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28             c = (
21a30 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
21a40 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0';.          }.
21a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21a60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
21a70 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
21a80 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  j<i ) z[j] = 0;.
21a90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
21aa0 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
21ab0 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
21ac0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
21ad0 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
21ae0 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
21af0 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
21b00 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
21b10 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
21b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
21b30 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73  ooleanValue(cons
21b40 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
21b50 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
21b60 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
21b70 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
21b80 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69    for(i=2; hexDi
21b90 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d  gitValue(zArg[i]
21ba0 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  )>=0; i++){}.  }
21bb0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
21bc0 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20  0; zArg[i]>='0' 
21bd0 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b  && zArg[i]<='9';
21be0 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66   i++){}.  }.  if
21bf0 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
21c00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e  ==0 ) return (in
21c10 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28  t)(integerValue(
21c20 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66  zArg) & 0xffffff
21c30 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ff);.  if( sqlit
21c40 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
21c50 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c   "on")==0 || sql
21c60 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
21c70 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20  g,"yes")==0 ){. 
21c80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
21c90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
21ca0 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66  tricmp(zArg, "of
21cb0 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  f")==0 || sqlite
21cc0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
21cd0 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  no")==0 ){.    r
21ce0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75  eturn 0;.  }.  u
21cf0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21d00 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61  r, "ERROR: Not a
21d10 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
21d20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67  \"%s\". Assuming
21d30 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"no\".\n",.   
21d40 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20         zArg);.  
21d50 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21d60 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
21d70 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63  a shell flag acc
21d80 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c  ording to a bool
21d90 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
21da0 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43  atic void setOrC
21db0 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74  learFlag(ShellSt
21dc0 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  ate *p, unsigned
21dd0 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68   mFlag, const ch
21de0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28  ar *zArg){.  if(
21df0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41   booleanValue(zA
21e00 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  rg) ){.    Shell
21e10 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  SetFlag(p, mFlag
21e20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21e30 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
21e40 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a  , mFlag);.  }.}.
21e50 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
21e60 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
21e70 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
21e80 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
21e90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21ea0 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
21eb0 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
21ec0 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
21ed0 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
21ee0 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
21ef0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
21f00 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
21f10 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
21f20 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
21f30 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
21f40 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
21f50 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
21f60 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
21f70 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66   the output.** f
21f80 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
21f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
21fa0 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
21fb0 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
21fc0 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d  File, int bTextM
21fd0 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ode){.  FILE *f;
21fe0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
21ff0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
22000 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
22010 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
22020 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
22030 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
22040 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
22050 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
22060 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
22070 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
22080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
22090 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54   fopen(zFile, bT
220a0 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20  extMode ? "w" : 
220b0 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66  "wb");.    if( f
220c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
220d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
220e0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
220f0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
22100 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
22110 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a  }.  return f;.}.
22120 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22130 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
22140 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68   A routine for h
22150 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66  andling output f
22160 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63  rom sqlite3_trac
22170 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
22180 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  nt sql_trace_cal
22190 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65  lback(.  unsigne
221a0 64 20 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20  d mType,        
221b0 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 74 79   /* The trace ty
221c0 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  pe */.  void *pA
221d0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
221e0 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74  /* The ShellStat
221f0 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76  e pointer */.  v
22200 6f 69 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20  oid *pP,        
22210 20 20 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c         /* Usuall
22220 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73  y a pointer to s
22230 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20  qlite_stmt */.  
22240 76 6f 69 64 20 2a 70 58 20 20 20 20 20 20 20 20  void *pX        
22250 20 20 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c          /* Auxil
22260 69 61 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29  iary output */.)
22270 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
22280 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
22290 29 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  )pArg;.  sqlite3
222a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
222b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
222c0 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20  ;.  int nSql;.  
222d0 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d  if( p->traceOut=
222e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
222f0 20 69 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49   if( mType==SQLI
22300 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29  TE_TRACE_CLOSE )
22310 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
22320 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
22330 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62  -- closing datab
22340 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e  ase connection\n
22350 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
22360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70  ;.  }.  if( mTyp
22370 65 21 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  e!=SQLITE_TRACE_
22380 52 4f 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63  ROW && ((const c
22390 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27  har*)pX)[0]=='-'
223a0 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28   ){.    zSql = (
223b0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a  const char*)pX;.
223c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
223d0 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
223e0 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74  mt*)pP;.    swit
223f0 63 68 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70  ch( p->eTraceTyp
22400 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
22410 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41  SHELL_TRACE_EXPA
22420 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  NDED: {.        
22430 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
22440 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d  xpanded_sql(pStm
22450 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
22460 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  k;.      }.#ifde
22470 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22480 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20  NORMALIZE.      
22490 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  case SHELL_TRACE
224a0 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20  _NORMALIZED: {. 
224b0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
224c0 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64  lite3_normalized
224d0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
224e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
224f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22500 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
22510 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
22520 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
22530 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22540 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22550 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
22560 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c  return 0;.  nSql
22570 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
22580 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c  );.  while( nSql
22590 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d  >0 && zSql[nSql-
225a0 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d  1]==';' ){ nSql-
225b0 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d  -; }.  switch( m
225c0 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
225d0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f   SQLITE_TRACE_RO
225e0 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  W:.    case SQLI
225f0 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b  TE_TRACE_STMT: {
22600 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
22610 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20  tf(p->traceOut, 
22620 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c  "%.*s;\n", nSql,
22630 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72   zSql);.      br
22640 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22650 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
22660 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
22670 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22680 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c  nNanosec = *(sql
22690 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a  ite3_int64*)pX;.
226a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
226b0 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
226c0 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73  %.*s; -- %lld ns
226d0 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c  \n", nSql, zSql,
226e0 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20   nNanosec);.    
226f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
22700 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22710 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
22720 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74   no-op routine t
22730 68 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68  hat runs with th
22740 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  e ".breakpoint" 
22750 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68  doc-command.  Th
22760 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75  is is.** a usefu
22770 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20  l spot to set a 
22780 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f  debugger breakpo
22790 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
227a0 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  oid test_breakpo
227b0 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
227c0 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20  tic int nCall = 
227d0 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a  0;.  nCall++;.}.
227e0 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
227f0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
22800 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69  CSV and other fi
22810 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a  les for import..
22820 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
22830 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f  t ImportCtx Impo
22840 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d  rtCtx;.struct Im
22850 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73  portCtx {.  cons
22860 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
22870 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
22880 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46  nput file */.  F
22890 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
228a0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43     /* Read the C
228b0 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69  SV text from thi
228c0 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  s input stream *
228d0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
228e0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d          /* Accum
228f0 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20  ulated text for 
22900 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  a field */.  int
22910 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
22920 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22930 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e  tes in z */.  in
22940 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
22950 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
22960 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a  ated for z[] */.
22970 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20    int nLine;    
22980 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
22990 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
229a0 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b    int bNotFirst;
229b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
229c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74   one or more byt
229d0 65 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20  es already read 
229e0 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20  */.  int cTerm; 
229f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72           /* Char
22a00 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
22a10 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72  nated the most r
22a20 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20  ecent field */. 
22a30 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20   int cColSep;   
22a40 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
22a50 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
22a60 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
22a70 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20  y ",") */.  int 
22a80 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20  cRowSep;        
22a90 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72  /* The row separ
22aa0 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
22ab0 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20   (Usually "\n") 
22ac0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64  */.};../* Append
22ad0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
22ae0 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20  o z[] */.static 
22af0 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65  void import_appe
22b00 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74  nd_char(ImportCt
22b10 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20  x *p, int c){.  
22b20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e  if( p->n+1>=p->n
22b30 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
22b40 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c  nAlloc += p->nAl
22b50 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  loc + 100;.    p
22b60 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ->z = sqlite3_re
22b70 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d  alloc64(p->z, p-
22b80 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
22b90 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c  ( p->z==0 ) shel
22ba0 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
22bb0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d  );.  }.  p->z[p-
22bc0 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b  >n++] = (char)c;
22bd0 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69  .}../* Read a si
22be0 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53  ngle field of CS
22bf0 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69  V text.  Compati
22c00 62 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30  ble with rfc4180
22c10 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a   and extended.**
22c20 20 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e   with the option
22c30 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70   of having a sep
22c40 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  arator other tha
22c50 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b  n ","..**.**   +
22c60 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
22c70 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
22c80 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
22c90 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
22ca0 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
22cb0 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
22cc0 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
22cd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
22ce0 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
22cf0 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
22d00 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
22d10 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
22d20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  ","..**   +  Use
22d30 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20   p->rSep as the 
22d40 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
22d50 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
22d60 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  \n"..**   +  Kee
22d70 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
22d80 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  ine number in p-
22d90 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
22da0 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
22db0 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
22dc0 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
22dd0 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
22de0 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
22df0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
22e00 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
22e10 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
22e20 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
22e30 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
22e40 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  L csv_read_one_f
22e50 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a  ield(ImportCtx *
22e60 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  p){.  int c;.  i
22e70 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f  nt cSep = p->cCo
22e80 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70  lSep;.  int rSep
22e90 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20   = p->cRowSep;. 
22ea0 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
22eb0 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
22ec0 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
22ed0 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
22ee0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
22ef0 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
22f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27  ;.  }.  if( c=='
22f10 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63  "' ){.    int pc
22f20 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73  , ppc;.    int s
22f30 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c  tartLine = p->nL
22f40 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75  ine;.    int cQu
22f50 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20  ote = c;.    pc 
22f60 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77  = ppc = 0;.    w
22f70 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
22f80 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
22f90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
22fa0 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b  rSep ) p->nLine+
22fb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
22fc0 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
22fd0 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
22fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63   ){.          pc
22ff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23000 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23010 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23020 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26    if( (c==cSep &
23030 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20  & pc==cQuote).  
23040 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70       || (c==rSep
23050 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
23060 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
23070 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26  ep && pc=='\r' &
23080 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  & ppc==cQuote). 
23090 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46        || (c==EOF
230a0 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
230b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
230c0 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68   do{ p->n--; }wh
230d0 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21  ile( p->z[p->n]!
230e0 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20  =cQuote );.     
230f0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b     p->cTerm = c;
23100 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
23110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23120 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20  ( pc==cQuote && 
23130 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20  c!='\r' ){.     
23140 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
23150 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
23160 6e 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72  nescaped %c char
23170 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20  acter\n",.      
23180 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
23190 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51  le, p->nLine, cQ
231a0 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uote);.      }. 
231b0 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20       if( c==EOF 
231c0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
231d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
231e0 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61  %s:%d: untermina
231f0 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69  ted %c-quoted fi
23200 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eld\n",.        
23210 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65          p->zFile
23220 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75  , startLine, cQu
23230 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ote);.        p-
23240 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
23250 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23260 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f   }.      import_
23270 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
23280 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70  );.      ppc = p
23290 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b  c;.      pc = c;
232a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
232b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
232c0 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  s the first fiel
232d0 64 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61  d being parsed a
232e0 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74  nd it begins wit
232f0 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46  h the.    ** UTF
23300 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42  -8 BOM  (0xEF BB
23310 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74   BF) then skip t
23320 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66  he BOM */.    if
23330 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66  ( (c&0xff)==0xef
23340 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74   && p->bNotFirst
23350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70  ==0 ){.      imp
23360 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
23370 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d  p, c);.      c =
23380 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
23390 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
233a0 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20  )==0xbb ){.     
233b0 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
233c0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
233d0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
233e0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  ->in);.        i
233f0 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62  f( (c&0xff)==0xb
23400 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
23410 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
23420 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20  .          p->n 
23430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
23440 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f  eturn csv_read_o
23450 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20  ne_field(p);.   
23460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23470 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
23480 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
23490 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
234a0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
234b0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
234c0 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
234d0 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  p->in);.    }.  
234e0 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b    if( c==rSep ){
234f0 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  .      p->nLine+
23500 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
23510 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e  n>0 && p->z[p->n
23520 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e  -1]=='\r' ) p->n
23530 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  --;.    }.    p-
23540 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a  >cTerm = c;.  }.
23550 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
23560 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70  z[p->n] = 0;.  p
23570 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
23580 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
23590 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
235a0 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43  gle field of ASC
235b0 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78  II delimited tex
235c0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e  t..**.**   +  In
235d0 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70  put comes from p
235e0 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  ->in..**   +  St
235f0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70  ore results in p
23600 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d  ->z of length p-
23610 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  >n.  Space to ho
23620 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a  ld p->z comes.**
23630 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74        from sqlit
23640 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a  e3_malloc64()..*
23650 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53  *   +  Use p->cS
23660 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ep as the column
23670 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
23680 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31   default is "\x1
23690 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  F"..**   +  Use 
236a0 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
236b0 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
236c0 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
236d0 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65  x1E"..**   +  Ke
236e0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
236f0 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  row number in p-
23700 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
23710 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
23720 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
23730 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
23740 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
23750 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
23760 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
23770 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
23780 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
23790 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
237a0 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
237b0 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65  L ascii_read_one
237c0 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
237d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
237e0 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
237f0 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
23800 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
23810 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
23820 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
23830 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
23840 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
23850 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
23860 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
23870 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
23880 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53   c!=EOF && c!=cS
23890 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b  ep && c!=rSep ){
238a0 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65  .    import_appe
238b0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
238c0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
238d0 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  in);.  }.  if( c
238e0 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d  ==rSep ){.    p-
238f0 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20  >nLine++;.  }.  
23900 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
23910 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
23920 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74  p->n] = 0;.  ret
23930 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a  urn p->z;.}../*.
23940 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66  ** Try to transf
23950 65 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  er data for tabl
23960 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e  e zTable.  If an
23970 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77   error is seen w
23980 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66  hile.** moving f
23990 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67  orward, try to g
239a0 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68  o backwards.  Th
239b0 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65  e backwards move
239c0 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f  ment won't.** wo
239d0 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk for WITHOUT R
239e0 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  OWID tables..*/.
239f0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
23a00 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68  oCloneData(.  Sh
23a10 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
23a20 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
23a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
23a40 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ble.){.  sqlite3
23a50 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
23a60 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
23a70 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  t *pInsert = 0;.
23a80 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
23a90 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73   0;.  char *zIns
23aa0 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ert = 0;.  int r
23ab0 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  c;.  int i, j, n
23ac0 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d  ;.  int nTable =
23ad0 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65   strlen30(zTable
23ae0 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a  );.  int k = 0;.
23af0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
23b00 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52   const int spinR
23b10 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20  ate = 10000;..  
23b20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
23b30 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
23b40 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c   * FROM \"%w\"",
23b50 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d   zTable);.  rc =
23b60 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
23b70 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
23b80 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
23b90 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
23ba0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
23bb0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
23bc0 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
23bd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
23be0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
23bf0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
23c00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
23c10 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
23c20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
23c30 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
23c40 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c  r;.  }.  n = sql
23c50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
23c60 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e  t(pQuery);.  zIn
23c70 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  sert = sqlite3_m
23c80 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54  alloc64(200 + nT
23c90 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69  able + n*3);.  i
23ca0 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20  f( zInsert==0 ) 
23cb0 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
23cc0 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ory();.  sqlite3
23cd0 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54  _snprintf(200+nT
23ce0 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20  able,zInsert,.  
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
23d10 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56  RE INTO \"%s\" V
23d20 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
23d30 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33  );.  i = strlen3
23d40 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f  0(zInsert);.  fo
23d50 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29  r(j=1; j<n; j++)
23d60 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e  {.    memcpy(zIn
23d70 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29  sert+i, ",?", 2)
23d80 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20  ;.    i += 2;.  
23d90 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65  }.  memcpy(zInse
23da0 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a  rt+i, ");", 3);.
23db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
23dc0 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c  repare_v2(newDb,
23dd0 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70   zInsert, -1, &p
23de0 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66  Insert, 0);.  if
23df0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
23e00 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23e10 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
23e20 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
23e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
23e40 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
23e50 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ewDb), sqlite3_e
23e60 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20  rrmsg(newDb),.  
23e70 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
23e80 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
23e90 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
23ea0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b   for(k=0; k<2; k
23eb0 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ++){.    while( 
23ec0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
23ed0 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
23ee0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
23ef0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
23f00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69  ++){.        swi
23f10 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
23f20 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c  umn_type(pQuery,
23f30 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
23f40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
23f50 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
23f60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
23f70 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29  ll(pInsert, i+1)
23f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
23f90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
23fa0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
23fb0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
23fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23fd0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
23fe0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
23ff0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
24000 74 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  t64(pQuery,i));.
24010 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
24020 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
24030 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
24040 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
24050 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24060 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49  3_bind_double(pI
24070 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
24080 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
24090 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  e(pQuery,i));.  
240a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
240b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
240c0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
240d0 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
240e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
240f0 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74  ind_text(pInsert
24100 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20  , i+1,.         
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
24130 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
24140 74 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a  text(pQuery,i),.
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
24170 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
24180 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
24190 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
241a0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
241b0 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
241c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
241d0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73  3_bind_blob(pIns
241e0 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
241f0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51  3_column_blob(pQ
24200 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,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 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
24240 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79  umn_bytes(pQuery
24250 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
24290 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
242a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
242b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
242c0 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a  } /* End for */.
242d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
242e0 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
242f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
24300 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
24310 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72  =SQLITE_ROW && r
24320 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
24330 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
24340 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
24350 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20  rror %d: %s\n", 
24360 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
24370 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
24380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
243a0 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b  _errmsg(newDb));
243b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
243c0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e  qlite3_reset(pIn
243d0 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74  sert);.      cnt
243e0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  ++;.      if( (c
243f0 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20  nt%spinRate)==0 
24400 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
24410 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c  f("%c\b", "|/-\\
24420 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29  "[(cnt/spinRate)
24430 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66  %4]);.        ff
24440 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
24450 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45      }.    } /* E
24460 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20  nd while */.    
24470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
24480 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ONE ) break;.   
24490 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
244a0 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  e(pQuery);.    s
244b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
244c0 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20  ry);.    zQuery 
244d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
244e0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
244f0 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59   \"%w\" ORDER BY
24500 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20   rowid DESC;",. 
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
24530 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
24540 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
24550 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
24560 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
24570 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
24580 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24590 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
245a0 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c  g: cannot step \
245b0 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22  "%s\" backwards"
245c0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , zTable);.     
245d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
245e0 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30  } /* End for(k=0
245f0 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74  ...) */..end_dat
24600 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
24610 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
24620 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  y);.  sqlite3_fi
24630 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
24640 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24650 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  zQuery);.  sqlit
24660 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29  e3_free(zInsert)
24670 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
24680 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20  to transfer all 
24690 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65  rows of the sche
246a0 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57  ma that match zW
246b0 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61  here.  For.** ea
246c0 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78  ch row, invoke x
246d0 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65  ForEach() on the
246e0 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20   object defined 
246f0 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20  by that row..** 
24700 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
24710 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
24720 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20   moving forward 
24730 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73  through the.** s
24740 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
24750 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f  le, try again mo
24760 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a  ving backwards..
24770 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
24780 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
24790 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
247a0 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ,.  sqlite3 *new
247b0 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
247c0 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64   *zWhere,.  void
247d0 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65   (*xForEach)(She
247e0 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33  llState*,sqlite3
247f0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  *,const char*).)
24800 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
24810 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
24820 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30  char *zQuery = 0
24830 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
24840 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
24850 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
24860 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
24870 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
24880 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a  ErrMsg = 0;..  z
24890 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
248a0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
248b0 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  name, sql FROM s
248c0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
248f0 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20   %s", zWhere);. 
24900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
24910 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
24920 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
24930 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ery, 0);.  if( r
24940 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
24950 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
24960 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
24970 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24990 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
249a0 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
249b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
249c0 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
249d0 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
249e0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  ;.    goto end_s
249f0 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  chema_xfer;.  }.
24a00 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
24a10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
24a20 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ry))==SQLITE_ROW
24a30 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
24a40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24a50 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
24a60 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
24a70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
24a80 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70  Query, 1);.    p
24a90 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
24aa0 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
24ab0 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  tdout);.    sqli
24ac0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
24ad0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
24ae0 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
24af0 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
24b00 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
24b10 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24b20 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
24b30 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
24b40 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
24b50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
24b60 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45  rrMsg);.      zE
24b70 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
24b80 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63  .    if( xForEac
24b90 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45  h ){.      xForE
24ba0 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
24bb0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
24bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
24bd0 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20  ntf("done\n");. 
24be0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
24bf0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
24c00 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
24c10 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
24c20 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
24c30 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
24c40 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
24c50 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73  ("SELECT name, s
24c60 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
24c70 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 20 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f      " WHERE %s O
24ca0 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
24cb0 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  SC", zWhere);.  
24cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
24cd0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
24ce0 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
24cf0 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
24d00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
24d10 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24d20 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25  , "Error: (%d) %
24d30 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
24d60 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e  nded_errcode(p->
24d70 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
24d80 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20  msg(p->db),.    
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20    zQuery);.     
24db0 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
24dc0 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  _xfer;.    }.   
24dd0 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
24de0 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
24df0 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
24e00 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
24e10 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24e20 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
24e30 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
24e40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24e50 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
24e60 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e      printf("%s..
24e70 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c  . ", zName); ffl
24e80 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
24e90 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
24ea0 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
24eb0 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  ar*)zSql, 0, 0, 
24ec0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
24ed0 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
24ee0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
24ef0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
24f00 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
24f10 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
24f20 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Sql);.        sq
24f30 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
24f40 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  sg);.        zEr
24f50 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
24f60 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72  }.      if( xFor
24f70 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Each ){.        
24f80 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44  xForEach(p, newD
24f90 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
24fa0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
24fb0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f        printf("do
24fc0 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ne\n");.    }.  
24fd0 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  }.end_schema_xfe
24fe0 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
24ff0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
25000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
25010 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  uery);.}../*.** 
25020 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
25030 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  ase file named "
25040 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f  zNewDb".  Try to
25050 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68   recover as much
25060 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
25070 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20  as possible out 
25080 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
25090 62 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68  base (which migh
250a0 74 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e  t be corrupt) an
250b0 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e  d write it.** in
250c0 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74  to zNewDb..*/.st
250d0 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
250e0 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lone(ShellState 
250f0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
25100 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72  zNewDb){.  int r
25110 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  c;.  sqlite3 *ne
25120 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  wDb = 0;.  if( a
25130 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d  ccess(zNewDb,0)=
25140 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
25150 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
25160 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ile \"%s\" alrea
25170 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a  dy exists.\n", z
25180 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75  NewDb);.    retu
25190 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rn;.  }.  rc = s
251a0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77  qlite3_open(zNew
251b0 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69  Db, &newDb);.  i
251c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
251d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
251e0 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
251f0 6f 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a  output database:
25200 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
25210 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
25220 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65  sg(newDb));.  }e
25230 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
25240 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
25250 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
25260 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c  hema=ON;", 0, 0,
25270 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
25280 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45  _exec(newDb, "BE
25290 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c  GIN EXCLUSIVE;",
252a0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74   0, 0, 0);.    t
252b0 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
252c0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d  p, newDb, "type=
252d0 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43  'table'", tryToC
252e0 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74  loneData);.    t
252f0 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
25300 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21  p, newDb, "type!
25310 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20  ='table'", 0);. 
25320 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
25330 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22  newDb, "COMMIT;"
25340 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
25350 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
25360 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
25370 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
25380 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
25390 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44  .  close_db(newD
253a0 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
253b0 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
253c0 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
253d0 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ut..**.** If the
253e0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c   p->doXdgOpen fl
253f0 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  ag is set, that 
25400 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74  means the output
25410 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65   was being.** re
25420 64 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65  directed to a te
25430 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
25440 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69  ed by p->zTempFi
25450 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
25460 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61  e,.** launch sta
25470 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e  rt/open/xdg-open
25480 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
25490 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ry file..*/.stat
254a0 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72  ic void output_r
254b0 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
254c0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75  *p){.  if( p->ou
254d0 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  tfile[0]=='|' ){
254e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
254f0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70  OMIT_POPEN.    p
25500 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23  close(p->out);.#
25510 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
25520 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
25530 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69  lose(p->out);.#i
25540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
25550 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69  AVE_SYSTEM.    i
25560 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  f( p->doXdgOpen 
25570 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25580 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64  har *zXdgOpenCmd
25590 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   =.#if defined(_
255a0 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74  WIN32).      "st
255b0 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69  art";.#elif defi
255c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
255d0 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c       "open";.#el
255e0 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70  se.      "xdg-op
255f0 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  en";.#endif.    
25600 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
25610 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
25620 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25  e3_mprintf("%s %
25630 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c  s", zXdgOpenCmd,
25640 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a   p->zTempFile);.
25650 20 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d        if( system
25660 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20  (zCmd) ){.      
25670 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
25680 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b  derr, "Failed: [
25690 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  %s]\n", zCmd);. 
256a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
256b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b  ite3_free(zCmd);
256c0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
256d0 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70  ePop(p);.      p
256e0 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b  ->doXdgOpen = 0;
256f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25700 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 7d  leep(100);.    }
25710 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
25720 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56  ned(SQLITE_NOHAV
25730 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d  E_SYSTEM) */.  }
25740 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  .  p->outfile[0]
25750 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d   = 0;.  p->out =
25760 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   stdout;.}../*.*
25770 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d  * Run an SQL com
25780 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  mand and return 
25790 74 68 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67  the single integ
257a0 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  er result..*/.st
257b0 61 74 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28  atic int db_int(
257c0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
257d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
257e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
257f0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
25800 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  es = 0;.  sqlite
25810 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
25820 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
25830 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
25840 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
25850 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
25860 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
25870 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  res = sqlite3_co
25880 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30  lumn_int(pStmt,0
25890 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
258a0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
258b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
258c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
258d0 20 61 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62   a 2-byte or 4-b
258e0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
258f0 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61  nteger into a na
25900 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
25910 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
25920 69 6e 74 20 67 65 74 32 62 79 74 65 49 6e 74 28  int get2byteInt(
25930 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
25940 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30  ){.  return (a[0
25950 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a  ]<<8) + a[1];.}.
25960 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
25970 69 6e 74 20 67 65 74 34 62 79 74 65 49 6e 74 28  int get4byteInt(
25980 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
25990 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30  ){.  return (a[0
259a0 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c  ]<<24) + (a[1]<<
259b0 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20  16) + (a[2]<<8) 
259c0 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  + a[3];.}../*.**
259d0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
259e0 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63  of the ".info" c
259f0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ommand..**.** Re
25a00 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
25a10 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
25a20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
25a30 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
25a40 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28  _dbinfo_command(
25a50 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69  ShellState *p, i
25a60 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
25a70 61 7a 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63  azArg){.  static
25a80 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
25a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25aa0 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61  e; int ofst; } a
25ab0 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  Field[] = {.    
25ac0 20 7b 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20   { "file change 
25ad0 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20  counter:",  24  
25ae0 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62  },.     { "datab
25af0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22  ase page count:"
25b00 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  28  },.     {
25b10 20 22 66 72 65 65 6c 69 73 74 20 70 61 67 65 20   "freelist page 
25b20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c  count:",  36  },
25b30 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
25b40 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20  cookie:",       
25b50 20 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   40  },.     { "
25b60 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c  schema format:",
25b70 20 20 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20          44  },. 
25b80 20 20 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63      { "default c
25b90 61 63 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34  ache size:",   4
25ba0 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75  8  },.     { "au
25bb0 74 6f 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f  tovacuum top roo
25bc0 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20  t:",  52  },.   
25bd0 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c    { "incremental
25be0 20 76 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20   vacuum:",   64 
25bf0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74   },.     { "text
25c00 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20   encoding:",    
25c10 20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20      56  },.     
25c20 7b 20 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a  { "user version:
25c30 22 2c 20 20 20 20 20 20 20 20 20 36 30 20 20 7d  ",         60  }
25c40 2c 0a 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63  ,.     { "applic
25c50 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20  ation id:",     
25c60 20 20 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    68  },.     { 
25c70 22 73 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f  "software versio
25c80 6e 3a 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a  n:",     96  },.
25c90 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
25ca0 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
25cb0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
25cc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
25cd0 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b  ; } aQuery[] = {
25ce0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
25cf0 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20  of tables:",.   
25d00 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
25d10 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
25d20 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22  RE type='table'"
25d30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62   },.     { "numb
25d40 65 72 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c  er of indexes:",
25d50 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
25d60 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
25d70 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64   WHERE type='ind
25d80 65 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ex'" },.     { "
25d90 6e 75 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65  number of trigge
25da0 72 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  rs:",.       "SE
25db0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
25dc0 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
25dd0 3d 27 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20  ='trigger'" },. 
25de0 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
25df0 20 76 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20   views:",.      
25e00 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
25e10 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
25e20 74 79 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a  type='view'" },.
25e30 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73       { "schema s
25e40 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ize:",.       "S
25e50 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67  ELECT total(leng
25e60 74 68 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73  th(sql)) FROM %s
25e70 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  " },.  };.  int 
25e80 69 2c 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  i, rc;.  unsigne
25e90 64 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a  d iDataVersion;.
25ea0 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54    char *zSchemaT
25eb0 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  ab;.  char *zDb 
25ec0 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
25ed0 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
25ee0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
25ef0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69  Stmt = 0;.  unsi
25f00 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
25f10 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70  00];.  open_db(p
25f20 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  , 0);.  if( p->d
25f30 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
25f40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
25f50 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
25f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
25f70 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
25f80 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f   sqlite_dbpage(?
25f90 31 29 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22  1) WHERE pgno=1"
25fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  ,.             -
25fb0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
25fc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
25fd0 66 28 20 21 73 71 6c 69 74 65 33 5f 63 6f 6d 70  f( !sqlite3_comp
25fe0 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 22  ileoption_used("
25ff0 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
26000 41 42 22 29 20 29 7b 0a 20 20 20 20 20 20 75 74  AB") ){.      ut
26010 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26020 2c 20 22 74 68 65 20 5c 22 2e 64 62 69 6e 66 6f  , "the \".dbinfo
26030 5c 22 20 63 6f 6d 6d 61 6e 64 20 72 65 71 75 69  \" command requi
26040 72 65 73 20 74 68 65 20 22 0a 20 20 20 20 20 20  res the ".      
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 20 22 2d 44 53 51 4c 49 54 45 5f 45 4e      "-DSQLITE_EN
26070 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
26080 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
26090 74 69 6f 6e 73 5c 6e 22 29 3b 0a 20 20 20 20 7d  tions\n");.    }
260a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
260b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
260c0 22 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "error: %s\n", s
260d0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
260e0 3e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >db));.    }.   
260f0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
26100 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65  e(pStmt);.    re
26110 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 71  turn 1;.  }.  sq
26120 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
26130 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d  pStmt, 1, zDb, -
26140 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
26150 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
26160 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
26170 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26 20 73  LITE_ROW.   && s
26180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
26190 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31 30 30  tes(pStmt,0)>100
261a0 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
261b0 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33 5f 63  (aHdr, sqlite3_c
261c0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
261d0 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20 20 73  ,0), 100);.    s
261e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
261f0 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  pStmt);.  }else{
26200 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
26210 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20  stderr, "unable 
26220 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
26230 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20   header\n");.   
26240 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
26250 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65  e(pStmt);.    re
26260 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20  turn 1;.  }.  i 
26270 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28 61 48  = get2byteInt(aH
26280 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20 69 3d  dr+16);.  if( i=
26290 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36 3b 0a  =1 ) i = 65536;.
262a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
262b0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
262c0 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20 70 61  n", "database pa
262d0 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20  ge size:", i);. 
262e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
262f0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
26300 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d 61 74  ", "write format
26310 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20  :", aHdr[18]);. 
26320 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
26330 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
26340 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a  ", "read format:
26350 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20  ", aHdr[19]);.  
26360 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
26370 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
26380 2c 20 22 72 65 73 65 72 76 65 64 20 62 79 74 65  , "reserved byte
26390 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a  s:", aHdr[20]);.
263a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
263b0 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29 3b 20  aySize(aField); 
263c0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
263d0 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f  st = aField[i].o
263e0 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  fst;.    unsigne
263f0 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65 74 34  d int val = get4
26400 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b 20 6f  byteInt(aHdr + o
26410 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  fst);.    utf8_p
26420 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
26430 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65 6c 64  -20s %u", aField
26440 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b  [i].zName, val);
26450 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 66 73  .    switch( ofs
26460 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
26470 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  56: {.        if
26480 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70  ( val==1 ) raw_p
26490 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
264a0 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20 20 20  (utf8)");.      
264b0 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29 20 72    if( val==2 ) r
264c0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
264d0 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22 29 3b  , " (utf16le)");
264e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
264f0 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==3 ) raw_printf
26500 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31  (p->out, " (utf1
26510 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  6be)");.      }.
26520 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
26530 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
26540 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44  ");.  }.  if( zD
26550 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  b==0 ){.    zSch
26560 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
26570 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73  _mprintf("main.s
26580 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a  qlite_master");.
26590 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
265a0 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d  mp(zDb,"temp")==
265b0 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  0 ){.    zSchema
265c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
265d0 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c  rintf("%s", "sql
265e0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
265f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26600 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
26610 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
26620 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74  %w\".sqlite_mast
26630 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  er", zDb);.  }. 
26640 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
26650 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69  ySize(aQuery); i
26660 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
26670 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
26680 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e  rintf(aQuery[i].
26690 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62  zSql, zSchemaTab
266a0 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  );.    int val =
266b0 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29   db_int(p, zSql)
266c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
266d0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74  ee(zSql);.    ut
266e0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
266f0 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
26700 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c  aQuery[i].zName,
26710 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   val);.  }.  sql
26720 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68 65 6d  ite3_free(zSchem
26730 61 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  aTab);.  sqlite3
26740 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
26750 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  >db, zDb, SQLITE
26760 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53  _FCNTL_DATA_VERS
26770 49 4f 4e 2c 20 26 69 44 61 74 61 56 65 72 73 69  ION, &iDataVersi
26780 6f 6e 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  on);.  utf8_prin
26790 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
267a0 73 20 25 75 5c 6e 22 2c 20 22 64 61 74 61 20 76  s %u\n", "data v
267b0 65 72 73 69 6f 6e 22 2c 20 69 44 61 74 61 56 65  ersion", iDataVe
267c0 72 73 69 6f 6e 29 3b 0a 20 20 72 65 74 75 72 6e  rsion);.  return
267d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   0;.}../*.** Pri
267e0 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nt the current s
267f0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20  qlite3_errmsg() 
26800 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72 20  value to stderr 
26810 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f  and return 1..*/
26820 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
26830 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 73  lDatabaseError(s
26840 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
26850 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
26860 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
26870 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  (db);.  utf8_pri
26880 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
26890 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  or: %s\n", zErr)
268a0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
268b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
268c0 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 47  he pattern in zG
268d0 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20 74 68  lob[] against th
268e0 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20  e text in z[].  
268f0 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69  Return TRUE.** i
26900 66 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e 64  f they match and
26910 20 46 41 4c 53 45 20 28 30 29 20 69 66 20 74 68   FALSE (0) if th
26920 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ey do not match.
26930 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
26940 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
26950 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
26960 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
26970 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
26980 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
26990 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
269a0 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
269b0 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
269c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
269d0 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
269e0 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
269f0 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
26a00 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
26a10 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
26a20 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
26a30 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
26a40 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
26a50 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
26a60 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed list..**.**  
26a70 20 20 20 20 27 23 27 20 20 20 20 20 20 20 4d 61      '#'       Ma
26a80 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
26a90 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ce of one or mor
26aa0 65 20 64 69 67 69 74 73 20 77 69 74 68 20 61 6e  e digits with an
26ab0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
26ac0 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72     optional + or
26ad0 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74   - sign in front
26ae0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20 27 20  .**.**      ' ' 
26af0 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e 20 6f        Any span o
26b00 66 20 77 68 69 74 65 73 70 61 63 65 20 6d 61 74  f whitespace mat
26b10 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72 20 73  ches any other s
26b20 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  pan of.**       
26b30 20 20 20 20 20 20 20 20 20 77 68 69 74 65 73 70           whitesp
26b40 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61  ace..**.** Extra
26b50 20 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74   whitespace at t
26b60 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73  he end of z[] is
26b70 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61   ignored..*/.sta
26b80 74 69 63 20 69 6e 74 20 74 65 73 74 63 61 73 65  tic int testcase
26b90 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72  _glob(const char
26ba0 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63   *zGlob, const c
26bb0 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63  har *z){.  int c
26bc0 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65  , c2;.  int inve
26bd0 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a  rt;.  int seen;.
26be0 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 28  .  while( (c = (
26bf0 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20  *(zGlob++)))!=0 
26c00 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61  ){.    if( IsSpa
26c10 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 69  ce(c) ){.      i
26c20 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a 29 20  f( !IsSpace(*z) 
26c30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
26c40 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
26c50 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62  (*zGlob) ) zGlob
26c60 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
26c70 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 7a   IsSpace(*z) ) z
26c80 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
26c90 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  ( c=='*' ){.    
26ca0 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a    while( (c=(*(z
26cb0 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27  Glob++))) == '*'
26cc0 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20   || c=='?' ){.  
26cd0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27        if( c=='?'
26ce0 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20   && (*(z++))==0 
26cf0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
26d00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
26d10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
26d20 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
26d30 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
26d40 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
26d50 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73 65 5f   *z && testcase_
26d60 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d  glob(zGlob-1,z)=
26d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26d80 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  z++;.        }. 
26d90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 2a         return (*
26da0 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20  z)!=0;.      }. 
26db0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20       while( (c2 
26dc0 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29  = (*(z++)))!=0 )
26dd0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
26de0 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20 20 20   c2!=c ){.      
26df0 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b      c2 = *(z++);
26e00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
26e10 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  2==0 ) return 0;
26e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26e30 20 20 20 69 66 28 20 74 65 73 74 63 61 73 65 5f     if( testcase_
26e40 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20  glob(zGlob,z) ) 
26e50 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
26e60 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  }.      return 0
26e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26e80 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  c=='?' ){.      
26e90 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20  if( (*(z++))==0 
26ea0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
26eb0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
26ec0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72   ){.      int pr
26ed0 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
26ee0 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20   seen = 0;.     
26ef0 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
26f00 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20     c = *(z++);. 
26f10 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
26f20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
26f30 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
26f40 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
26f50 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ^' ){.        in
26f60 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vert = 1;.      
26f70 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
26f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26f90 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a   if( c2==']' ){.
26fa0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
26fb0 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  ]' ) seen = 1;. 
26fc0 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
26fd0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
26fe0 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20        while( c2 
26ff0 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20  && c2!=']' ){.  
27000 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d        if( c2=='-
27010 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27  ' && zGlob[0]!='
27020 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d  ]' && zGlob[0]!=
27030 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29  0 && prior_c>0 )
27040 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
27050 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
27060 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72         if( c>=pr
27070 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29  ior_c && c<=c2 )
27080 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
27090 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30       prior_c = 0
270a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
270b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
270c0 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==c2 ){.        
270d0 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20      seen = 1;.  
270e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
270f0 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32      prior_c = c2
27100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27110 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
27120 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
27130 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20     if( c2==0 || 
27140 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d  (seen ^ invert)=
27150 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
27160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
27170 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '#' ){.      if(
27180 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a   (z[0]=='-' || z
27190 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49 73 44  [0]=='+') && IsD
271a0 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b  igit(z[1]) ) z++
271b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 44  ;.      if( !IsD
271c0 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72 65 74  igit(z[0]) ) ret
271d0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b  urn 0;.      z++
271e0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
271f0 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20  sDigit(z[0]) ){ 
27200 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  z++; }.    }else
27210 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 28  {.      if( c!=(
27220 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72 6e  *(z++)) ) return
27230 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
27240 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
27250 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72  z) ){ z++; }.  r
27260 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
27270 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
27280 68 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 63  he string as a c
27290 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
272a0 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72 20 6f  on with either o
272b0 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69  ne or two.** ini
272c0 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61 63 74  tial "-" charact
272d0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
272e0 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63  nt optionMatch(c
272f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c  onst char *zStr,
27300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
27310 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30  t){.  if( zStr[0
27320 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]!='-' ) return 
27330 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69  0;.  zStr++;.  i
27340 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20  f( zStr[0]=='-' 
27350 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75  ) zStr++;.  retu
27360 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72 2c 20  rn strcmp(zStr, 
27370 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  zOpt)==0;.}../*.
27380 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65  ** Delete a file
27390 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65  ..*/.int shellDe
273a0 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63  leteFile(const c
273b0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
273c0 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65  .  int rc;.#ifde
273d0 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72  f _WIN32.  wchar
273e0 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  _t *z = sqlite3_
273f0 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
27400 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
27410 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e  ;.  rc = _wunlin
27420 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  k(z);.  sqlite3_
27430 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20  free(z);.#else. 
27440 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69   rc = unlink(zFi
27450 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
27460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27470 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c  /*.** Try to del
27480 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
27490 79 20 66 69 6c 65 20 28 69 66 20 74 68 65 72 65  y file (if there
274a0 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66 72 65   is one) and fre
274b0 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  e the.** memory 
274c0 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  used to hold the
274d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 6d   name of the tem
274e0 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  p file..*/.stati
274f0 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65 6d 70  c void clearTemp
27500 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20  File(ShellState 
27510 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54  *p){.  if( p->zT
27520 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  empFile==0 ) ret
27530 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f  urn;.  if( p->do
27540 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75 72 6e  XdgOpen ) return
27550 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44 65 6c  ;.  if( shellDel
27560 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70  eteFile(p->zTemp
27570 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  File) ) return;.
27580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27590 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
275a0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  p->zTempFile = 0
275b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
275c0 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66 69 6c  e a new temp fil
275d0 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  e name with the 
275e0 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f  given suffix..*/
275f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65 77  .static void new
27600 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74  TempFile(ShellSt
27610 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
27620 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20  ar *zSuffix){.  
27630 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29  clearTempFile(p)
27640 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
27650 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  (p->zTempFile);.
27660 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
27670 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20   0;.  if( p->db 
27680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
27690 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
276a0 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e  b, 0, SQLITE_FCN
276b0 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c  TL_TEMPFILENAME,
276c0 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b   &p->zTempFile);
276d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54  .  }.  if( p->zT
276e0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
276f0 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
27700 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   r;.    sqlite3_
27710 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
27720 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 70  f(r), &r);.    p
27730 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71  ->zTempFile = sq
27740 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74  lite3_mprintf("t
27750 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20  emp%llx.%s", r, 
27760 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  zSuffix);.  }els
27770 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46  e{.    p->zTempF
27780 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ile = sqlite3_mp
27790 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20 70  rintf("%z.%s", p
277a0 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75  ->zTempFile, zSu
277b0 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ffix);.  }.  if(
277c0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
277d0 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
277e0 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20  tf(stderr, "out 
277f0 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
27800 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
27810 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
27820 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27830 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  SQL scalar funct
27840 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  ion fkey_collate
27850 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a  _clause(), used.
27860 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74  ** by the ".lint
27870 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63   fkey-indexes" c
27880 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61  ommand. This sca
27890 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  lar function is 
278a0 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64  always.** called
278b0 20 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d   with four argum
278c0 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e  ents - the paren
278d0 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68  t table name, th
278e0 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20  e parent column 
278f0 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69  name,.** the chi
27900 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  ld table name an
27910 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75  d the child colu
27920 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  mn name..**.**  
27930 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
27940 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62  ause('parent-tab
27950 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c  ', 'parent-col',
27960 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63   'child-tab', 'c
27970 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a  hild-col').**.**
27980 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
27990 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f  e named tables o
279a0 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74  r columns do not
279b0 20 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e   exist, this fun
279c0 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
279d0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
279e0 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  . An empty strin
279f0 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  g is also return
27a00 65 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65  ed if both table
27a10 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  s.** and columns
27a20 20 65 78 69 73 74 20 62 75 74 20 68 61 76 65 20   exist but have 
27a30 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74  the same default
27a40 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
27a50 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62  nce. Or,.** if b
27a60 6f 74 68 20 65 78 69 73 74 20 62 75 74 20 74 68  oth exist but th
27a70 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
27a80 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72  ion sequences ar
27a90 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69  e different, thi
27aa0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
27ab0 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
27ac0 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65   " COLLATE <pare
27ad0 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20  nt-collation>", 
27ae0 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74  where.** <parent
27af0 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74  -collation> is t
27b00 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
27b10 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
27b20 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
27b30 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
27b40 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  id shellFkeyColl
27b50 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c  ateClause(.  sql
27b60 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
27b70 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
27b80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
27b90 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c  **apVal.){.  sql
27ba0 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
27bb0 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
27bc0 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f  ndle(pCtx);.  co
27bd0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
27be0 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
27bf0 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63  *zParentCol;.  c
27c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
27c10 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63  ntSeq;.  const c
27c20 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63  har *zChild;.  c
27c30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
27c40 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  dCol;.  const ch
27c50 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20  ar *zChildSeq = 
27c60 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  0;  /* Initializ
27c70 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65  e to avoid false
27c80 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e  -positive warnin
27c90 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  g */.  int rc;..
27ca0 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
27cb0 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d  4 );.  zParent =
27cc0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
27cd0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
27ce0 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50  (apVal[0]);.  zP
27cf0 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73  arentCol = (cons
27d00 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
27d10 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
27d20 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d  [1]);.  zChild =
27d30 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
27d40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
27d50 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43  (apVal[2]);.  zC
27d60 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  hildCol = (const
27d70 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
27d80 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
27d90 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  3]);..  sqlite3_
27da0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
27db0 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , "", -1, SQLITE
27dc0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d  _STATIC);.  rc =
27dd0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
27de0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
27df0 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22        db, "main"
27e00 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65  , zParent, zPare
27e10 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65  ntCol, 0, &zPare
27e20 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20  ntSeq, 0, 0, 0. 
27e30 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
27e40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
27e50 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
27e60 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
27e70 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  a(.        db, "
27e80 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a  main", zChild, z
27e90 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43  ChildCol, 0, &zC
27ea0 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30  hildSeq, 0, 0, 0
27eb0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
27ec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27ed0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
27ee0 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20  cmp(zParentSeq, 
27ef0 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20  zChildSeq) ){.  
27f00 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
27f10 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f  te3_mprintf(" CO
27f20 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65  LLATE %s", zPare
27f30 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69  ntSeq);.    sqli
27f40 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
27f50 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pCtx, z, -1, SQL
27f60 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
27f70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27f80 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (z);.  }.}.../*.
27f90 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
27fa0 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d  ation of dot-com
27fb0 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79  mand ".lint fkey
27fc0 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74  -indexes"..*/.st
27fd0 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65  atic int lintFke
27fe0 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c  yIndexes(.  Shel
27ff0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
28000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28010 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
28020 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
28030 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28050 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
28060 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
28070 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28080 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
280a0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
280b0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
280c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
280d0 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20  b = pState->db; 
280e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
280f0 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72  e handle to quer
28100 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a  y "main" db of *
28110 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  /.  FILE *out = 
28120 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20  pState->out;    
28130 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f      /* Stream to
28140 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72   write non-error
28150 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20   output to */.  
28160 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30  int bVerbose = 0
28170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28180 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69  /* If -verbose i
28190 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
281a0 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  nt bGroupByParen
281b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
281c0 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72  * If -groupbypar
281d0 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ent is present *
281e0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
28210 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b  e through azArg[
28220 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
28230 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b  r *zIndent = "";
28240 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
28250 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45  ch to indent CRE
28260 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a  ATE INDEX by */.
28270 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
282a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
282b0 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20  mt *pSql = 0;   
282c0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
282d0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  d version of SQL
282e0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77   statement below
282f0 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54   */..  /*.  ** T
28300 68 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  his SELECT state
28310 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65  ment returns one
28320 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f   row for each fo
28330 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
28340 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65  aint.  ** in the
28350 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d   schema of the m
28360 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68  ain database. Th
28370 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
28380 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30  are:.  **.  ** 0
28390 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e  . The text of an
283a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73   SQL statement s
283b0 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a  imilar to:.  **.
283c0 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41    **      "EXPLA
283d0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
283e0 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68 69 6c  LECT 1 FROM chil
283f0 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20 63 68  d_table WHERE ch
28400 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a  ild_key=?".  **.
28410 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53 45 4c    **    This SEL
28420 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ECT is similar t
28430 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 74  o the one that t
28440 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  he foreign keys 
28450 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
28460 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74 6f 20   **    needs to 
28470 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f  run internally o
28480 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20  n child tables. 
28490 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  If there is an i
284a0 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20  ndex that can.  
284b0 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20 74 6f  **    be used to
284c0 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71   optimize this q
284d0 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61  uery, then it ca
284e0 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62  n also be used b
284f0 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20  y the FK.  **   
28500 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28510 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45  to optimize DELE
28520 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  TE or UPDATE sta
28530 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  tements on the p
28540 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61  arent.  **    ta
28550 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31  ble..  **.  ** 1
28560 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e  . A GLOB pattern
28570 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71   suitable for sq
28580 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e  lite3_strglob().
28590 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74   If the plan out
285a0 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74  put by.  **    t
285b0 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
285c0 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61   PLAN command ma
285d0 74 63 68 65 73 20 74 68 69 73 20 70 61 74 74 65  tches this patte
285e0 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68  rn, then the sch
285f0 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74  ema.  **    cont
28600 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68  ains an index th
28610 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
28620 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71  o optimize the q
28630 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
28640 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c  2. Human readabl
28650 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63  e text that desc
28660 72 69 62 65 73 20 74 68 65 20 63 68 69 6c 64 20  ribes the child 
28670 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
28680 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  s. e.g..  **.  *
28690 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74  *       "child_t
286a0 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c  able(child_key1,
286b0 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20   child_key2)".  
286c0 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e  **.  ** 3. Human
286d0 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74   readable text t
286e0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
286f0 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61  e parent table a
28700 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
28710 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28720 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70   "parent_table(p
28730 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65  arent_key1, pare
28740 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20  nt_key2)".  **. 
28750 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52   ** 4. A full CR
28760 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
28770 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ment for an inde
28780 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  x that could be 
28790 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20  used to.  **    
287a0 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
287b0 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
287c0 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
287d0 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20  nt table. e.g.. 
287e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
287f0 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69  CREATE INDEX chi
28800 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b  ld_table_child_k
28810 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c  ey ON child_tabl
28820 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20  e(child_key)".  
28830 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e  **.  ** 5. The n
28840 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ame of the paren
28850 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t table..  **.  
28860 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76 61 6c  ** These six val
28870 75 65 73 20 61 72 65 20 75 73 65 64 20 62 79 20  ues are used by 
28880 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f  the C logic belo
28890 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  w to generate th
288a0 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20  e report..  */. 
288b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
288c0 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a  l =.  "SELECT ".
288d0 20 20 20 20 22 20 20 20 20 20 27 45 58 50 4c 41      "     'EXPLA
288e0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
288f0 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c  LECT 1 FROM ' ||
28900 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
28910 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20 20 20  | ' WHERE '".   
28920 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
28930 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65  cat(quote(s.name
28940 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74  ) || '.' || quot
28950 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27  e(f.[from]) || '
28960 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20  =?' ".    "  || 
28970 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
28980 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
28990 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41    f.[table], COA
289a0 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
289b0 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c  [name]), s.name,
289c0 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44   f.[from]),' AND
289d0 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20   ')".    ", ".  
289e0 20 20 22 20 20 20 20 20 27 53 45 41 52 43 48 20    "     'SEARCH 
289f0 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d  TABLE ' || s.nam
28a00 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56  e || ' USING COV
28a10 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a  ERING INDEX*('".
28a20 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
28a30 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20  concat('*=?', ' 
28a40 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20  AND ') || ')'". 
28a50 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
28a60 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27    s.name  || '('
28a70 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
28a80 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27  (f.[from],  ', '
28a90 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c  ) || ')'".    ",
28aa0 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b   ".    "     f.[
28ab0 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c  table] || '(' ||
28ac0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f   group_concat(CO
28ad0 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70  ALESCE(f.[to], p
28ae0 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27  .[name])) || ')'
28af0 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
28b00 20 20 20 20 20 27 43 52 45 41 54 45 20 49 4e 44       'CREATE IND
28b10 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  EX ' || quote(s.
28b20 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f  name ||'_'|| gro
28b30 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
28b40 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22  m], '_'))".    "
28b50 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71    || ' ON ' || q
28b60 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20  uote(s.name) || 
28b70 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  '('".    "  || g
28b80 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74  roup_concat(quot
28b90 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a  e(f.[from]) ||".
28ba0 20 20 20 20 22 20 20 20 20 20 20 20 20 66 6b 65      "        fke
28bb0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
28bc0 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  (".    "        
28bd0 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41    f.[table], COA
28be0 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
28bf0 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c  [name]), s.name,
28c00 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27   f.[from]), ', '
28c10 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b  )".    "  || ');
28c20 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
28c30 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
28c40 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69  ".    "FROM sqli
28c50 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20  te_master AS s, 
28c60 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b  pragma_foreign_k
28c70 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20  ey_list(s.name) 
28c80 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54  AS f ".    "LEFT
28c90 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62   JOIN pragma_tab
28ca0 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20  le_info AS p ON 
28cb0 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e  (pk-1=seq AND p.
28cc0 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22  arg=f.[table]) "
28cd0 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 73  .    "GROUP BY s
28ce0 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20  .name, f.id ".  
28cf0 20 20 22 4f 52 44 45 52 20 42 59 20 28 43 41 53    "ORDER BY (CAS
28d00 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e  E WHEN ? THEN f.
28d10 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e  [table] ELSE s.n
28d20 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20  ame END)".  ;.  
28d30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
28d40 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54  bIPK = "SEARCH T
28d50 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54  ABLE * USING INT
28d60 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
28d70 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20   (rowid=?)";..  
28d80 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b  for(i=2; i<nArg;
28d90 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
28da0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
28db0 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  g[i]);.    if( n
28dc0 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
28dd0 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73 65  rnicmp("-verbose
28de0 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d  ", azArg[i], n)=
28df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65 72  =0 ){.      bVer
28e00 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bose = 1;.    }.
28e10 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 31      else if( n>1
28e20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
28e30 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70 61  icmp("-groupbypa
28e40 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  rent", azArg[i],
28e50 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
28e60 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
28e70 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e   1;.      zInden
28e80 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20 20  t = "    ";.    
28e90 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
28ea0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
28eb0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20  err, "Usage: %s 
28ec0 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d  %s ?-verbose? ?-
28ed0 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e  groupbyparent?\n
28ee0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41  ",.          azA
28ef0 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a  rg[0], azArg[1].
28f00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
28f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
28f20 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
28f30 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65   /* Register the
28f40 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
28f50 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63 74  ause() SQL funct
28f60 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ion */.  rc = sq
28f70 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
28f80 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f  ction(db, "fkey_
28f90 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c  collate_clause",
28fa0 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   4, SQLITE_UTF8,
28fb0 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46  .      0, shellF
28fc0 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
28fd0 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20  , 0, 0.  );...  
28fe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28ff0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
29000 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
29010 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
29020 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pSql, 0);.  }.  
29030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29040 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
29050 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
29060 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  1, bGroupByParen
29070 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
29080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29090 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
290a0 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30   char *zPrev = 0
290b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c  ;.    while( SQL
290c0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
290d0 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
290e0 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 2d       int res = -
290f0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
29100 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20  _stmt *pExplain 
29110 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  = 0;.      const
29120 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28 63   char *zEQP = (c
29130 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
29140 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
29150 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  Sql, 0);.      c
29160 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
29170 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
29180 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
29190 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20  ext(pSql, 1);.  
291a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
291b0 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zFrom = (const c
291c0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
291d0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32  umn_text(pSql, 2
291e0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
291f0 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20 28  har *zTarget = (
29200 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
29210 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
29220 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20  pSql, 3);.      
29230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49 20  const char *zCI 
29240 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
29250 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
29260 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20  xt(pSql, 4);.   
29270 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29280 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20  Parent = (const 
29290 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
292a0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
292b0 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  5);..      rc = 
292c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
292d0 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c  v2(db, zEQP, -1,
292e0 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
292f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29300 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
29310 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
29320 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
29330 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b  tep(pExplain) ){
29340 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
29350 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f  har *zPlan = (co
29360 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
29370 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45  3_column_text(pE
29380 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20  xplain, 3);.    
29390 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20 20      res = (.    
293a0 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
293b0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c  ite3_strglob(zGl
293c0 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20  ob, zPlan).     
293d0 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69        || 0==sqli
293e0 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f  te3_strglob(zGlo
293f0 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  bIPK, zPlan).   
29400 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
29410 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29420 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
29430 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  lain);.      if(
29440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29450 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69   break;..      i
29460 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
29470 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29480 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69  tderr, "Error: i
29490 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b  nternal error");
294a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
294b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
294c0 20 20 20 20 20 69 66 28 20 62 47 72 6f 75 70 42       if( bGroupB
294d0 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20  yParent.        
294e0 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c 20  && (bVerbose || 
294f0 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  res==0).        
29500 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20  && (zPrev==0 || 
29510 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
29520 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29 29  zParent, zPrev))
29530 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
29540 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29550 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74  (out, "-- Parent
29560 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50   table %s\n", zP
29570 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
29580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29590 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20  Prev);.         
295a0 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33   zPrev = sqlite3
295b0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
295c0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
295d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
295e0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
295f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
29600 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25 73  ut, "%s%s --> %s
29610 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43  \n", zIndent, zC
29620 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20  I, zTarget);.   
29630 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
29640 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
29650 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29660 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78  out, "%s/* no ex
29670 74 72 61 20 69 6e 64 65 78 65 73 20 72 65 71 75  tra indexes requ
29680 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20 25  ired for %s -> %
29690 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
296a0 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20         zIndent, 
296b0 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20  zFrom, zTarget. 
296c0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
296d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
296e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
296f0 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20  free(zPrev);..  
29700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
29720 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29730 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
29740 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
29750 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71   }..    rc2 = sq
29760 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
29770 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
29780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
29790 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
297a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
297b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
297c0 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
297d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
297e0 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (db));.    }.  }
297f0 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
29800 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
29810 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
29820 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20  msg(db));.  }.. 
29830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29840 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
29850 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64  ion of ".lint" d
29860 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
29870 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f  tatic int lintDo
29880 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
29890 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
298a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
298b0 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
298c0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
298d0 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
298f0 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
29900 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
29910 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
29920 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29940 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
29950 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
29960 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e  .){.  int n;.  n
29970 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74   = (nArg>=2 ? st
29980 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
29990 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31   : 0);.  if( n<1
299a0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   || sqlite3_strn
299b0 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22  icmp(azArg[1], "
299c0 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e  fkey-indexes", n
299d0 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a  ) ) goto usage;.
299e0 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65    return lintFke
299f0 79 49 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c  yIndexes(pState,
29a00 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a   azArg, nArg);..
29a10 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72   usage:.  raw_pr
29a20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
29a30 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61  age %s sub-comma
29a40 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f  nd ?switches...?
29a50 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
29a60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29a70 65 72 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d  err, "Where sub-
29a80 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22  commands are:\n"
29a90 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  );.  raw_printf(
29aa0 73 74 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65  stderr, "    fke
29ab0 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20  y-indexes\n");. 
29ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29ad0 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  RROR;.}..#if !de
29ae0 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
29af0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 73  T_VIRTUALTABLE.s
29b00 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
29b10 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Prepare(.  sqlit
29b20 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
29b30 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pRc, .  const ch
29b40 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c  ar *zSql, .  sql
29b50 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
29b60 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20  mt.){.  *ppStmt 
29b70 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
29b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29b90 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29ba0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
29bb0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
29bc0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
29bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29be0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29bf0 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65  f(stderr, "sql e
29c00 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22  rror: %s (%d)\n"
29c10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
29c20 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
29c30 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
29c40 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  (db).      );.  
29c50 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
29c60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
29c70 2a 20 43 72 65 61 74 65 20 61 20 70 72 65 70 61  * Create a prepa
29c80 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 73  red statement us
29c90 69 6e 67 20 70 72 69 6e 74 66 2d 73 74 79 6c 65  ing printf-style
29ca0 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74   arguments for t
29cb0 68 65 20 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he SQL..**.** Th
29cc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f  is routine is co
29cd0 75 6c 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73  uld be marked "s
29ce0 74 61 74 69 63 22 2e 20 20 42 75 74 20 69 74 20  tatic".  But it 
29cf0 69 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73  is not always us
29d00 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67  ed,.** depending
29d10 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   on compile-time
29d20 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d   options.  By om
29d30 69 74 74 69 6e 67 20 74 68 65 20 22 73 74 61 74  itting the "stat
29d40 69 63 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a  ic", we avoid.**
29d50 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c   nuisance compil
29d60 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
29d70 74 20 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e  t "defined but n
29d80 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69  ot used"..*/.voi
29d90 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72  d shellPreparePr
29da0 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20  intf(.  sqlite3 
29db0 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
29dc0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
29dd0 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f  t **ppStmt,.  co
29de0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
29df0 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53  .  ....){.  *ppS
29e00 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  tmt = 0;.  if( *
29e10 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
29e20 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
29e30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ;.    char *z;. 
29e40 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
29e50 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
29e60 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
29e70 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  zFmt, ap);.    v
29e80 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69  a_end(ap);.    i
29e90 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
29ea0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
29eb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
29ec0 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70  .      shellPrep
29ed0 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20  are(db, pRc, z, 
29ee0 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73  ppStmt);.      s
29ef0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
29f00 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
29f10 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 70 72 65  Finalize the pre
29f20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
29f30 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 73 68  created using sh
29f40 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
29f50 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
29f60 6f 75 74 69 6e 65 20 69 73 20 63 6f 75 6c 64 20  outine is could 
29f70 62 65 20 6d 61 72 6b 65 64 20 22 73 74 61 74 69  be marked "stati
29f80 63 22 2e 20 20 42 75 74 20 69 74 20 69 73 20 6e  c".  But it is n
29f90 6f 74 20 61 6c 77 61 79 73 20 75 73 65 64 2c 0a  ot always used,.
29fa0 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
29fb0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
29fc0 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69 74 74 69  ions.  By omitti
29fd0 6e 67 20 74 68 65 20 22 73 74 61 74 69 63 22 2c  ng the "static",
29fe0 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 6e 75 69   we avoid.** nui
29ff0 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  sance compiler w
2a000 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 22 64  arnings about "d
2a010 65 66 69 6e 65 64 20 62 75 74 20 6e 6f 74 20 75  efined but not u
2a020 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73 68  sed"..*/.void sh
2a030 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69  ellFinalize(.  i
2a040 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
2a050 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
2a060 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ){.  if( pStmt )
2a070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
2a080 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  b = sqlite3_db_h
2a090 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20  andle(pStmt);.  
2a0a0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2a0b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2a0c0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  t);.    if( *pRc
2a0d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a0e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a0f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a100 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2a110 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
2a120 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2a130 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
2a140 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20     }.      *pRc 
2a150 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = rc;.    }.  }.
2a160 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 74 68 65 20  }../* Reset the 
2a170 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2a180 6e 74 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  nt created using
2a190 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2a1a0 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntf()..**.** Thi
2a1b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75  s routine is cou
2a1c0 6c 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74  ld be marked "st
2a1d0 61 74 69 63 22 2e 20 20 42 75 74 20 69 74 20 69  atic".  But it i
2a1e0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65  s not always use
2a1f0 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20  d,.** depending 
2a200 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  on compile-time 
2a210 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69  options.  By omi
2a220 74 74 69 6e 67 20 74 68 65 20 22 73 74 61 74 69  tting the "stati
2a230 63 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20  c", we avoid.** 
2a240 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
2a250 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
2a260 20 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f   "defined but no
2a270 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64  t used"..*/.void
2a280 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69   shellReset(.  i
2a290 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
2a2a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
2a2b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
2a2c0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
2a2d0 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t);.  if( *pRc==
2a2e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a2f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2a310 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
2a320 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
2a330 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
2a340 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
2a350 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
2a360 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
2a370 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  b));.    }.    *
2a380 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  pRc = rc;.  }.}.
2a390 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2a3a0 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed SQLITE_OMIT_V
2a3b0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2a3c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2a3d0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2a3e0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
2a3f0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
2a400 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  IB)./***********
2a410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a450 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e  ******.** The ".
2a460 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72  archive" or ".ar
2a470 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 2f 2a  " command..*/./*
2a480 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65  .** Structure re
2a490 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e  presenting a sin
2a4a0 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e  gle ".ar" comman
2a4b0 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  d..*/.typedef st
2a4c0 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41  ruct ArCommand A
2a4d0 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74  rCommand;.struct
2a4e0 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75   ArCommand {.  u
2a4f0 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  8 eCmd;         
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a510 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61  * An AR_CMD_* va
2a520 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72  lue */.  u8 bVer
2a530 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
2a540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a550 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f   if --verbose */
2a560 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20  .  u8 bZip;     
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2a590 65 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a  e archive is a Z
2a5a0 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52  IP */.  u8 bDryR
2a5b0 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  un;             
2a5c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a5d0 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a  if --dry-run */.
2a5e0 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20    u8 bAppend;   
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61    /* True if --a
2a610 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72  ppend */.  u8 fr
2a620 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20  omCmdLine;      
2a630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
2a640 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61  n from -A instea
2a650 64 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f  d of .archive */
2a660 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a690 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
2a6a0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72  s */.  char *zSr
2a6b0 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  cTable;         
2a6c0 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72         /* "sqlar
2a6d0 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c  ", "zipfile($fil
2a6e0 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a  e)" or "zip" */.
2a6f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2a700 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2a710 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75    /* --file argu
2a720 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
2a730 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a740 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dir;            
2a750 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72     /* --director
2a760 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  y argument, or N
2a770 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ULL */.  char **
2a780 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  azArg;          
2a790 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2a7a0 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  y of command arg
2a7b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c  uments */.  Shel
2a7c0 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20  lState *p;      
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2a7e0 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  hell state */.  
2a7f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a810 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
2a820 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69  aining the archi
2a830 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
2a840 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65  Print a usage me
2a850 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61  ssage for the .a
2a860 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64  r command to std
2a870 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53  err and return S
2a880 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
2a890 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61  static int arUsa
2a8a0 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73  ge(FILE *f){.  s
2a8b0 68 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69  howHelp(f,"archi
2a8c0 76 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ve");.  return S
2a8d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
2a8e0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
2a8f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
2a900 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
2a910 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
2a920 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
2a930 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69  _ERROR..*/.stati
2a940 63 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67  c int arErrorMsg
2a950 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c  (ArCommand *pAr,
2a960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
2a970 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2a980 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2a990 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2a9a0 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71   zFmt);.  z = sq
2a9b0 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2a9c0 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  Fmt, ap);.  va_e
2a9d0 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70  nd(ap);.  utf8_p
2a9e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2a9f0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  rror: %s\n", z);
2aa00 0a 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d  .  if( pAr->from
2aa10 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75  CmdLine ){.    u
2aa20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2aa30 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66  r, "Use \"-A\" f
2aa40 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
2aa50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
2aa60 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2aa70 72 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69  r, "Use \".archi
2aa80 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20  ve --help\" for 
2aa90 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20  more help\n");. 
2aaa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2aab0 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(z);.  return S
2aac0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
2aad0 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72  /*.** Values for
2aae0 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e   ArCommand.eCmd.
2aaf0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43  .*/.#define AR_C
2ab00 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20  MD_CREATE       
2ab10 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  1.#define AR_CMD
2ab20 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 32 0a  _UPDATE       2.
2ab30 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49  #define AR_CMD_I
2ab40 4e 53 45 52 54 20 20 20 20 20 20 20 33 0a 23 64  NSERT       3.#d
2ab50 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54  efine AR_CMD_EXT
2ab60 52 41 43 54 20 20 20 20 20 20 34 0a 23 64 65 66  RACT      4.#def
2ab70 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20  ine AR_CMD_LIST 
2ab80 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2ab90 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20  e AR_CMD_HELP   
2aba0 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f        6../*.** O
2abb0 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e  ther (non-comman
2abc0 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a  d) switches..*/.
2abd0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2abe0 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20 37 0a  H_VERBOSE     7.
2abf0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2ac00 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20 38 0a  H_FILE        8.
2ac10 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2ac20 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20 39 0a  H_DIRECTORY   9.
2ac30 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2ac40 48 5f 41 50 50 45 4e 44 20 20 20 20 20 31 30 0a  H_APPEND     10.
2ac50 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2ac60 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31 31 0a  H_DRYRUN     11.
2ac70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 72  .static int arPr
2ac80 6f 63 65 73 73 53 77 69 74 63 68 28 41 72 43 6f  ocessSwitch(ArCo
2ac90 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20  mmand *pAr, int 
2aca0 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63  eSwitch, const c
2acb0 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77  har *zArg){.  sw
2acc0 69 74 63 68 28 20 65 53 77 69 74 63 68 20 29 7b  itch( eSwitch ){
2acd0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
2ace0 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73  _CREATE:.    cas
2acf0 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
2ad00 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
2ad10 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65  D_LIST:.    case
2ad20 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a   AR_CMD_UPDATE:.
2ad30 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2ad40 49 4e 53 45 52 54 3a 0a 20 20 20 20 63 61 73 65  INSERT:.    case
2ad50 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
2ad60 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d      if( pAr->eCm
2ad70 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
2ad80 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2ad90 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f  Ar, "multiple co
2ada0 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b  mmand options");
2adb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2adc0 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74  Ar->eCmd = eSwit
2add0 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ch;.      break;
2ade0 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ..    case AR_SW
2adf0 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20  ITCH_DRYRUN:.   
2ae00 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20     pAr->bDryRun 
2ae10 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2ae20 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
2ae30 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20  ITCH_VERBOSE:.  
2ae40 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73      pAr->bVerbos
2ae50 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
2ae60 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
2ae70 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20  SWITCH_APPEND:. 
2ae80 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e       pAr->bAppen
2ae90 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
2aea0 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d  Fall thru into -
2aeb0 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  -file */.    cas
2aec0 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
2aed0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69  :.      pAr->zFi
2aee0 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  le = zArg;.     
2aef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2af00 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
2af10 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d  TORY:.      pAr-
2af20 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20  >zDir = zArg;.  
2af30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
2af40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2af50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  OK;.}../*.** Par
2af60 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  se the command l
2af70 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22  ine for an ".ar"
2af80 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65   command. The re
2af90 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
2afa0 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74  n into.** struct
2afb0 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49  ure (*pAr). SQLI
2afc0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2afd0 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d if the command
2afe0 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a   line is parsed.
2aff0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
2b000 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
2b010 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2b020 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72  ritten to stderr
2b030 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2b040 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a  ERROR returned..
2b050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2b060 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20  ParseCommand(.  
2b070 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
2b0a0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
2b0b0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
2b0c0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
2b0f0 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
2b100 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20   */.  ArCommand 
2b110 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20  *pAr            
2b120 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
2b130 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
2b140 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53  .){.  struct ArS
2b150 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73  witch {.    cons
2b160 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20  t char *zLong;. 
2b170 20 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a     char cShort;.
2b180 20 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a      u8 eSwitch;.
2b190 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d      u8 bArg;.  }
2b1a0 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20   aSwitch[] = {. 
2b1b0 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20     { "create",  
2b1c0 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52    'c', AR_CMD_CR
2b1d0 45 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  EATE,       0 },
2b1e0 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22  .    { "extract"
2b1f0 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f  ,   'x', AR_CMD_
2b200 45 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20  EXTRACT,      0 
2b210 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73 65 72 74  },.    { "insert
2b220 22 2c 20 20 20 20 27 69 27 2c 20 41 52 5f 43 4d  ",    'i', AR_CM
2b230 44 5f 49 4e 53 45 52 54 2c 20 20 20 20 20 20 20  D_INSERT,       
2b240 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74  0 },.    { "list
2b250 22 2c 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f  ",      't', AR_
2b260 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20  CMD_LIST,       
2b270 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70    0 },.    { "up
2b280 64 61 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41  date",    'u', A
2b290 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20  R_CMD_UPDATE,   
2b2a0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2b2b0 68 65 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c  help",      'h',
2b2c0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20   AR_CMD_HELP,   
2b2d0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2b2e0 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76   "verbose",   'v
2b2f0 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  ', AR_SWITCH_VER
2b300 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20  BOSE,   0 },.   
2b310 20 7b 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20   { "file",      
2b320 27 66 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46  'f', AR_SWITCH_F
2b330 49 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20  ILE,      1 },. 
2b340 20 20 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20     { "append",  
2b350 20 20 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48    'a', AR_SWITCH
2b360 5f 41 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c  _APPEND,    1 },
2b370 0a 20 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72  .    { "director
2b380 79 22 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54  y", 'C', AR_SWIT
2b390 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20  CH_DIRECTORY, 1 
2b3a0 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e  },.    { "dryrun
2b3b0 22 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57  ",    'n', AR_SW
2b3c0 49 54 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20  ITCH_DRYRUN,    
2b3d0 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0 },.  };.  int 
2b3e0 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66  nSwitch = sizeof
2b3f0 28 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65  (aSwitch) / size
2b400 6f 66 28 73 74 72 75 63 74 20 41 72 53 77 69 74  of(struct ArSwit
2b410 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72  ch);.  struct Ar
2b420 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26  Switch *pEnd = &
2b430 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d  aSwitch[nSwitch]
2b440 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31  ;..  if( nArg<=1
2b450 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
2b460 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f  ntf(stderr, "Wro
2b470 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
2b480 75 6d 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c  uments.  Usage:\
2b490 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
2b4a0 61 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b  arUsage(stderr);
2b4b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
2b4c0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d  ar *z = azArg[1]
2b4d0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d  ;.    if( z[0]!=
2b4e0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '-' ){.      /* 
2b4f0 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c  Traditional styl
2b500 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69  e [tar] invocati
2b510 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
2b520 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72  i;.      int iAr
2b530 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72  g = 2;.      for
2b540 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
2b550 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2b560 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
2b570 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2b580 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20  rSwitch *pOpt;. 
2b590 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
2b5a0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
2b5b0 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
2b5c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2b5d0 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72  [i]==pOpt->cShor
2b5e0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
2b5f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2b600 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20   pOpt==pEnd ){. 
2b610 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b620 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2b630 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
2b640 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29  tion: %c", z[i])
2b650 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b660 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41      if( pOpt->bA
2b670 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
2b680 69 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29  if( iArg>=nArg )
2b690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2b6a0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2b6b0 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71  pAr, "option req
2b6c0 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
2b6d0 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20  t: %c",z[i]);.  
2b6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b6f0 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
2b700 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20  [iArg++];.      
2b710 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2b720 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
2b730 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74  pAr, pOpt->eSwit
2b740 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
2b750 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2b760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b770 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d  Ar->nArg = nArg-
2b780 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  iArg;.      if( 
2b790 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20  pAr->nArg>0 ){. 
2b7a0 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2b7b0 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d  g = &azArg[iArg]
2b7c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2b7d0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  lse{.      /* No
2b7e0 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e  n-traditional in
2b7f0 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  vocation */.    
2b800 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20    int iArg;.    
2b810 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41    for(iArg=1; iA
2b820 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29  rg<nArg; iArg++)
2b830 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
2b840 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41  .        z = azA
2b850 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
2b860 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
2b870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2b880 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  All remaining co
2b890 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
2b8a0 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67   are command arg
2b8b0 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20  uments. */.     
2b8c0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
2b8d0 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
2b8e0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
2b8f0 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b  Arg = nArg-iArg;
2b900 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2b910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b920 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
2b930 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  (z);..        if
2b940 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[1]!='-' ){. 
2b950 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
2b960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2b970 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f   or more short o
2b980 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ptions */.      
2b990 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2b9a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2b9b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b9c0 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  zArg = 0;.      
2b9d0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2b9e0 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20  witch *pOpt;.   
2b9f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70           for(pOp
2ba00 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
2ba10 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
2ba20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ba30 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d   if( z[i]==pOpt-
2ba40 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b  >cShort ) break;
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ba60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2ba70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Opt==pEnd ){.   
2ba80 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2ba90 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2baa0 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
2bab0 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69  option: %c", z[i
2bac0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2bad0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2bae0 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a  ( pOpt->bArg ){.
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2bb00 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20  ( i<(n-1) ){.   
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72               zAr
2bb20 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20  g = &z[i+1];.   
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d               i =
2bb40 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
2bb50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bb60 20 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72           if( iAr
2bb70 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20  g>=(nArg-1) ){. 
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb90 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2bba0 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
2bbb0 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
2bbc0 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b  ment: %c",z[i]);
2bbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bbe0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2bbf0 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
2bc00 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
2bc10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bc30 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
2bc40 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74  Switch(pAr, pOpt
2bc50 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
2bc60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2bc70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2bc80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2bc90 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27  e if( z[2]=='\0'
2bca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bcb0 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e   A -- option, in
2bcc0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c  dicating that al
2bcd0 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
2bce0 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20  and line words. 
2bcf0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
2bd00 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
2bd10 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2bd20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
2bd30 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20  zArg[iArg+1];.  
2bd40 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
2bd50 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b  g = nArg-iArg-1;
2bd60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bd70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2bd80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2bd90 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  long option */. 
2bda0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2bdb0 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20  har *zArg = 0;  
2bdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
2bdd0 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f  gument for optio
2bde0 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20  n, if any */.   
2bdf0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
2be00 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d  Switch *pMatch =
2be10 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63   0;      /* Matc
2be20 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  hing option */. 
2be30 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2be40 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20  ArSwitch *pOpt; 
2be50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2be60 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
2be70 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
2be80 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
2be90 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
2bea0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2beb0 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f  char *zLong = pO
2bec0 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20  pt->zLong;.     
2bed0 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29         if( (n-2)
2bee0 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67  <=strlen30(zLong
2bef0 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26  ) && 0==memcmp(&
2bf00 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32  z[2], zLong, n-2
2bf10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2bf20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b     if( pMatch ){
2bf30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf40 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2bf50 73 67 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f  sg(pAr, "ambiguo
2bf60 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a  us option: %s",z
2bf70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2bf80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bf90 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2bfa0 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20   pOpt;.         
2bfb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bfc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2bfd0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
2bfe0 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20  pMatch==0 ){.   
2bff0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c000 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2c010 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
2c020 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  tion: %s", z);. 
2c030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c040 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d       if( pMatch-
2c050 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
2c060 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28       if( iArg>=(
2c070 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
2c080 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c090 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2c0a0 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
2c0b0 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73   an argument: %s
2c0c0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
2c0d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c0e0 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b   zArg = azArg[++
2c0f0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
2c100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2c110 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68   arProcessSwitch
2c120 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53  (pAr, pMatch->eS
2c130 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72  witch, zArg) ) r
2c140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2c150 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
2c160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c170 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c180 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2c190 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
2c1a0 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67  mes that all arg
2c1b0 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68  uments within th
2c1c0 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72  e ArCommand.azAr
2c1d0 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66  g[].** array ref
2c1e0 65 72 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65  er to archive me
2c1f0 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68  mbers, as for th
2c200 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d  e --extract or -
2c210 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20  -list commands. 
2c220 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68  .** It checks th
2c230 61 74 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20  at each of them 
2c240 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20  are present. If 
2c250 61 6e 79 20 73 70 65 63 69 66 69 65 64 20 66 69  any specified fi
2c260 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65  le is not.** pre
2c270 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68  sent in the arch
2c280 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  ive, an error is
2c290 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65   printed to stde
2c2a0 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a  rr and an error.
2c2b0 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  ** code returned
2c2c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2c2d0 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20 61 72  all specified ar
2c2e0 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73  guments are pres
2c2f0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  ent in.** the ar
2c300 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  chive, SQLITE_OK
2c310 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2c320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2c330 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74 72 61  n strips any tra
2c340 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63  iling '/' charac
2c350 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61  ters from each a
2c360 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  rgument..** This
2c370 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77   is consistent w
2c380 69 74 68 20 74 68 65 20 77 61 79 20 74 68 65 20  ith the way the 
2c390 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65  [tar] command se
2c3a0 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a  ems to work on.*
2c3b0 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74  * Linux..*/.stat
2c3c0 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e  ic int arCheckEn
2c3d0 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20  tries(ArCommand 
2c3e0 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pAr){.  int rc 
2c3f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2c400 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a  f( pAr->nArg ){.
2c410 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
2c420 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2c430 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pTest = 0;..    
2c440 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
2c450 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  tf(pAr->db, &rc,
2c460 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20   &pTest,.       
2c470 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
2c480 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65  OM %s WHERE name
2c490 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20  =$name", .      
2c4a0 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65    pAr->zSrcTable
2c4b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20  .    );.    j = 
2c4c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2c4d0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65  ameter_index(pTe
2c4e0 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20  st, "$name");.  
2c4f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
2c500 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51  ->nArg && rc==SQ
2c510 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
2c520 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70       char *z = p
2c530 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  Ar->azArg[i];.  
2c540 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
2c550 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
2c560 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20  nt bOk = 0;.    
2c570 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
2c580 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d  z[n-1]=='/' ) n-
2c590 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  -;.      z[n] = 
2c5a0 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69  '\0';.      sqli
2c5b0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
2c5c0 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53  est, j, z, -1, S
2c5d0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
2c5e0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
2c5f0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2c600 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20  p(pTest) ){.    
2c610 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20      bOk = 1;.   
2c620 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c     }.      shell
2c630 52 65 73 65 74 28 26 72 63 2c 20 70 54 65 73 74  Reset(&rc, pTest
2c640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2c650 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
2c660 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2c670 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2c680 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69  rr, "not found i
2c690 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22  n archive: %s\n"
2c6a0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
2c6b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2c6c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c6d0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
2c6e0 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20  (&rc, pTest);.  
2c6f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c700 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61  ../*.** Format a
2c710 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2c720 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  at can be used a
2c730 67 61 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61  gainst the "sqla
2c740 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69  r" table to.** i
2c750 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68  dentify all arch
2c760 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ive members that
2c770 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61   match the comma
2c780 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c  nd arguments hel
2c790 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20  d.** in (*pAr). 
2c7a0 4c 65 61 76 65 20 74 68 69 73 20 57 48 45 52 45  Leave this WHERE
2c7b0 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57   clause in (*pzW
2c7c0 68 65 72 65 29 20 62 65 66 6f 72 65 20 72 65 74  here) before ret
2c7d0 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63  urning..** The c
2c7e0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
2c7f0 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61  ible for eventua
2c800 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  lly calling sqli
2c810 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a  te3_free() on.**
2c820 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a   any non-NULL (*
2c830 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a  pzWhere) value..
2c840 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2c850 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20  rWhereClause(.  
2c860 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43  int *pRc, .  ArC
2c870 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20  ommand *pAr, .  
2c880 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20  char **pzWhere  
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52  /* OUT: New WHER
2c8b0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20  E clause */.){. 
2c8c0 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
2c8d0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
2c8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c8f0 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30  if( pAr->nArg==0
2c900 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65   ){.      zWhere
2c910 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2c920 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c  tf("1");.    }el
2c930 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
2c940 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c950 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
2c960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2c970 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  Ar->nArg; i++){.
2c980 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2c990 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41  ar *z = pAr->azA
2c9a0 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a  rg[i];.        z
2c9b0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  Where = sqlite3_
2c9c0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2c9d0 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20     "%z%s name = 
2c9e0 27 25 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e  '%q' OR substr(n
2c9f0 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f  ame,1,%d) = '%q/
2ca00 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a  '", .          z
2ca10 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20  Where, zSep, z, 
2ca20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a  strlen30(z)+1, z
2ca30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2ca40 20 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d      if( zWhere==
2ca50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
2ca60 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
2ca70 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  EM;.          br
2ca80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2ca90 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
2caa0 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OR ";.      }.  
2cab0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65    }.  }.  *pzWhe
2cac0 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a  re = zWhere;.}..
2cad0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2cae0 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73  tion of .ar "lis
2caf0 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  T" command. .*/.
2cb00 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73  static int arLis
2cb10 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61  tCommand(ArComma
2cb20 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73  nd *pAr){.  cons
2cb30 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22  t char *zSql = "
2cb40 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25  SELECT %s FROM %
2cb50 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20  s WHERE %s"; .  
2cb60 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f  const char *azCo
2cb70 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61  ls[] = {.    "na
2cb80 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65  me",.    "lsmode
2cb90 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65  (mode), sz, date
2cba0 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69  time(mtime, 'uni
2cbb0 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a  xepoch'), name".
2cbc0 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57    };..  char *zW
2cbd0 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  here = 0;.  sqli
2cbe0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
2cbf0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
2cc00 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74   rc = arCheckEnt
2cc10 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57  ries(pAr);.  arW
2cc20 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20  hereClause(&rc, 
2cc30 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a  pAr, &zWhere);..
2cc40 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2cc50 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2cc60 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20  c, &pSql, zSql, 
2cc70 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72  azCols[pAr->bVer
2cc80 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  bose],.         
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 2d              pAr-
2cca0 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65  >zSrcTable, zWhe
2ccb0 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e  re);.  if( pAr->
2ccc0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
2ccd0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2cce0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
2ccf0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
2cd00 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2cd10 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2cd20 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
2cd30 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2cd40 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  p(pSql) ){.     
2cd50 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f   if( pAr->bVerbo
2cd60 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  se ){.        ut
2cd70 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2cd80 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64  ->out, "%s % 10d
2cd90 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20    %s  %s\n",.   
2cda0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cdb0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
2cdc0 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  l, 0),.         
2cdd0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
2cde0 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20  n_int(pSql, 1), 
2cdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2ce00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2ce10 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20  (pSql, 2),.     
2ce20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2ce30 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2ce40 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   3).        );. 
2ce50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ce60 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ce70 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2ce80 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
2ce90 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
2cea0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2ceb0 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e  }.  }.  shellFin
2cec0 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29  alize(&rc, pSql)
2ced0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2cee0 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75  (zWhere);.  retu
2cef0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2cf00 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2cf10 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63 74 22  of .ar "eXtract"
2cf20 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
2cf30 61 74 69 63 20 69 6e 74 20 61 72 45 78 74 72 61  atic int arExtra
2cf40 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d  ctCommand(ArComm
2cf50 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e  and *pAr){.  con
2cf60 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d  st char *zSql1 =
2cf70 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a   .    "SELECT ".
2cf80 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e      " ($dir || n
2cf90 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69  ame),".    " wri
2cfa0 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20  tefile(($dir || 
2cfb0 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c  name), %s, mode,
2cfc0 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46   mtime) ".    "F
2cfd0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28 25 73  ROM %s WHERE (%s
2cfe0 29 20 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e  ) AND (data IS N
2cff0 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20  ULL OR $dirOnly 
2d000 3d 20 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20  = 0)".    " AND 
2d010 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a  name NOT GLOB '*
2d020 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63  ..[/\\]*'";..  c
2d030 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74  onst char *azExt
2d040 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20  raArg[] = { .   
2d050 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65   "sqlar_uncompre
2d060 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20  ss(data, sz)",. 
2d070 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a     "data".  };..
2d080 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d090 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pSql = 0;.  int 
2d0a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d0b0 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30    char *zDir = 0
2d0c0 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  ;.  char *zWhere
2d0d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
2d0e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2d0f0 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69  ents are specifi
2d100 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ed, check that t
2d110 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69  hey actually exi
2d120 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74  st within.  ** t
2d130 68 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72  he archive befor
2d140 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e  e proceeding. An
2d150 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48  d formulate a WH
2d160 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20  ERE clause to.  
2d170 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20  ** match them.  
2d180 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63  */.  rc = arChec
2d190 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20  kEntries(pAr);. 
2d1a0 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26   arWhereClause(&
2d1b0 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65  rc, pAr, &zWhere
2d1c0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2d1d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2d1e0 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a  f( pAr->zDir ){.
2d1f0 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c        zDir = sql
2d200 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
2d210 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a  /", pAr->zDir);.
2d220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d230 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f   zDir = sqlite3_
2d240 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20  mprintf("");.   
2d250 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d   }.    if( zDir=
2d260 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
2d270 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73  _NOMEM;.  }..  s
2d280 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2d290 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2d2a0 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20  &pSql, zSql1, . 
2d2b0 20 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b       azExtraArg[
2d2c0 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d  pAr->bZip], pAr-
2d2d0 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65  >zSrcTable, zWhe
2d2e0 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72  re.  );..  if( r
2d2f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d300 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
2d310 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2d320 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72  ndex(pSql, "$dir
2d330 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
2d340 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20  bind_text(pSql, 
2d350 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c  j, zDir, -1, SQL
2d360 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20  ITE_STATIC);..  
2d370 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c    /* Run the SEL
2d380 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77  ECT statement tw
2d390 69 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  ice. The first t
2d3a0 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29  ime, writefile()
2d3b0 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a   is called.    *
2d3c0 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76  * for all archiv
2d3d0 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73  e members that s
2d3e0 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74  hould be extract
2d3f0 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74  ed. The second t
2d400 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79  ime,.    ** only
2d410 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f   for the directo
2d420 72 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65  ries. This is be
2d430 63 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74  cause the timest
2d440 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  amps for.    ** 
2d450 65 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74  extracted direct
2d460 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65  ories must be re
2d470 73 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61  set after they a
2d480 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73  re populated (as
2d490 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69  .    ** populati
2d4a0 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20  ng them changes 
2d4b0 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20  the timestamp). 
2d4c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
2d4d0 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
2d4e0 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
2d4f0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
2d500 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e  ex(pSql, "$dirOn
2d510 6c 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ly");.      sqli
2d520 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71  te3_bind_int(pSq
2d530 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20  l, j, i);.      
2d540 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e  if( pAr->bDryRun
2d550 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2d560 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
2d570 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
2d580 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b  ite3_sql(pSql));
2d590 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d5a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
2d5b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
2d5c0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2d5d0 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a  3_step(pSql) ){.
2d5e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d            if( i=
2d5f0 3d 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62  =0 && pAr->bVerb
2d600 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
2d610 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2d620 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2d630 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
2d640 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
2d650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d670 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
2d680 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20  t(&rc, pSql);.  
2d690 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
2d6a0 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29  alize(&rc, pSql)
2d6b0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2d6c0 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73  _free(zDir);.  s
2d6d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
2d6e0 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  re);.  return rc
2d6f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
2d700 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
2d710 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66   in zSql.  Or if
2d720 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75   doing a --dryru
2d730 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20  n, merely print 
2d740 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  it out..*/.stati
2d750 63 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28  c int arExecSql(
2d760 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
2d770 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2d780 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2d790 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
2d7a0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
2d7b0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2d7c0 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20  "%s\n", zSql);. 
2d7d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d7e0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2d7f0 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2d800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d810 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a  _exec(pAr->db, z
2d820 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
2d830 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20  );.    if( zErr 
2d840 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2d850 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52  intf(stdout, "ER
2d860 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ROR: %s\n", zErr
2d870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d880 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
2d890 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2d8a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
2d8b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2d8c0 2e 61 72 20 22 63 72 65 61 74 65 22 2c 20 22 69  .ar "create", "i
2d8d0 6e 73 65 72 74 22 2c 20 61 6e 64 20 22 75 70 64  nsert", and "upd
2d8e0 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a  ate" commands..*
2d8f0 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61 74 65 20  *.**     create 
2d900 20 20 20 2d 3e 20 20 20 20 20 43 72 65 61 74 65     ->     Create
2d910 20 61 20 6e 65 77 20 53 51 4c 20 61 72 63 68 69   a new SQL archi
2d920 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65 72 74  ve.**     insert
2d930 20 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72      ->     Inser
2d940 74 20 6f 72 20 72 65 69 6e 73 65 72 74 20 61 6c  t or reinsert al
2d950 6c 20 66 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a  l files listed.*
2d960 2a 20 20 20 20 20 75 70 64 61 74 65 20 20 20 20  *     update    
2d970 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20 66 69  ->     Insert fi
2d980 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 63 68  les that have ch
2d990 61 6e 67 65 64 20 6f 72 20 74 68 61 74 20 77 65  anged or that we
2d9a0 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  re not.**       
2d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d9c0 72 65 76 69 6f 75 73 6c 79 20 69 6e 20 74 68 65  reviously in the
2d9d0 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43   archive.**.** C
2d9e0 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72  reate the "sqlar
2d9f0 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  " table in the d
2da00 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f  atabase if it do
2da10 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
2da20 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64  xist..** Then ad
2da30 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74  d each file in t
2da40 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61  he azFile[] arra
2da50 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65  y to the archive
2da60 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a  . Directories.**
2da70 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72   are added recur
2da80 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d  sively. If argum
2da90 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20  ent bVerbose is 
2daa0 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73  non-zero, a mess
2dab0 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65  age is.** printe
2dac0 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20  d on stdout for 
2dad0 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76  each file archiv
2dae0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72  ed..**.** The cr
2daf0 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20  eate command is 
2db00 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64 61  the same as upda
2db10 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  te, except that 
2db20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20  it drops.** any 
2db30 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22  existing "sqlar"
2db40 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65   table before be
2db50 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20 22 69  ginning.  The "i
2db60 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a  nsert" command.*
2db70 2a 20 61 6c 77 61 79 73 20 6f 76 65 72 77 72 69  * always overwri
2db80 74 65 73 20 65 76 65 72 79 20 66 69 6c 65 20 6e  tes every file n
2db90 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
2dba0 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20  and-line, where 
2dbb0 61 73 0a 2a 2a 20 22 75 70 64 61 74 65 22 20 6f  as.** "update" o
2dbc0 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 69  nly overwrites i
2dbd0 66 20 74 68 65 20 73 69 7a 65 20 6f 72 20 6d 74  f the size or mt
2dbe0 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61 73 20  ime or mode has 
2dbf0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
2dc00 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f  ic int arCreateO
2dc10 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a  rUpdateCommand(.
2dc20 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
2dc30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dc40 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2dc50 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f  uments and optio
2dc60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64  ns */.  int bUpd
2dc70 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
2dc80 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20          /* true 
2dc90 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20  for a --create. 
2dca0 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66  */.  int bOnlyIf
2dcb0 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20 20  Changed         
2dcc0 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64       /* Only upd
2dcd0 61 74 65 20 69 66 20 66 69 6c 65 20 68 61 73 20  ate if file has 
2dce0 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20  changed */.){.  
2dcf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65  const char *zCre
2dd00 61 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52  ate = .      "CR
2dd10 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2dd20 54 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c  T EXISTS sqlar(\
2dd30 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65  n".      "  name
2dd40 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
2dd50 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74  Y,  -- name of t
2dd60 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20  he file\n".     
2dd70 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20   "  mode INT,   
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61              -- a
2dd90 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
2dda0 73 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74  s\n".      "  mt
2ddb0 69 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20  ime INT,        
2ddc0 20 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f        -- last mo
2ddd0 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c  dification time\
2dde0 6e 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49  n".      "  sz I
2ddf0 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
2de00 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20      -- original 
2de10 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20  file size\n".   
2de20 20 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20     "  data BLOB 
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2de40 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74   compressed cont
2de50 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22  ent\n".      ")"
2de60 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2de70 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41  zDrop = "DROP TA
2de80 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71  BLE IF EXISTS sq
2de90 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lar";.  const ch
2dea0 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32  ar *zInsertFmt[2
2deb0 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c  ] = {.     "REPL
2dec0 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65  ACE INTO %s(name
2ded0 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64  ,mode,mtime,sz,d
2dee0 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  ata)\n".     "  
2def0 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22  SELECT\n".     "
2df00 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20      %s,\n".     
2df10 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20  "    mode,\n".  
2df20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e     "    mtime,\n
2df30 22 0a 20 20 20 20 20 22 20 20 20 20 43 41 53 45  ".     "    CASE
2df40 20 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d   substr(lsmode(m
2df50 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20  ode),1,1)\n".   
2df60 20 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d    "      WHEN '-
2df70 27 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61  ' THEN length(da
2df80 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ta)\n".     "   
2df90 20 20 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e     WHEN 'd' THEN
2dfa0 20 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20   0\n".     "    
2dfb0 20 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e    ELSE -1 END,\n
2dfc0 22 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c 61  ".     "    sqla
2dfd0 72 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29  r_compress(data)
2dfe0 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d  \n".     "  FROM
2dff0 20 66 73 64 69 72 28 25 51 2c 25 51 29 20 41 53   fsdir(%Q,%Q) AS
2e000 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20   disk\n".     " 
2e010 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f   WHERE lsmode(mo
2e020 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25  de) NOT LIKE '?%
2e030 25 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20  %'%s;".     ,.  
2e040 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
2e050 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74   %s(name,mode,mt
2e060 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20  ime,data)\n".   
2e070 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20    "  SELECT\n". 
2e080 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a      "    %s,\n".
2e090 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c       "    mode,\
2e0a0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69  n".     "    mti
2e0b0 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  me,\n".     "   
2e0c0 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20   data\n".     " 
2e0d0 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25   FROM fsdir(%Q,%
2e0e0 51 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20  Q) AS disk\n".  
2e0f0 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f     "  WHERE lsmo
2e100 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b  de(mode) NOT LIK
2e110 45 20 27 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b  E '?%%'%s;".  };
2e120 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e140 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
2e150 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69  ing through azFi
2e160 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  le[] */.  int rc
2e170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e190 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  urn code */.  co
2e1a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
2e1b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2e1c0 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20   SQL table into 
2e1d0 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20  which to insert 
2e1e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  */.  char *zSql;
2e1f0 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30  .  char zTemp[50
2e200 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 69 73  ];.  char *zExis
2e210 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65  ts = 0;..  arExe
2e220 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d  cSql(pAr, "PRAGM
2e230 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22  A page_size=512"
2e240 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63  );.  rc = arExec
2e250 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f  Sql(pAr, "SAVEPO
2e260 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28  INT ar;");.  if(
2e270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54   return rc;.  zT
2e290 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69  emp[0] = 0; .  i
2e2a0 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a  f( pAr->bZip ){.
2e2b0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
2e2c0 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69  e the zipfile vi
2e2d0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20  rtual table, if 
2e2e0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
2e2f0 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20   if( pAr->zFile 
2e300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e310 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20  _uint64 r;.     
2e320 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2e330 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72  ess(sizeof(r),&r
2e340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e350 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2e360 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a  (zTemp),zTemp,"z
2e370 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20  ip%016llx",r);. 
2e380 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d       zTab = zTem
2e390 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  p;.      zSql = 
2e3a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2e3b0 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
2e3c0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2e3d0 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69  temp.%s USING zi
2e3e0 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20  pfile(%Q)",.    
2e3f0 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e       zTab, pAr->
2e400 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  zFile.      );. 
2e410 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63       rc = arExec
2e420 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a  Sql(pAr, zSql);.
2e430 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e440 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65  ee(zSql);.    }e
2e450 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20  lse{.      zTab 
2e460 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20  = "zip";.    }. 
2e470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2e480 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
2e490 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52  ble for an SQLAR
2e4a0 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22   */.    zTab = "
2e4b0 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20  sqlar";.    if( 
2e4c0 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20  bUpdate==0 ){.  
2e4d0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2e4e0 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a  ql(pAr, zDrop);.
2e4f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e500 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
2e510 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
2e520 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  n;.    }.    rc 
2e530 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2e540 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20   zCreate);.  }. 
2e550 20 69 66 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e   if( bOnlyIfChan
2e560 67 65 64 20 29 7b 0a 20 20 20 20 7a 45 78 69 73  ged ){.    zExis
2e570 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ts = sqlite3_mpr
2e580 69 6e 74 66 28 0a 20 20 20 20 20 20 22 20 41 4e  intf(.      " AN
2e590 44 20 4e 4f 54 20 45 58 49 53 54 53 28 22 0a 20  D NOT EXISTS(". 
2e5a0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2e5b0 20 31 20 46 52 4f 4d 20 25 73 20 41 53 20 6d 65   1 FROM %s AS me
2e5c0 6d 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  m".          " W
2e5d0 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69  HERE mem.name=di
2e5e0 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20 20 20  sk.name".       
2e5f0 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69     " AND mem.mti
2e600 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20  me=disk.mtime". 
2e610 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6d           " AND m
2e620 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64  em.mode=disk.mod
2e630 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65  e)", zTab);.  }e
2e640 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69 73 74 73  lse{.    zExists
2e650 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e660 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66  tf("");.  }.  if
2e670 28 20 7a 45 78 69 73 74 73 3d 3d 30 20 29 20 72  ( zExists==0 ) r
2e680 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2e690 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2e6a0 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
2e6b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
2e6c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 32  .    char *zSql2
2e6d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e6e0 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41  tf(zInsertFmt[pA
2e6f0 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a  r->bZip], zTab,.
2e700 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65          pAr->bVe
2e710 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70  rbose ? "shell_p
2e720 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22  utsnl(name)" : "
2e730 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 70  name",.        p
2e740 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41  Ar->azArg[i], pA
2e750 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73 74 73  r->zDir, zExists
2e760 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78  );.    rc = arEx
2e770 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32  ecSql(pAr, zSql2
2e780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2e790 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a  ree(zSql2);.  }.
2e7a0 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69  end_ar_transacti
2e7b0 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  on:.  if( rc!=SQ
2e7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2e7d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
2e7e0 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54  >db, "ROLLBACK T
2e7f0 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72  O ar; RELEASE ar
2e800 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
2e810 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2e820 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
2e830 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20  RELEASE ar;");. 
2e840 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70     if( pAr->bZip
2e850 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29   && pAr->zFile )
2e860 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
2e870 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2e880 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20  DROP TABLE %s", 
2e890 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72  zTemp);.      ar
2e8a0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
2e8b0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
2e8c0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2e8d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2e8e0 33 5f 66 72 65 65 28 7a 45 78 69 73 74 73 29 3b  3_free(zExists);
2e8f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e900 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2e910 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
2e920 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
2e930 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
2e940 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
2e950 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
2e960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2e970 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
2e980 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66  state */.  int f
2e990 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20  romCmdLine,     
2e9a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e9b0 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64  ue if -A command
2e9c0 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f  -line option, no
2e9d0 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63  t .ar cmd */.  c
2e9e0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea00 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
2ea10 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
2ea20 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
2ea30 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2ea60 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
2ea70 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e  */.){.  ArComman
2ea80 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b  d cmd;.  int rc;
2ea90 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20  .  memset(&cmd, 
2eaa0 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b  0, sizeof(cmd));
2eab0 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69  .  cmd.fromCmdLi
2eac0 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65  ne = fromCmdLine
2ead0 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73 65  ;.  rc = arParse
2eae0 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e  Command(azArg, n
2eaf0 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66  Arg, &cmd);.  if
2eb00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2eb10 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54 79  ){.    int eDbTy
2eb20 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  pe = SHELL_OPEN_
2eb30 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e  UNSPEC;.    cmd.
2eb40 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20  p = pState;.    
2eb50 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d  cmd.db = pState-
2eb60 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d 64  >db;.    if( cmd
2eb70 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
2eb80 65 44 62 54 79 70 65 20 3d 20 64 65 64 75 63 65  eDbType = deduce
2eb90 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6d 64  DatabaseType(cmd
2eba0 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20  .zFile, 1);.    
2ebb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62  }else{.      eDb
2ebc0 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f  Type = pState->o
2ebd0 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  penMode;.    }. 
2ebe0 20 20 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d     if( eDbType==
2ebf0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
2ec00 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LE ){.      if( 
2ec10 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2ec20 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e  _EXTRACT || cmd.
2ec30 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53  eCmd==AR_CMD_LIS
2ec40 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
2ec50 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b   cmd.zFile==0 ){
2ec60 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a  .          cmd.z
2ec70 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
2ec80 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 22  e3_mprintf("zip"
2ec90 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2eca0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
2ecb0 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2ecc0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70  te3_mprintf("zip
2ecd0 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a  file(%Q)", cmd.z
2ece0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
2ecf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2ed00 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20  md.bZip = 1;.   
2ed10 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a   }else if( cmd.z
2ed20 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  File ){.      in
2ed30 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  t flags;.      i
2ed40 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20 29  f( cmd.bAppend )
2ed50 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c   eDbType = SHELL
2ed60 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b  _OPEN_APPENDVFS;
2ed70 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
2ed80 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd==AR_CMD_CREA
2ed90 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d  TE || cmd.eCmd==
2eda0 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20  AR_CMD_INSERT . 
2edb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63 6d 64            || cmd
2edc0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50  .eCmd==AR_CMD_UP
2edd0 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DATE ){.        
2ede0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
2edf0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2ee00 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2ee10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ee20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53         flags = S
2ee30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2ee40 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
2ee50 20 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20     cmd.db = 0;. 
2ee60 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72       if( cmd.bDr
2ee70 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  yRun ){.        
2ee80 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61  utf8_printf(pSta
2ee90 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65  te->out, "-- ope
2eea0 6e 20 64 61 74 61 62 61 73 65 20 27 25 73 27 25  n database '%s'%
2eeb0 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c  s\n", cmd.zFile,
2eec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
2eed0 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2eee0 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20  N_APPENDVFS ? " 
2eef0 75 73 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22  using 'apndvfs'"
2ef00 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a   : "");.      }.
2ef10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ef20 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a  e3_open_v2(cmd.z
2ef30 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66  File, &cmd.db, f
2ef40 6c 61 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lags, .         
2ef50 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45      eDbType==SHE
2ef60 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2ef70 53 20 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20  S ? "apndvfs" : 
2ef80 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2ef90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2efa0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2efb0 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
2efc0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73  ot open file: %s
2efd0 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20   (%s)\n", .     
2efe0 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65         cmd.zFile
2eff0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2f000 28 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20  (cmd.db).       
2f010 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
2f020 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b   end_ar_command;
2f030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2f040 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2f050 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29  it(cmd.db, 0, 0)
2f060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2f070 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64  sqlar_init(cmd.d
2f080 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
2f090 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2f0a0 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20  unction(cmd.db, 
2f0b0 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20  "shell_putsnl", 
2f0c0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
2f0d0 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20  cmd.p,.         
2f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0f0 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75       shellPutsFu
2f100 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  nc, 0, 0);..    
2f110 7d 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53  }.    if( cmd.zS
2f120 72 63 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d  rcTable==0 && cm
2f130 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64  d.bZip==0 && cmd
2f140 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45  .eCmd!=AR_CMD_HE
2f150 4c 50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LP ){.      if( 
2f160 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2f170 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 26  _CREATE.       &
2f180 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  & sqlite3_table_
2f190 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
2f1a0 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22  cmd.db,0,"sqlar"
2f1b0 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c  ,"name",0,0,0,0,
2f1c0 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
2f1d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f1e0 73 74 64 65 72 72 2c 20 22 64 61 74 61 62 61 73  stderr, "databas
2f1f0 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
2f200 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61  in an 'sqlar' ta
2f210 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ble\n");.       
2f220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2f230 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
2f240 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b   end_ar_command;
2f250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2f260 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
2f270 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2f280 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a  sqlar");.    }..
2f290 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e      switch( cmd.
2f2a0 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61  eCmd ){.      ca
2f2b0 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
2f2c0 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2f2d0 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
2f2e0 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20  ommand(&cmd, 0, 
2f2f0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
2f300 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2f310 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
2f320 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78         rc = arEx
2f330 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d  tractCommand(&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 4c 49 53 54 3a 0a 20 20 20 20  R_CMD_LIST:.    
2f370 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43      rc = arListC
2f380 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20  ommand(&cmd);.  
2f390 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2f3a0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2f3b0 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72  HELP:.        ar
2f3c0 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75  Usage(pState->ou
2f3d0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
2f3e0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2f3f0 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20  R_CMD_INSERT:.  
2f400 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65        rc = arCre
2f410 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61  ateOrUpdateComma
2f420 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a  nd(&cmd, 1, 0);.
2f430 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2f440 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
2f450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2f460 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2f470 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20  UPDATE );.      
2f480 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f    rc = arCreateO
2f490 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26  rUpdateCommand(&
2f4a0 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  cmd, 1, 1);.    
2f4b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2f4c0 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d  .  }.end_ar_comm
2f4d0 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64  and:.  if( cmd.d
2f4e0 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b  b!=pState->db ){
2f4f0 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d  .    close_db(cm
2f500 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  d.db);.  }.  sql
2f510 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53  ite3_free(cmd.zS
2f520 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74  rcTable);..  ret
2f530 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64  urn rc;.}./* End
2f540 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76   of the ".archiv
2f550 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d  e" or ".ar" comm
2f560 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a  and logic.******
2f570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
2f5c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2f5d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2f5e0 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
2f5f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
2f600 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 23 69 66 20  E_ZLIB) */..#if 
2f610 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2f620 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2f630 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2f640 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41  LITE_ENABLE_DBPA
2f650 47 45 5f 56 54 41 42 29 0a 2f 2a 0a 2a 2a 20 49  GE_VTAB)./*.** I
2f660 66 20 28 2a 70 52 63 29 20 69 73 20 6e 6f 74 20  f (*pRc) is not 
2f670 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
2f680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f690 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
2f6a0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
2f6b0 69 73 65 2c 20 74 68 65 20 53 51 4c 20 73 74 61  ise, the SQL sta
2f6c0 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74 65 6d  tement or statem
2f6d0 65 6e 74 73 20 69 6e 20 7a 53 71 6c 20 61 72 65  ents in zSql are
2f6e0 20 65 78 65 63 75 74 65 64 20 75 73 69 6e 67 0a   executed using.
2f6f0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2f700 65 63 74 69 6f 6e 20 64 62 20 61 6e 64 20 74 68  ection db and th
2f710 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77 72 69  e error code wri
2f720 74 74 65 6e 20 74 6f 20 2a 70 52 63 20 62 65 66  tten to *pRc bef
2f730 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ore.** this func
2f740 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tion returns..*/
2f750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
2f760 6c 6c 45 78 65 63 28 73 71 6c 69 74 65 33 20 2a  llExec(sqlite3 *
2f770 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20 63 6f  db, int *pRc, co
2f780 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
2f790 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63  .  int rc = *pRc
2f7a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2f7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61  TE_OK ){.    cha
2f7c0 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
2f7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2f7e0 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  ec(db, zSql, 0, 
2f7f0 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  0, &zErr);.    i
2f800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f810 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2f820 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
2f830 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
2f840 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zErr);.    }.   
2f850 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a   *pRc = rc;.  }.
2f860 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 68  }../*.** Like sh
2f870 65 6c 6c 45 78 65 63 28 29 2c 20 65 78 63 65 70  ellExec(), excep
2f880 74 20 74 68 61 74 20 7a 46 6d 74 20 69 73 20 61  t that zFmt is a
2f890 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20   printf() style 
2f8a0 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 0a 2a  format string..*
2f8b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
2f8c0 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28 73 71  ellExecPrintf(sq
2f8d0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 2a  lite3 *db, int *
2f8e0 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pRc, const char 
2f8f0 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  *zFmt, ...){.  c
2f900 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
2f910 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
2f920 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
2f930 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72   ap;.    va_star
2f940 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2f950 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
2f960 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
2f970 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
2f980 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
2f990 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
2f9a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f9b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65  }else{.      she
2f9c0 6c 6c 45 78 65 63 28 64 62 2c 20 70 52 63 2c 20  llExec(db, pRc, 
2f9d0 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  z);.    }.    sq
2f9e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
2f9f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a   }.}../*.** If *
2fa00 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  pRc is not SQLIT
2fa10 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
2fa20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2fa30 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
2fa40 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
2fa50 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2fa60 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  de to allocate, 
2fa70 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
2fa80 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
2fa90 61 20 62 75 66 66 65 72 20 6e 42 79 74 65 20 62  a buffer nByte b
2faa0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66  ytes in size. If
2fab0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
2fac0 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65  curs, *pRc is se
2fad0 74 0a 2a 2a 20 74 6f 20 53 51 4c 49 54 45 5f 4e  t.** to SQLITE_N
2fae0 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c 20 72 65  OMEM and NULL re
2faf0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2fb00 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c 4d 61 6c  c void *shellMal
2fb10 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20 73 71  loc(int *pRc, sq
2fb20 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
2fb30 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
2fb40 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2fb50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fb60 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
2fb70 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
2fb80 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
2fb90 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
2fba0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2fbb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fbc0 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
2fbd0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
2fbe0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
2fbf0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  t;.}../*.** If *
2fc00 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  pRc is not SQLIT
2fc10 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
2fc20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2fc30 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
2fc40 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
2fc50 7a 46 6d 74 20 69 73 20 74 72 65 61 74 65 64 20  zFmt is treated 
2fc60 61 73 20 61 20 70 72 69 6e 74 66 28 29 20 73 74  as a printf() st
2fc70 79 6c 65 20 73 74 72 69 6e 67 2e 20 54 68 65 20  yle string. The 
2fc80 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 66 6f 72  result of.** for
2fc90 6d 61 74 74 69 6e 67 20 69 74 20 61 6c 6f 6e 67  matting it along
2fca0 20 77 69 74 68 20 61 6e 79 20 74 72 61 69 6c 69   with any traili
2fcb0 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 69 73 20  ng arguments is 
2fcc0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 0a  written into a .
2fcd0 2a 2a 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e  ** buffer obtain
2fce0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
2fcf0 6d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64 20 70 6f  malloc(), and po
2fd00 69 6e 74 65 72 20 74 6f 20 77 68 69 63 68 20 69  inter to which i
2fd10 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 49  s returned..** I
2fd20 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
2fd30 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
2fd40 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
2fd50 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
2fd60 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67 20 61 20  ffer.** using a 
2fd70 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
2fd80 66 72 65 65 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 49  free()..** .** I
2fd90 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
2fda0 63 63 75 72 73 2c 20 28 2a 70 52 63 29 20 69 73  ccurs, (*pRc) is
2fdb0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
2fdc0 4f 4d 45 4d 20 61 6e 64 20 61 20 4e 55 4c 4c 20  OMEM and a NULL 
2fdd0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 72 65 74 75  .** pointer retu
2fde0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2fdf0 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50 72 69 6e  char *shellMPrin
2fe00 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e  tf(int *pRc, con
2fe10 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
2fe20 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  ..){.  char *z =
2fe30 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
2fe40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fe50 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
2fe60 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2fe70 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  mt);.    z = sql
2fe80 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2fe90 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  mt, ap);.    va_
2fea0 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66 28  end(ap);.    if(
2feb0 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a   z==0 ){.      *
2fec0 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
2fed0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2fee0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
2fef0 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  ** When running 
2ff00 74 68 65 20 22 2e 72 65 63 6f 76 65 72 22 20 63  the ".recover" c
2ff10 6f 6d 6d 61 6e 64 2c 20 65 61 63 68 20 6f 75 74  ommand, each out
2ff20 70 75 74 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  put table, and t
2ff30 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 6f 72  he special.** or
2ff40 70 68 61 6e 65 64 20 72 6f 77 20 74 61 62 6c 65  phaned row table
2ff50 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72   if it is requir
2ff60 65 64 2c 20 69 73 20 72 65 70 72 65 73 65 6e 74  ed, is represent
2ff70 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63  ed by an instanc
2ff80 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
2ff90 6f 77 69 6e 67 20 73 74 72 75 63 74 2e 0a 2a 2f  owing struct..*/
2ffa0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2ffb0 52 65 63 6f 76 65 72 54 61 62 6c 65 20 52 65 63  RecoverTable Rec
2ffc0 6f 76 65 72 54 61 62 6c 65 3b 0a 73 74 72 75 63  overTable;.struc
2ffd0 74 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 7b  t RecoverTable {
2ffe0 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64  .  char *zQuoted
2fff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30000 20 20 20 2f 2a 20 51 75 6f 74 65 64 20 76 65 72     /* Quoted ver
30010 73 69 6f 6e 20 6f 66 20 74 61 62 6c 65 20 6e 61  sion of table na
30020 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  me */.  int nCol
30030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30050 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
30060 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
30070 2a 2a 61 7a 6c 43 6f 6c 3b 20 20 20 20 20 20 20  **azlCol;       
30080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
30090 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6c 69  ray of column li
300a0 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b  sts */.  int iPk
300b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
300c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
300d0 78 20 6f 66 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  x of IPK column 
300e0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  */.};../*.** Fre
300f0 65 20 61 20 52 65 63 6f 76 65 72 54 61 62 6c 65  e a RecoverTable
30100 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65   object allocate
30110 64 20 62 79 20 72 65 63 6f 76 65 72 46 69 6e 64  d by recoverFind
30120 54 61 62 6c 65 28 29 20 6f 72 0a 2a 2a 20 72 65  Table() or.** re
30130 63 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65  coverOrphanTable
30140 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
30150 69 64 20 72 65 63 6f 76 65 72 46 72 65 65 54 61  id recoverFreeTa
30160 62 6c 65 28 52 65 63 6f 76 65 72 54 61 62 6c 65  ble(RecoverTable
30170 20 2a 70 54 61 62 29 7b 0a 20 20 69 66 28 20 70   *pTab){.  if( p
30180 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
30190 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 7a 51  e3_free(pTab->zQ
301a0 75 6f 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20  uoted);.    if( 
301b0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20 29 7b 0a  pTab->azlCol ){.
301c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
301d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
301e0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
301f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30200 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43  _free(pTab->azlC
30210 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ol[i]);.      }.
30220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30230 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 29  ee(pTab->azlCol)
30240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
30250 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a  te3_free(pTab);.
30260 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
30270 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
30280 6e 6f 2d 6f 70 20 69 66 20 28 2a 70 52 63 29 20  no-op if (*pRc) 
30290 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
302a0 20 77 68 65 6e 20 69 74 20 69 73 20 63 61 6c 6c   when it is call
302b0 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
302c0 2c 20 69 74 20 61 6c 6c 6f 63 61 74 65 73 20 61  , it allocates a
302d0 6e 64 20 72 65 74 75 72 6e 73 20 61 20 52 65 63  nd returns a Rec
302e0 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63 74  overTable object
302f0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
30300 20 66 69 6e 61 6c 20 66 6f 75 72 20 61 72 67 75   final four argu
30310 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
30320 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
30330 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
30340 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68  ibility.** of th
30350 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
30360 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
30370 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20  returned object 
30380 75 73 69 6e 67 0a 2a 2a 20 72 65 63 6f 76 65 72  using.** recover
30390 46 72 65 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  FreeTable()..*/.
303a0 73 74 61 74 69 63 20 52 65 63 6f 76 65 72 54 61  static RecoverTa
303b0 62 6c 65 20 2a 72 65 63 6f 76 65 72 4e 65 77 54  ble *recoverNewT
303c0 61 62 6c 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  able(.  int *pRc
303d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
303e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
303f0 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
30400 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30410 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
30420 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
30430 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ble */.  const c
30440 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
30450 20 20 20 20 20 20 20 20 20 2f 2a 20 43 52 45 41           /* CREA
30460 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
30470 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 74  nt */.  int bInt
30480 6b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 43 6f 6c  key, .  int nCol
30490 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
304a0 62 74 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20  btmp = 0;       
304b0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
304c0 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 65 73 74   handle for test
304d0 69 6e 67 20 43 52 45 41 54 45 20 54 41 42 4c 45  ing CREATE TABLE
304e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a   */.  int rc = *
304f0 70 52 63 3b 0a 20 20 52 65 63 6f 76 65 72 54 61  pRc;.  RecoverTa
30500 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 0a  ble *pTab = 0;..
30510 20 20 70 54 61 62 20 3d 20 28 52 65 63 6f 76 65    pTab = (Recove
30520 72 54 61 62 6c 65 2a 29 73 68 65 6c 6c 4d 61 6c  rTable*)shellMal
30530 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  loc(&rc, sizeof(
30540 52 65 63 6f 76 65 72 54 61 62 6c 65 29 29 3b 0a  RecoverTable));.
30550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30560 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
30570 53 71 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  SqlCol = 0;.    
30580 69 6e 74 20 62 53 71 6c 49 6e 74 6b 65 79 20 3d  int bSqlIntkey =
30590 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
305a0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
305b0 0a 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20 73  .    .    rc = s
305c0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 22 2c 20  qlite3_open("", 
305d0 26 64 62 74 6d 70 29 3b 0a 20 20 20 20 69 66 28  &dbtmp);.    if(
305e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
305f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
30600 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
30610 64 62 74 6d 70 2c 20 22 73 68 65 6c 6c 5f 69 64  dbtmp, "shell_id
30620 71 75 6f 74 65 22 2c 20 31 2c 20 53 51 4c 49 54  quote", 1, SQLIT
30630 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
30640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30650 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 49 64           shellId
30660 51 75 6f 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Quote, 0, 0);.  
30670 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
30680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
306a0 65 78 65 63 28 64 62 74 6d 70 2c 20 22 50 52 41  exec(dbtmp, "PRA
306b0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
306c0 65 6d 61 20 3d 20 6f 6e 22 2c 20 30 2c 20 30 2c  ema = on", 0, 0,
306d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
306e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
306f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
30700 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 74 6d  qlite3_exec(dbtm
30710 70 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  p, zSql, 0, 0, 0
30720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
30730 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b  =SQLITE_ERROR ){
30740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
30750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30760 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
30770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30780 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
30790 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63 2c  intf(dbtmp, &rc,
307a0 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20   &pStmt, .      
307b0 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
307c0 2a 29 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74  *) FROM pragma_t
307d0 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20  able_info(%Q)", 
307e0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
307f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30800 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
30810 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
30820 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  Stmt) ){.      n
30830 53 71 6c 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  SqlCol = sqlite3
30840 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
30850 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
30860 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
30870 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20  rc, pStmt);..   
30880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30890 4f 4b 20 7c 7c 20 6e 53 71 6c 43 6f 6c 3c 6e 43  OK || nSqlCol<nC
308a0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  ol ){.      goto
308b0 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d   finished;.    }
308c0 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  ..    shellPrepa
308d0 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20  rePrintf(dbtmp, 
308e0 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20  &rc, &pStmt, .  
308f0 20 20 20 20 22 53 45 4c 45 43 54 20 28 22 0a 20      "SELECT (". 
30900 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 73       "  SELECT s
30910 75 62 73 74 72 28 64 61 74 61 2c 31 2c 31 29 3d  ubstr(data,1,1)=
30920 3d 58 27 30 44 27 20 46 52 4f 4d 20 73 71 6c 69  =X'0D' FROM sqli
30930 74 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20  te_dbpage WHERE 
30940 70 67 6e 6f 3d 72 6f 6f 74 70 61 67 65 22 0a 20  pgno=rootpage". 
30950 20 20 20 20 20 22 29 20 46 52 4f 4d 20 73 71 6c       ") FROM sql
30960 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
30970 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 4e 61   name = %Q", zNa
30980 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
30990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
309a0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
309b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
309c0 74 29 20 29 7b 0a 20 20 20 20 20 20 62 53 71 6c  t) ){.      bSql
309d0 49 6e 74 6b 65 79 20 3d 20 73 71 6c 69 74 65 33  Intkey = sqlite3
309e0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
309f0 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
30a00 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
30a10 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20  rc, pStmt);..   
30a20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d 62 53   if( bIntkey==bS
30a30 71 6c 49 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20  qlIntkey ){.    
30a40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
30a50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d  onst char *zPk =
30a60 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20   "_rowid_";.    
30a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
30a80 70 50 6b 46 69 6e 64 65 72 20 3d 20 30 3b 0a 0a  pPkFinder = 0;..
30a90 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
30aa0 20 69 73 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   is an intkey ta
30ab0 62 6c 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ble and there is
30ac0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
30ad0 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 2a  ARY KEY,.      *
30ae0 2a 20 73 65 74 20 7a 50 6b 20 74 6f 20 74 68 65  * set zPk to the
30af0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 50 4b 20   name of the PK 
30b00 63 6f 6c 75 6d 6e 2c 20 61 6e 64 20 70 54 61 62  column, and pTab
30b10 2d 3e 69 50 6b 20 74 6f 20 74 68 65 20 69 6e 64  ->iPk to the ind
30b20 65 78 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ex.      ** of t
30b30 68 65 20 63 6f 6c 75 6d 6e 2c 20 77 68 65 72 65  he column, where
30b40 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 30 2d 6e   columns are 0-n
30b50 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66  umbered from lef
30b60 74 20 74 6f 20 72 69 67 68 74 2e 0a 20 20 20 20  t to right..    
30b70 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69 73    ** Or, if this
30b80 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f   is a WITHOUT RO
30b90 57 49 44 20 74 61 62 6c 65 20 6f 72 20 69 66 20  WID table or if 
30ba0 74 68 65 72 65 20 69 73 20 6e 6f 20 49 50 4b 20  there is no IPK 
30bb0 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 2a 2a  column,.      **
30bc0 20 6c 65 61 76 65 20 7a 50 6b 20 61 73 20 22 5f   leave zPk as "_
30bd0 72 6f 77 69 64 5f 22 20 61 6e 64 20 70 54 61 62  rowid_" and pTab
30be0 2d 3e 69 50 6b 20 61 74 20 2d 32 2e 20 20 2a 2f  ->iPk at -2.  */
30bf0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 6b  .      pTab->iPk
30c00 20 3d 20 2d 32 3b 0a 20 20 20 20 20 20 69 66 28   = -2;.      if(
30c10 20 62 49 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20   bIntkey ){.    
30c20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
30c30 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72  Printf(dbtmp, &r
30c40 63 2c 20 26 70 50 6b 46 69 6e 64 65 72 2c 20 0a  c, &pPkFinder, .
30c50 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
30c60 54 20 63 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d  T cid, name FROM
30c70 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
30c80 66 6f 28 25 51 29 20 22 0a 20 20 20 20 20 20 20  fo(%Q) ".       
30c90 20 20 20 22 20 20 57 48 45 52 45 20 70 6b 3d 31     "  WHERE pk=1
30ca0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 74 65 67   AND type='integ
30cb0 65 72 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  er' COLLATE noca
30cc0 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  se".          " 
30cd0 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 20   AND NOT EXISTS 
30ce0 28 53 45 4c 45 43 54 20 63 69 64 20 46 52 4f 4d  (SELECT cid FROM
30cf0 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
30d00 66 6f 28 25 51 29 20 57 48 45 52 45 20 70 6b 3d  fo(%Q) WHERE pk=
30d10 32 29 22 0a 20 20 20 20 20 20 20 20 20 20 2c 20  2)".          , 
30d20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20  zName, zName.   
30d30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
30d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30d50 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
30d60 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50  =sqlite3_step(pP
30d70 6b 46 69 6e 64 65 72 29 20 29 7b 0a 20 20 20 20  kFinder) ){.    
30d80 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 6b 20        pTab->iPk 
30d90 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
30da0 5f 69 6e 74 28 70 50 6b 46 69 6e 64 65 72 2c 20  _int(pPkFinder, 
30db0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50  0);.          zP
30dc0 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  k = (const char*
30dd0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
30de0 74 65 78 74 28 70 50 6b 46 69 6e 64 65 72 2c 20  text(pPkFinder, 
30df0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
30e00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 54 61      }..      pTa
30e10 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68 65  b->zQuoted = she
30e20 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22  llMPrintf(&rc, "
30e30 5c 22 25 77 5c 22 22 2c 20 7a 4e 61 6d 65 29 3b  \"%w\"", zName);
30e40 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c  .      pTab->azl
30e50 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29 73 68  Col = (char**)sh
30e60 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73  ellMalloc(&rc, s
30e70 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28  izeof(char*) * (
30e80 6e 53 71 6c 43 6f 6c 2b 31 29 29 3b 0a 20 20 20  nSqlCol+1));.   
30e90 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
30ea0 6e 53 71 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  nSqlCol;..      
30eb0 69 66 28 20 62 49 6e 74 6b 65 79 20 29 7b 0a 20  if( bIntkey ){. 
30ec0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c         pTab->azl
30ed0 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c 4d 50  Col[0] = shellMP
30ee0 72 69 6e 74 66 28 26 72 63 2c 20 22 5c 22 25 77  rintf(&rc, "\"%w
30ef0 5c 22 22 2c 20 7a 50 6b 29 3b 0a 20 20 20 20 20  \"", zPk);.     
30f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30f10 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 20  pTab->azlCol[0] 
30f20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26  = shellMPrintf(&
30f30 72 63 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d  rc, "");.      }
30f40 0a 20 20 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  .      i = 1;.  
30f50 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
30f60 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72  Printf(dbtmp, &r
30f70 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20  c, &pStmt, .    
30f80 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 51        "SELECT %Q
30f90 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
30fa0 28 73 68 65 6c 6c 5f 69 64 71 75 6f 74 65 28 6e  (shell_idquote(n
30fb0 61 6d 65 29 2c 20 27 2c 20 27 29 20 22 0a 20 20  ame), ', ') ".  
30fc0 20 20 20 20 20 20 20 20 22 20 20 46 49 4c 54 45          "  FILTE
30fd0 52 20 28 57 48 45 52 45 20 63 69 64 21 3d 25 64  R (WHERE cid!=%d
30fe0 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59  ) OVER (ORDER BY
30ff0 20 25 73 20 63 69 64 29 20 22 0a 20 20 20 20 20   %s cid) ".     
31000 20 20 20 20 20 22 46 52 4f 4d 20 70 72 61 67 6d       "FROM pragm
31010 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  a_table_info(%Q)
31020 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 62 49  ", .          bI
31030 6e 74 6b 65 79 20 3f 20 22 2c 20 22 20 3a 20 22  ntkey ? ", " : "
31040 22 2c 20 70 54 61 62 2d 3e 69 50 6b 2c 20 0a 20  ", pTab->iPk, . 
31050 20 20 20 20 20 20 20 20 20 62 49 6e 74 6b 65 79           bIntkey
31060 20 3f 20 22 22 20 3a 20 22 28 43 41 53 45 20 57   ? "" : "(CASE W
31070 48 45 4e 20 70 6b 3d 30 20 54 48 45 4e 20 31 30  HEN pk=0 THEN 10
31080 30 30 30 30 30 20 45 4c 53 45 20 70 6b 20 45 4e  00000 ELSE pk EN
31090 44 29 2c 20 22 2c 0a 20 20 20 20 20 20 20 20 20  D), ",.         
310a0 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
310b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
310c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
310d0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
310e0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
310f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
31100 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
31110 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
31120 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
31130 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
31140 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d   pTab->azlCol[i]
31150 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
31160 26 72 63 2c 20 22 25 73 25 73 22 2c 20 70 54 61  &rc, "%s%s", pTa
31170 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 2c 20 7a 54  b->azlCol[0], zT
31180 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 69 2b  ext);.        i+
31190 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
311a0 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
311b0 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20  rc, pStmt);..   
311c0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
311d0 28 26 72 63 2c 20 70 50 6b 46 69 6e 64 65 72 29  (&rc, pPkFinder)
311e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 69  ;.    }.  }.. fi
311f0 6e 69 73 68 65 64 3a 0a 20 20 73 71 6c 69 74 65  nished:.  sqlite
31200 33 5f 63 6c 6f 73 65 28 64 62 74 6d 70 29 3b 0a  3_close(dbtmp);.
31210 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69    *pRc = rc;.  i
31220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31230 20 7c 7c 20 28 70 54 61 62 20 26 26 20 70 54 61   || (pTab && pTa
31240 62 2d 3e 7a 51 75 6f 74 65 64 3d 3d 30 29 20 29  b->zQuoted==0) )
31250 7b 0a 20 20 20 20 72 65 63 6f 76 65 72 46 72 65  {.    recoverFre
31260 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
31270 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a    pTab = 0;.  }.
31280 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
31290 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
312a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
312b0 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 73 63  to search the sc
312c0 68 65 6d 61 20 72 65 63 6f 76 65 72 65 64 20 66  hema recovered f
312d0 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  rom the.** sqlit
312e0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e_master table o
312f0 66 20 74 68 65 20 28 70 6f 73 73 69 62 6c 79 29  f the (possibly)
31300 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
31310 65 20 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  e as part.** of 
31320 61 20 22 2e 72 65 63 6f 76 65 72 22 20 63 6f 6d  a ".recover" com
31330 6d 61 6e 64 2e 20 53 70 65 63 69 66 69 63 61 6c  mand. Specifical
31340 6c 79 2c 20 66 6f 72 20 61 20 74 61 62 6c 65 20  ly, for a table 
31350 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65 0a 2a  with root page.*
31360 2a 20 69 52 6f 6f 74 20 61 6e 64 20 61 74 20 6c  * iRoot and at l
31370 65 61 73 74 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  east nCol column
31380 73 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  s. Additionally,
31390 20 69 66 20 62 49 6e 74 6b 65 79 20 69 73 20 30   if bIntkey is 0
313a0 2c 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6d  , the.** table m
313b0 75 73 74 20 62 65 20 61 20 57 49 54 48 4f 55 54  ust be a WITHOUT
313c0 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 6f 72   ROWID table, or
313d0 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6e 6f   if non-zero, no
313e0 74 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 6f 73  t one of.** thos
313f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 61  e..**.** If a ta
31400 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 20  ble is found, a 
31410 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a 29 20  (RecoverTable*) 
31420 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
31430 65 64 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 6e 6f  ed. Or, if.** no
31440 20 73 75 63 68 20 74 61 62 6c 65 20 69 73 20 66   such table is f
31450 6f 75 6e 64 2c 20 62 75 74 20 62 49 6e 74 6b 65  ound, but bIntke
31460 79 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 69  y is false and i
31470 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  Root is the .** 
31480 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20  root page of an 
31490 69 6e 64 65 78 20 69 6e 20 74 68 65 20 72 65 63  index in the rec
314a0 6f 76 65 72 65 64 20 73 63 68 65 6d 61 2c 20 74  overed schema, t
314b0 68 65 6e 20 28 2a 70 62 4e 6f 6f 70 29 20 69 73  hen (*pbNoop) is
314c0 0a 2a 2a 20 73 65 74 20 74 6f 20 74 72 75 65 20  .** set to true 
314d0 61 6e 64 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65  and NULL returne
314e0 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  d. Or, if there 
314f0 69 73 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  is no such table
31500 20 6f 72 0a 2a 2a 20 69 6e 64 65 78 2c 20 4e 55   or.** index, NU
31510 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
31520 6e 64 20 28 2a 70 62 4e 6f 6f 70 29 20 73 65 74  nd (*pbNoop) set
31530 20 74 6f 20 30 2c 20 69 6e 64 69 63 61 74 69 6e   to 0, indicatin
31540 67 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  g that.** the ca
31550 6c 6c 65 72 20 73 68 6f 75 6c 64 20 77 72 69 74  ller should writ
31560 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f 72  e data to the or
31570 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a  phans table..*/.
31580 73 74 61 74 69 63 20 52 65 63 6f 76 65 72 54 61  static RecoverTa
31590 62 6c 65 20 2a 72 65 63 6f 76 65 72 46 69 6e 64  ble *recoverFind
315a0 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c 53 74  Table(.  ShellSt
315b0 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
315c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c           /* Shel
315d0 6c 20 73 74 61 74 65 20 6f 62 6a 65 63 74 20 2a  l state object *
315e0 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  /.  int *pRc,   
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31600 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
31610 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
31620 6e 74 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  nt iRoot,       
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31640 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
31650 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 49  able */.  int bI
31660 6e 74 6b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntkey,          
31670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
31680 65 20 66 6f 72 20 61 6e 20 69 6e 74 6b 65 79 20  e for an intkey 
31690 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
316a0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
316b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
316c0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
316d0 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  in table */.  in
316e0 74 20 2a 70 62 4e 6f 6f 70 20 20 20 20 20 20 20  t *pbNoop       
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31700 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 69 52   OUT: True if iR
31710 6f 6f 74 20 69 73 20 72 6f 6f 74 20 6f 66 20 69  oot is root of i
31720 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ndex */.){.  sql
31730 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
31740 20 3d 20 30 3b 0a 20 20 52 65 63 6f 76 65 72 54   = 0;.  RecoverT
31750 61 62 6c 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a  able *pRet = 0;.
31760 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30 3b    int bNoop = 0;
31770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31780 53 71 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  Sql = 0;.  const
31790 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
317a0 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74  ;..  /* Search t
317b0 68 65 20 72 65 63 6f 76 65 72 65 64 20 73 63 68  he recovered sch
317c0 65 6d 61 20 66 6f 72 20 61 6e 20 6f 62 6a 65 63  ema for an objec
317d0 74 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  t with root page
317e0 20 69 52 6f 6f 74 2e 20 2a 2f 0a 20 20 73 68 65   iRoot. */.  she
317f0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
31800 70 53 74 61 74 65 2d 3e 64 62 2c 20 70 52 63 2c  pState->db, pRc,
31810 20 26 70 53 74 6d 74 2c 0a 20 20 20 20 20 20 22   &pStmt,.      "
31820 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d  SELECT type, nam
31830 65 2c 20 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f  e, sql FROM reco
31840 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48 45 52  very.schema WHER
31850 45 20 72 6f 6f 74 70 61 67 65 3d 25 64 22 2c 20  E rootpage=%d", 
31860 69 52 6f 6f 74 0a 20 20 29 3b 0a 20 20 77 68 69  iRoot.  );.  whi
31870 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  le( *pRc==SQLITE
31880 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
31890 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
318a0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f  pStmt) ){.    co
318b0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
318c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
318d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
318e0 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
318f0 20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d 30    if( bIntkey==0
31900 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
31910 63 6d 70 28 7a 54 79 70 65 2c 20 22 69 6e 64 65  cmp(zType, "inde
31920 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
31930 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  bNoop = 1;.     
31940 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31950 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
31960 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  ricmp(zType, "ta
31970 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
31980 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74    zName = (const
31990 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
319a0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
319b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  , 1);.      zSql
319c0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
319d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
319e0 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20  ext(pStmt, 2);. 
319f0 20 20 20 20 20 70 52 65 74 20 3d 20 72 65 63 6f       pRet = reco
31a00 76 65 72 4e 65 77 54 61 62 6c 65 28 70 52 63 2c  verNewTable(pRc,
31a10 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 2c 20 62 49   zName, zSql, bI
31a20 6e 74 6b 65 79 2c 20 6e 43 6f 6c 29 3b 0a 20 20  ntkey, nCol);.  
31a30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31a40 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 46 69 6e  .  }..  shellFin
31a50 61 6c 69 7a 65 28 70 52 63 2c 20 70 53 74 6d 74  alize(pRc, pStmt
31a60 29 3b 0a 20 20 2a 70 62 4e 6f 6f 70 20 3d 20 62  );.  *pbNoop = b
31a70 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70  Noop;.  return p
31a80 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
31a90 74 75 72 6e 20 61 20 52 65 63 6f 76 65 72 54 61  turn a RecoverTa
31aa0 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
31ab0 73 65 6e 74 69 6e 67 20 74 68 65 20 6f 72 70 68  senting the orph
31ac0 61 6e 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ans table..*/.st
31ad0 61 74 69 63 20 52 65 63 6f 76 65 72 54 61 62 6c  atic RecoverTabl
31ae0 65 20 2a 72 65 63 6f 76 65 72 4f 72 70 68 61 6e  e *recoverOrphan
31af0 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c 53 74  Table(.  ShellSt
31b00 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
31b10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c           /* Shel
31b20 6c 20 73 74 61 74 65 20 6f 62 6a 65 63 74 20 2a  l state object *
31b30 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  /.  int *pRc,   
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
31b60 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
31b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 73 74  onst char *zLost
31b80 41 6e 64 46 6f 75 6e 64 2c 20 20 20 20 20 20 2f  AndFound,      /
31b90 2a 20 42 61 73 65 20 6e 61 6d 65 20 66 6f 72 20  * Base name for 
31ba0 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 20 2a 2f  orphans table */
31bb0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 20 20 20 20  .  int nCol     
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31be0 75 73 65 72 20 64 61 74 61 20 63 6f 6c 75 6d 6e  user data column
31bf0 73 20 2a 2f 0a 29 7b 0a 20 20 52 65 63 6f 76 65  s */.){.  Recove
31c00 72 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30  rTable *pTab = 0
31c10 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 30 20  ;.  if( nCol>=0 
31c20 26 26 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  && *pRc==SQLITE_
31c30 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
31c40 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  ..    /* This bl
31c50 6f 63 6b 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ock determines t
31c60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
31c70 72 70 68 61 6e 20 74 61 62 6c 65 2e 20 54 68 65  rphan table. The
31c80 20 70 72 65 66 65 72 65 64 0a 20 20 20 20 2a 2a   prefered.    **
31c90 20 6e 61 6d 65 20 69 73 20 7a 4c 6f 73 74 41 6e   name is zLostAn
31ca0 64 46 6f 75 6e 64 2e 20 42 75 74 20 69 66 20 74  dFound. But if t
31cb0 68 61 74 20 63 6c 61 73 68 65 73 20 77 69 74 68  hat clashes with
31cc0 20 61 6e 6f 74 68 65 72 20 6e 61 6d 65 0a 20 20   another name.  
31cd0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 63 6f    ** in the reco
31ce0 76 65 72 65 64 20 73 63 68 65 6d 61 2c 20 74 72  vered schema, tr
31cf0 79 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 5f  y zLostAndFound_
31d00 30 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64  0, zLostAndFound
31d10 5f 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 6f  _1.    ** and so
31d20 20 6f 6e 20 75 6e 74 69 6c 20 61 20 6e 6f 6e 2d   on until a non-
31d30 63 6c 61 73 68 69 6e 67 20 6e 61 6d 65 20 69 73  clashing name is
31d40 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 20 20   found.  */.    
31d50 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  int iTab = 0;.  
31d60 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 73    char *zTab = s
31d70 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c  hellMPrintf(pRc,
31d80 20 22 25 73 22 2c 20 7a 4c 6f 73 74 41 6e 64 46   "%s", zLostAndF
31d90 6f 75 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ound);.    sqlit
31da0 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20 3d  e3_stmt *pTest =
31db0 20 30 3b 0a 20 20 20 20 73 68 65 6c 6c 50 72 65   0;.    shellPre
31dc0 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c  pare(pState->db,
31dd0 20 70 52 63 2c 0a 20 20 20 20 20 20 20 20 22 53   pRc,.        "S
31de0 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 72 65 63  ELECT 1 FROM rec
31df0 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48 45  overy.schema WHE
31e00 52 45 20 6e 61 6d 65 3d 3f 22 2c 20 26 70 54 65  RE name=?", &pTe
31e10 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  st.    );.    if
31e20 28 20 70 54 65 73 74 20 29 20 73 71 6c 69 74 65  ( pTest ) sqlite
31e30 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73  3_bind_text(pTes
31e40 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d 31 2c 20  t, 1, zTab, -1, 
31e50 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
31e60 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  );.    while( *p
31e70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  Rc==SQLITE_OK &&
31e80 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
31e90 69 74 65 33 5f 73 74 65 70 28 70 54 65 73 74 29  ite3_step(pTest)
31ea0 20 29 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 52   ){.      shellR
31eb0 65 73 65 74 28 70 52 63 2c 20 70 54 65 73 74 29  eset(pRc, pTest)
31ec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
31ed0 66 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 20 20  free(zTab);.    
31ee0 20 20 7a 54 61 62 20 3d 20 73 68 65 6c 6c 4d 50    zTab = shellMP
31ef0 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73 5f 25  rintf(pRc, "%s_%
31f00 64 22 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e  d", zLostAndFoun
31f10 64 2c 20 69 54 61 62 2b 2b 29 3b 0a 20 20 20 20  d, iTab++);.    
31f20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
31f30 65 78 74 28 70 54 65 73 74 2c 20 31 2c 20 7a 54  ext(pTest, 1, zT
31f40 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  ab, -1, SQLITE_T
31f50 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
31f60 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
31f70 7a 65 28 70 52 63 2c 20 70 54 65 73 74 29 3b 0a  ze(pRc, pTest);.
31f80 0a 20 20 20 20 70 54 61 62 20 3d 20 28 52 65 63  .    pTab = (Rec
31f90 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65 6c 6c  overTable*)shell
31fa0 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73 69 7a 65  Malloc(pRc, size
31fb0 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c 65 29  of(RecoverTable)
31fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
31fd0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  ){.      pTab->z
31fe0 51 75 6f 74 65 64 20 3d 20 73 68 65 6c 6c 4d 50  Quoted = shellMP
31ff0 72 69 6e 74 66 28 70 52 63 2c 20 22 5c 22 25 77  rintf(pRc, "\"%w
32000 5c 22 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20  \"", zTab);.    
32010 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e    pTab->nCol = n
32020 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  Col;.      pTab-
32030 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20 20 20  >iPk = -2;.     
32040 20 69 66 28 20 6e 43 6f 6c 3e 30 20 29 7b 0a 20   if( nCol>0 ){. 
32050 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c         pTab->azl
32060 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29 73 68  Col = (char**)sh
32070 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73  ellMalloc(pRc, s
32080 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28  izeof(char*) * (
32090 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 20 20  nCol+1));.      
320a0 20 20 69 66 28 20 70 54 61 62 2d 3e 61 7a 6c 43    if( pTab->azlC
320b0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
320c0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e 43 6f  pTab->azlCol[nCo
320d0 6c 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  l] = shellMPrint
320e0 66 28 70 52 63 2c 20 22 22 29 3b 0a 20 20 20 20  f(pRc, "");.    
320f0 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 43 6f 6c        for(i=nCol
32100 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
32110 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
32120 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20 3d 20 73 68  ->azlCol[i] = sh
32130 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20  ellMPrintf(pRc, 
32140 22 25 73 2c 20 4e 55 4c 4c 22 2c 20 70 54 61 62  "%s, NULL", pTab
32150 2d 3e 61 7a 6c 43 6f 6c 5b 69 2b 31 5d 29 3b 0a  ->azlCol[i+1]);.
32160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32170 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
32180 20 20 20 20 20 69 66 28 20 2a 70 52 63 21 3d 53       if( *pRc!=S
32190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
321a0 20 20 20 20 72 65 63 6f 76 65 72 46 72 65 65 54      recoverFreeT
321b0 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20  able(pTab);.    
321c0 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
321d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
321e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
321f0 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20 20 20  tate->out, .    
32200 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
32210 54 41 42 4c 45 20 25 73 28 72 6f 6f 74 70 67 6e  TABLE %s(rootpgn
32220 6f 20 49 4e 54 45 47 45 52 2c 20 22 0a 20 20 20  o INTEGER, ".   
32230 20 20 20 20 20 20 20 20 20 22 70 67 6e 6f 20 49           "pgno I
32240 4e 54 45 47 45 52 2c 20 6e 66 69 65 6c 64 20 49  NTEGER, nfield I
32250 4e 54 45 47 45 52 2c 20 69 64 20 49 4e 54 45 47  NTEGER, id INTEG
32260 45 52 22 2c 20 70 54 61 62 2d 3e 7a 51 75 6f 74  ER", pTab->zQuot
32270 65 64 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ed.        );.  
32280 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
32290 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
322a0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
322b0 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
322c0 2c 20 63 25 64 22 2c 20 69 29 3b 0a 20 20 20 20  , c%d", i);.    
322d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
322e0 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
322f0 3e 6f 75 74 2c 20 22 29 3b 5c 6e 22 29 3b 0a 20  >out, ");\n");. 
32300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
32320 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ab);.  }.  retur
32330 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
32340 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
32350 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6f  s called to reco
32360 76 65 72 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ver data from th
32370 65 20 64 61 74 61 62 61 73 65 2e 20 41 20 73 63  e database. A sc
32380 72 69 70 74 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74  ript.** to const
32390 72 75 63 74 20 61 20 6e 65 77 20 64 61 74 61 62  ruct a new datab
323a0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ase containing a
323b0 6c 6c 20 72 65 63 6f 76 65 72 65 64 20 64 61 74  ll recovered dat
323c0 61 20 69 73 20 6f 75 74 70 75 74 0a 2a 2a 20 6f  a is output.** o
323d0 6e 20 73 74 72 65 61 6d 20 70 53 74 61 74 65 2d  n stream pState-
323e0 3e 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  >out..*/.static 
323f0 69 6e 74 20 72 65 63 6f 76 65 72 44 61 74 61 62  int recoverDatab
32400 61 73 65 43 6d 64 28 53 68 65 6c 6c 53 74 61 74  aseCmd(ShellStat
32410 65 20 2a 70 53 74 61 74 65 2c 20 69 6e 74 20 6e  e *pState, int n
32420 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
32430 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
32440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
32450 74 65 33 5f 73 74 6d 74 20 2a 70 4c 6f 6f 70 20  te3_stmt *pLoop 
32460 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  = 0;        /* L
32470 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
32480 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20  root pages */.  
32490 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50  sqlite3_stmt *pP
324a0 61 67 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ages = 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 70 61 67 65 73 20 69 6e 20 61 20 67  all pages in a g
324d0 72 6f 75 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  roup */.  sqlite
324e0 33 5f 73 74 6d 74 20 2a 70 43 65 6c 6c 73 20 3d  3_stmt *pCells =
324f0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   0;       /* Loo
32500 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 65  p through all ce
32510 6c 6c 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  lls in a page */
32520 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
32530 52 65 63 6f 76 65 72 79 44 62 20 3d 20 22 22 3b  RecoveryDb = "";
32540 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 22 72     /* Name of "r
32550 65 63 6f 76 65 72 79 22 20 64 61 74 61 62 61 73  ecovery" databas
32560 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
32570 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64  r *zLostAndFound
32580 20 3d 20 22 6c 6f 73 74 5f 61 6e 64 5f 66 6f 75   = "lost_and_fou
32590 6e 64 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  nd";.  int i;.  
325a0 69 6e 74 20 6e 4f 72 70 68 61 6e 20 3d 20 2d 31  int nOrphan = -1
325b0 3b 0a 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65  ;.  RecoverTable
325c0 20 2a 70 4f 72 70 68 61 6e 20 3d 20 30 3b 0a 0a   *pOrphan = 0;..
325d0 20 20 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20    int bFreelist 
325e0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
325f0 20 20 2f 2a 20 30 20 69 66 20 2d 2d 66 72 65 65    /* 0 if --free
32600 6c 69 73 74 2d 63 6f 72 72 75 70 74 20 69 73 20  list-corrupt is 
32610 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 66  specified */.  f
32620 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
32630 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
32640 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
32650 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
32660 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[0]=='-' && z[
32670 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
32680 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
32690 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31  z);.    if( n<=1
326a0 37 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 66 72  7 && memcmp("-fr
326b0 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 22 2c  eelist-corrupt",
326c0 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   z, n)==0 ){.   
326d0 20 20 20 62 46 72 65 65 6c 69 73 74 20 3d 20 30     bFreelist = 0
326e0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20  ;.    }else.    
326f0 69 66 28 20 6e 3c 3d 31 32 20 26 26 20 6d 65 6d  if( n<=12 && mem
32700 63 6d 70 28 22 2d 72 65 63 6f 76 65 72 79 2d 64  cmp("-recovery-d
32710 62 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20  b", z, n)==0 && 
32720 69 3c 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  i<(nArg-1) ){.  
32730 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a      i++;.      z
32740 52 65 63 6f 76 65 72 79 44 62 20 3d 20 61 7a 41  RecoveryDb = azA
32750 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  rg[i];.    }else
32760 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 35 20 26  .    if( n<=15 &
32770 26 20 6d 65 6d 63 6d 70 28 22 2d 6c 6f 73 74 2d  & memcmp("-lost-
32780 61 6e 64 2d 66 6f 75 6e 64 22 2c 20 7a 2c 20 6e  and-found", z, n
32790 29 3d 3d 30 20 26 26 20 69 3c 28 6e 41 72 67 2d  )==0 && i<(nArg-
327a0 31 29 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  1) ){.      i++;
327b0 0a 20 20 20 20 20 20 7a 4c 6f 73 74 41 6e 64 46  .      zLostAndF
327c0 6f 75 6e 64 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  ound = azArg[i];
327d0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b  .    }.    else{
327e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
327f0 66 28 73 74 64 65 72 72 2c 20 22 75 6e 65 78 70  f(stderr, "unexp
32800 65 63 74 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  ected option: %s
32810 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 20  \n", azArg[i]); 
32820 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
32830 66 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f  f(stderr, "optio
32840 6e 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 20  ns are:\n");.   
32850 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32860 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 66 72 65  derr, "    --fre
32870 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 5c 6e 22  elist-corrupt\n"
32880 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
32890 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
328a0 20 2d 2d 72 65 63 6f 76 65 72 79 2d 64 62 20 44   --recovery-db D
328b0 41 54 41 42 41 53 45 5c 6e 22 29 3b 0a 20 20 20  ATABASE\n");.   
328c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
328d0 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 6c 6f 73  derr, "    --los
328e0 74 2d 61 6e 64 2d 66 6f 75 6e 64 20 54 41 42 4c  t-and-found TABL
328f0 45 2d 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  E-NAME\n");.    
32900 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
32910 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 45 78  }.  }..  shellEx
32920 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
32930 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 2f 2a  >db, &rc,.    /*
32940 20 41 74 74 61 63 68 20 61 6e 20 69 6e 2d 6d 65   Attach an in-me
32950 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6e 61  mory database na
32960 6d 65 64 20 27 72 65 63 6f 76 65 72 79 27 2e 20  med 'recovery'. 
32970 43 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 65  Create an indexe
32980 64 20 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20  d .    ** cache 
32990 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 64 62  of the sqlite_db
329a0 70 74 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ptr virtual tabl
329b0 65 2e 20 2a 2f 0a 20 20 20 20 22 50 52 41 47 4d  e. */.    "PRAGM
329c0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
329d0 61 20 3d 20 6f 6e 3b 22 0a 20 20 20 20 22 41 54  a = on;".    "AT
329e0 54 41 43 48 20 25 51 20 41 53 20 72 65 63 6f 76  TACH %Q AS recov
329f0 65 72 79 3b 22 0a 20 20 20 20 22 44 52 4f 50 20  ery;".    "DROP 
32a00 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
32a10 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 3b 22  recovery.dbptr;"
32a20 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
32a30 20 49 46 20 45 58 49 53 54 53 20 72 65 63 6f 76   IF EXISTS recov
32a40 65 72 79 2e 66 72 65 65 6c 69 73 74 3b 22 0a 20  ery.freelist;". 
32a50 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49     "DROP TABLE I
32a60 46 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72  F EXISTS recover
32a70 79 2e 6d 61 70 3b 22 0a 20 20 20 20 22 44 52 4f  y.map;".    "DRO
32a80 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
32a90 53 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  S recovery.schem
32aa0 61 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  a;".    "CREATE 
32ab0 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 66  TABLE recovery.f
32ac0 72 65 65 6c 69 73 74 28 70 67 6e 6f 20 49 4e 54  reelist(pgno INT
32ad0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
32ae0 29 3b 22 2c 20 7a 52 65 63 6f 76 65 72 79 44 62  );", zRecoveryDb
32af0 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 62 46 72  .  );..  if( bFr
32b00 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 73 68  eelist ){.    sh
32b10 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d 3e  ellExec(pState->
32b20 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22  db, &rc,.      "
32b30 57 49 54 48 20 74 72 75 6e 6b 28 70 67 6e 6f 29  WITH trunk(pgno)
32b40 20 41 53 20 28 22 0a 20 20 20 20 20 20 22 20 20   AS (".      "  
32b50 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74  SELECT shell_int
32b60 33 32 28 22 0a 20 20 20 20 20 20 22 20 20 20 20  32(".      "    
32b70 20 20 28 53 45 4c 45 43 54 20 64 61 74 61 20 46    (SELECT data F
32b80 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67  ROM sqlite_dbpag
32b90 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 29 2c  e WHERE pgno=1),
32ba0 20 38 29 20 41 53 20 78 20 22 0a 20 20 20 20 20   8) AS x ".     
32bb0 20 22 20 20 20 20 20 20 57 48 45 52 45 20 78 3e   "      WHERE x>
32bc0 30 22 0a 20 20 20 20 20 20 22 20 20 20 20 55 4e  0".      "    UN
32bd0 49 4f 4e 22 0a 20 20 20 20 20 20 22 20 20 53 45  ION".      "  SE
32be0 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74 33 32  LECT shell_int32
32bf0 28 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20  (".      "      
32c00 28 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f  (SELECT data FRO
32c10 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 20  M sqlite_dbpage 
32c20 57 48 45 52 45 20 70 67 6e 6f 3d 74 72 75 6e 6b  WHERE pgno=trunk
32c30 2e 70 67 6e 6f 29 2c 20 30 29 20 41 53 20 78 20  .pgno), 0) AS x 
32c40 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 46  ".      "      F
32c50 52 4f 4d 20 74 72 75 6e 6b 20 57 48 45 52 45 20  ROM trunk WHERE 
32c60 78 3e 30 22 0a 20 20 20 20 20 20 22 29 2c 22 0a  x>0".      "),".
32c70 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 28        "freelist(
32c80 64 61 74 61 2c 20 6e 2c 20 66 72 65 65 70 67 6e  data, n, freepgn
32c90 6f 29 20 41 53 20 28 22 0a 20 20 20 20 20 20 22  o) AS (".      "
32ca0 20 20 53 45 4c 45 43 54 20 64 61 74 61 2c 20 6d    SELECT data, m
32cb0 69 6e 28 31 36 33 38 34 2c 20 73 68 65 6c 6c 5f  in(16384, shell_
32cc0 69 6e 74 33 32 28 64 61 74 61 2c 20 31 29 2d 31  int32(data, 1)-1
32cd0 29 2c 20 74 2e 70 67 6e 6f 20 22 0a 20 20 20 20  ), t.pgno ".    
32ce0 20 20 22 20 20 20 20 20 20 46 52 4f 4d 20 74 72    "      FROM tr
32cf0 75 6e 6b 20 74 2c 20 73 71 6c 69 74 65 5f 64 62  unk t, sqlite_db
32d00 70 61 67 65 20 73 20 57 48 45 52 45 20 73 2e 70  page s WHERE s.p
32d10 67 6e 6f 3d 74 2e 70 67 6e 6f 22 0a 20 20 20 20  gno=t.pgno".    
32d20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c    "    UNION ALL
32d30 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43  ".      "  SELEC
32d40 54 20 64 61 74 61 2c 20 6e 2d 31 2c 20 73 68 65  T data, n-1, she
32d50 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61 2c 20 32  ll_int32(data, 2
32d60 2b 6e 29 20 22 0a 20 20 20 20 20 20 22 20 20 20  +n) ".      "   
32d70 20 20 20 46 52 4f 4d 20 66 72 65 65 6c 69 73 74     FROM freelist
32d80 20 57 48 45 52 45 20 6e 3e 3d 30 22 0a 20 20 20   WHERE n>=0".   
32d90 20 20 20 22 29 22 0a 20 20 20 20 20 20 22 52 45     ")".      "RE
32da0 50 4c 41 43 45 20 49 4e 54 4f 20 72 65 63 6f 76  PLACE INTO recov
32db0 65 72 79 2e 66 72 65 65 6c 69 73 74 20 53 45 4c  ery.freelist SEL
32dc0 45 43 54 20 66 72 65 65 70 67 6e 6f 20 46 52 4f  ECT freepgno FRO
32dd0 4d 20 66 72 65 65 6c 69 73 74 3b 22 0a 20 20 20  M freelist;".   
32de0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
32df0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
32e00 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
32e10 2c 20 61 64 64 20 61 6c 6c 20 70 6f 69 6e 74 65  , add all pointe
32e20 72 2d 6d 61 70 20 70 61 67 65 73 20 74 6f 0a 20  r-map pages to. 
32e30 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
32e40 20 74 61 62 6c 65 2e 20 44 6f 20 74 68 69 73 20   table. Do this 
32e50 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
32e60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 0a 20 20  ether or not .  
32e70 2a 2a 20 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f  ** --freelist-co
32e80 72 72 75 70 74 20 77 61 73 20 73 70 65 63 69 66  rrupt was specif
32e90 69 65 64 2e 20 20 2a 2f 0a 20 20 73 68 65 6c 6c  ied.  */.  shell
32ea0 45 78 65 63 28 70 53 74 61 74 65 2d 3e 64 62 2c  Exec(pState->db,
32eb0 20 26 72 63 2c 20 0a 20 20 20 20 22 57 49 54 48   &rc, .    "WITH
32ec0 20 70 74 72 6d 61 70 28 70 67 6e 6f 29 20 41 53   ptrmap(pgno) AS
32ed0 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43   (".    "  SELEC
32ee0 54 20 32 20 57 48 45 52 45 20 73 68 65 6c 6c 5f  T 2 WHERE shell_
32ef0 69 6e 74 33 32 28 22 0a 20 20 20 20 22 20 20 20  int32(".    "   
32f00 20 28 53 45 4c 45 43 54 20 64 61 74 61 20 46 52   (SELECT data FR
32f10 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
32f20 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 29 2c 20   WHERE pgno=1), 
32f30 31 33 22 0a 20 20 20 20 22 20 20 29 22 0a 20 20  13".    "  )".  
32f40 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c    "    UNION ALL
32f50 20 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54   ".    "  SELECT
32f60 20 70 67 6e 6f 2b 31 2b 28 53 45 4c 45 43 54 20   pgno+1+(SELECT 
32f70 70 61 67 65 5f 73 69 7a 65 20 46 52 4f 4d 20 70  page_size FROM p
32f80 72 61 67 6d 61 5f 70 61 67 65 5f 73 69 7a 65 29  ragma_page_size)
32f90 2f 35 20 41 53 20 70 70 20 22 0a 20 20 20 20 22  /5 AS pp ".    "
32fa0 20 20 46 52 4f 4d 20 70 74 72 6d 61 70 20 57 48    FROM ptrmap WH
32fb0 45 52 45 20 70 70 3c 3d 28 53 45 4c 45 43 54 20  ERE pp<=(SELECT 
32fc0 70 61 67 65 5f 63 6f 75 6e 74 20 46 52 4f 4d 20  page_count FROM 
32fd0 70 72 61 67 6d 61 5f 70 61 67 65 5f 63 6f 75 6e  pragma_page_coun
32fe0 74 29 22 0a 20 20 20 20 22 29 22 0a 20 20 20 20  t)".    ")".    
32ff0 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 72 65  "REPLACE INTO re
33000 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 20  covery.freelist 
33010 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
33020 20 70 74 72 6d 61 70 22 0a 20 20 29 3b 0a 0a 20   ptrmap".  );.. 
33030 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74   shellExec(pStat
33040 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20  e->db, &rc, .   
33050 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72   "CREATE TABLE r
33060 65 63 6f 76 65 72 79 2e 64 62 70 74 72 28 22 0a  ecovery.dbptr(".
33070 20 20 20 20 22 20 20 20 20 20 20 70 67 6e 6f 2c      "      pgno,
33080 20 63 68 69 6c 64 2c 20 50 52 49 4d 41 52 59 20   child, PRIMARY 
33090 4b 45 59 28 63 68 69 6c 64 2c 20 70 67 6e 6f 29  KEY(child, pgno)
330a0 22 0a 20 20 20 20 22 29 20 57 49 54 48 4f 55 54  ".    ") WITHOUT
330b0 20 52 4f 57 49 44 3b 22 0a 20 20 20 20 22 49 4e   ROWID;".    "IN
330c0 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
330d0 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 64 62 70  NTO recovery.dbp
330e0 74 72 28 70 67 6e 6f 2c 20 63 68 69 6c 64 29 20  tr(pgno, child) 
330f0 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
33100 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
33110 64 62 70 74 72 22 0a 20 20 20 20 22 20 20 20 20  dbptr".    "    
33120 20 20 57 48 45 52 45 20 70 67 6e 6f 20 4e 4f 54    WHERE pgno NOT
33130 20 49 4e 20 66 72 65 65 6c 69 73 74 20 41 4e 44   IN freelist AND
33140 20 63 68 69 6c 64 20 4e 4f 54 20 49 4e 20 66 72   child NOT IN fr
33150 65 65 6c 69 73 74 3b 22 0a 0a 20 20 20 20 2f 2a  eelist;"..    /*
33160 20 44 65 6c 65 74 65 20 61 6e 79 20 70 6f 69 6e   Delete any poin
33170 74 65 72 20 74 6f 20 70 61 67 65 20 31 2e 20 54  ter to page 1. T
33180 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
33190 20 70 61 67 65 20 31 20 69 73 20 63 6f 6e 73 69   page 1 is consi
331a0 64 65 72 65 64 0a 20 20 20 20 2a 2a 20 61 20 72  dered.    ** a r
331b0 6f 6f 74 20 70 61 67 65 2c 20 72 65 67 61 72 64  oot page, regard
331c0 6c 65 73 73 20 6f 66 20 68 6f 77 20 63 6f 72 72  less of how corr
331d0 75 70 74 20 74 68 65 20 64 62 20 69 73 2e 20 2a  upt the db is. *
331e0 2f 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46 52  /.    "DELETE FR
331f0 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74  OM recovery.dbpt
33200 72 20 57 48 45 52 45 20 63 68 69 6c 64 20 3d 20  r WHERE child = 
33210 31 3b 22 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65  1;"..    /* Dele
33220 74 65 20 61 6c 6c 20 70 6f 69 6e 74 65 72 73 20  te all pointers 
33230 74 6f 20 61 6e 79 20 70 61 67 65 73 20 74 68 61  to any pages tha
33240 74 20 68 61 76 65 20 6d 6f 72 65 20 74 68 61 6e  t have more than
33250 20 6f 6e 65 20 70 6f 69 6e 74 65 72 0a 20 20 20   one pointer.   
33260 20 2a 2a 20 74 6f 20 74 68 65 6d 2e 20 53 75 63   ** to them. Suc
33270 68 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  h pages will be 
33280 74 72 65 61 74 65 64 20 61 73 20 72 6f 6f 74 20  treated as root 
33290 70 61 67 65 73 20 77 68 65 6e 20 72 65 63 6f 76  pages when recov
332a0 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 64 61 74  ering.    ** dat
332b0 61 2e 20 20 2a 2f 0a 20 20 20 20 22 44 45 4c 45  a.  */.    "DELE
332c0 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  TE FROM recovery
332d0 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68 69  .dbptr WHERE chi
332e0 6c 64 20 49 4e 20 28 22 0a 20 20 20 20 22 20 20  ld IN (".    "  
332f0 53 45 4c 45 43 54 20 63 68 69 6c 64 20 46 52 4f  SELECT child FRO
33300 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  M recovery.dbptr
33310 20 47 52 4f 55 50 20 42 59 20 63 68 69 6c 64 20   GROUP BY child 
33320 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e  HAVING count(*)>
33330 31 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20 20  1".    ");"..   
33340 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 22   /* Create the "
33350 6d 61 70 22 20 74 61 62 6c 65 20 74 68 61 74 20  map" table that 
33360 77 69 6c 6c 20 28 65 76 65 6e 74 75 61 6c 6c 79  will (eventually
33370 29 20 63 6f 6e 74 61 69 6e 20 69 6e 73 74 72 75  ) contain instru
33380 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f  ctions.    ** fo
33390 72 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 65  r dealing with e
333a0 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
333b0 64 62 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  db that contains
333c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20   one or more .  
333d0 20 20 2a 2a 20 72 65 63 6f 72 64 73 2e 20 2a 2f    ** records. */
333e0 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
333f0 4c 45 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 28  LE recovery.map(
33400 22 0a 20 20 20 20 20 20 22 70 67 6e 6f 20 49 4e  ".      "pgno IN
33410 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
33420 59 2c 20 6d 61 78 6c 65 6e 20 49 4e 54 2c 20 69  Y, maxlen INT, i
33430 6e 74 6b 65 79 2c 20 72 6f 6f 74 20 49 4e 54 22  ntkey, root INT"
33440 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f  .    ");"..    /
33450 2a 20 50 6f 70 75 6c 61 74 65 20 74 61 62 6c 65  * Populate table
33460 20 5b 6d 61 70 5d 2e 20 49 66 20 74 68 65 72 65   [map]. If there
33470 20 61 72 65 20 63 69 72 63 75 6c 61 72 20 6c 6f   are circular lo
33480 6f 70 73 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ops of pages in 
33490 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
334a0 61 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ase, the followi
334b0 6e 67 20 61 64 64 73 20 61 6c 6c 20 70 61 67 65  ng adds all page
334c0 73 20 69 6e 20 73 75 63 68 20 61 20 6c 6f 6f 70  s in such a loop
334d0 20 74 6f 20 74 68 65 20 6d 61 70 0a 20 20 20 20   to the map.    
334e0 2a 2a 20 61 73 20 69 6e 64 69 76 69 64 75 61 6c  ** as individual
334f0 20 72 6f 6f 74 20 70 61 67 65 73 2e 20 54 68 69   root pages. Thi
33500 73 20 63 6f 75 6c 64 20 62 65 20 68 61 6e 64 6c  s could be handl
33510 65 64 20 62 65 74 74 65 72 2e 20 20 2a 2f 0a 20  ed better.  */. 
33520 20 20 20 22 57 49 54 48 20 70 61 67 65 73 28 69     "WITH pages(i
33530 2c 20 6d 61 78 6c 65 6e 29 20 41 53 20 28 22 0a  , maxlen) AS (".
33540 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 70 61      "  SELECT pa
33550 67 65 5f 63 6f 75 6e 74 2c 20 28 22 0a 20 20 20  ge_count, (".   
33560 20 22 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78   "    SELECT max
33570 28 66 69 65 6c 64 2b 31 29 20 46 52 4f 4d 20 73  (field+1) FROM s
33580 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48 45  qlite_dbdata WHE
33590 52 45 20 70 67 6e 6f 3d 70 61 67 65 5f 63 6f 75  RE pgno=page_cou
335a0 6e 74 22 0a 20 20 20 20 22 20 20 29 20 46 52 4f  nt".    "  ) FRO
335b0 4d 20 70 72 61 67 6d 61 5f 70 61 67 65 5f 63 6f  M pragma_page_co
335c0 75 6e 74 20 57 48 45 52 45 20 70 61 67 65 5f 63  unt WHERE page_c
335d0 6f 75 6e 74 3e 30 22 0a 20 20 20 20 22 20 20 20  ount>0".    "   
335e0 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20   UNION ALL".    
335f0 22 20 20 53 45 4c 45 43 54 20 69 2d 31 2c 20 28  "  SELECT i-1, (
33600 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
33610 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29 20 46  T max(field+1) F
33620 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74  ROM sqlite_dbdat
33630 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 69 2d 31  a WHERE pgno=i-1
33640 22 0a 20 20 20 20 22 20 20 29 20 46 52 4f 4d 20  ".    "  ) FROM 
33650 70 61 67 65 73 20 57 48 45 52 45 20 69 3e 3d 32  pages WHERE i>=2
33660 22 0a 20 20 20 20 22 29 22 0a 20 20 20 20 22 49  ".    ")".    "I
33670 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 63 6f 76  NSERT INTO recov
33680 65 72 79 2e 6d 61 70 28 70 67 6e 6f 2c 20 6d 61  ery.map(pgno, ma
33690 78 6c 65 6e 2c 20 69 6e 74 6b 65 79 2c 20 72 6f  xlen, intkey, ro
336a0 6f 74 29 20 22 0a 20 20 20 20 22 20 20 53 45 4c  ot) ".    "  SEL
336b0 45 43 54 20 69 2c 20 6d 61 78 6c 65 6e 2c 20 4e  ECT i, maxlen, N
336c0 55 4c 4c 2c 20 28 22 0a 20 20 20 20 22 20 20 20  ULL, (".    "   
336d0 20 57 49 54 48 20 70 28 6f 72 69 67 2c 20 70 67   WITH p(orig, pg
336e0 6e 6f 2c 20 70 61 72 65 6e 74 29 20 41 53 20 28  no, parent) AS (
336f0 22 0a 20 20 20 20 22 20 20 20 20 20 20 53 45 4c  ".    "      SEL
33700 45 43 54 20 30 2c 20 69 2c 20 28 53 45 4c 45 43  ECT 0, i, (SELEC
33710 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f  T pgno FROM reco
33720 76 65 72 79 2e 64 62 70 74 72 20 57 48 45 52 45  very.dbptr WHERE
33730 20 63 68 69 6c 64 3d 69 29 22 0a 20 20 20 20 22   child=i)".    "
33740 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 22 0a          UNION ".
33750 20 20 20 20 22 20 20 20 20 20 20 53 45 4c 45 43      "      SELEC
33760 54 20 69 2c 20 70 2e 70 61 72 65 6e 74 2c 20 22  T i, p.parent, "
33770 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 28 53  .    "        (S
33780 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
33790 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57  recovery.dbptr W
337a0 48 45 52 45 20 63 68 69 6c 64 3d 70 2e 70 61 72  HERE child=p.par
337b0 65 6e 74 29 20 46 52 4f 4d 20 70 22 0a 20 20 20  ent) FROM p".   
337c0 20 22 20 20 20 20 29 22 0a 20 20 20 20 22 20 20   "    )".    "  
337d0 20 20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52    SELECT pgno FR
337e0 4f 4d 20 70 20 57 48 45 52 45 20 28 70 61 72 65  OM p WHERE (pare
337f0 6e 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20 70 67  nt IS NULL OR pg
33800 6e 6f 20 3d 20 6f 72 69 67 29 22 0a 20 20 20 20  no = orig)".    
33810 22 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 70  ") ".    "FROM p
33820 61 67 65 73 20 57 48 45 52 45 20 6d 61 78 6c 65  ages WHERE maxle
33830 6e 20 3e 20 30 20 41 4e 44 20 69 20 4e 4f 54 20  n > 0 AND i NOT 
33840 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a 20 20  IN freelist;".  
33850 20 20 22 55 50 44 41 54 45 20 72 65 63 6f 76 65    "UPDATE recove
33860 72 79 2e 6d 61 70 20 41 53 20 6f 20 53 45 54 20  ry.map AS o SET 
33870 69 6e 74 6b 65 79 20 3d 20 28 22 0a 20 20 20 20  intkey = (".    
33880 22 20 20 53 45 4c 45 43 54 20 73 75 62 73 74 72  "  SELECT substr
33890 28 64 61 74 61 2c 20 31 2c 20 31 29 3d 3d 58 27  (data, 1, 1)==X'
338a0 30 44 27 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  0D' FROM sqlite_
338b0 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e  dbpage WHERE pgn
338c0 6f 3d 6f 2e 70 67 6e 6f 22 0a 20 20 20 20 22 29  o=o.pgno".    ")
338d0 3b 22 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  ;"..    /* Extra
338e0 63 74 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  ct data from pag
338f0 65 20 31 20 61 6e 64 20 61 6e 79 20 6c 69 6e 6b  e 1 and any link
33900 65 64 20 70 61 67 65 73 20 69 6e 74 6f 20 74 61  ed pages into ta
33910 62 6c 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 76  ble.    ** recov
33920 65 72 79 2e 73 63 68 65 6d 61 2e 20 57 69 74 68  ery.schema. With
33930 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
33940 20 61 73 20 61 6e 20 73 71 6c 69 74 65 5f 6d 61   as an sqlite_ma
33950 73 74 65 72 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  ster table.  */.
33960 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
33970 45 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  E recovery.schem
33980 61 28 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74 62  a(type, name, tb
33990 6c 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  l_name, rootpage
339a0 2c 20 73 71 6c 29 3b 22 0a 20 20 20 20 22 49 4e  , sql);".    "IN
339b0 53 45 52 54 20 49 4e 54 4f 20 72 65 63 6f 76 65  SERT INTO recove
339c0 72 79 2e 73 63 68 65 6d 61 20 53 45 4c 45 43 54  ry.schema SELECT
339d0 20 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41   ".    "  max(CA
339e0 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 30 20  SE WHEN field=0 
339f0 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20  THEN value ELSE 
33a00 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20  NULL END),".    
33a10 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e  "  max(CASE WHEN
33a20 20 66 69 65 6c 64 3d 31 20 54 48 45 4e 20 76 61   field=1 THEN va
33a30 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e  lue ELSE NULL EN
33a40 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28  D),".    "  max(
33a50 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d  CASE WHEN field=
33a60 32 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53  2 THEN value ELS
33a70 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20  E NULL END),".  
33a80 20 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48    "  max(CASE WH
33a90 45 4e 20 66 69 65 6c 64 3d 33 20 54 48 45 4e 20  EN field=3 THEN 
33aa0 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20  value ELSE NULL 
33ab0 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61  END),".    "  ma
33ac0 78 28 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c  x(CASE WHEN fiel
33ad0 64 3d 34 20 54 48 45 4e 20 76 61 6c 75 65 20 45  d=4 THEN value E
33ae0 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 22 0a 20  LSE NULL END)". 
33af0 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
33b00 64 62 64 61 74 61 20 57 48 45 52 45 20 70 67 6e  dbdata WHERE pgn
33b10 6f 20 49 4e 20 28 22 0a 20 20 20 20 22 20 20 53  o IN (".    "  S
33b20 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
33b30 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45  recovery.map WHE
33b40 52 45 20 72 6f 6f 74 3d 31 22 0a 20 20 20 20 22  RE root=1".    "
33b50 29 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59  )".    "GROUP BY
33b60 20 70 67 6e 6f 2c 20 63 65 6c 6c 3b 22 0a 20 20   pgno, cell;".  
33b70 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
33b80 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 5f  recovery.schema_
33b90 72 6f 6f 74 70 61 67 65 20 4f 4e 20 73 63 68 65  rootpage ON sche
33ba0 6d 61 28 72 6f 6f 74 70 61 67 65 29 3b 22 0a 20  ma(rootpage);". 
33bb0 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61   );..  /* Open a
33bc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
33bd0 65 6e 20 70 72 69 6e 74 20 6f 75 74 20 61 6c 6c  en print out all
33be0 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 2c 20 6e 6f   non-virtual, no
33bf0 6e 2d 22 73 71 6c 69 74 65 5f 25 22 20 0a 20 20  n-"sqlite_%" .  
33c00 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
33c10 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
33c20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
33c30 68 65 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  he existing sche
33c40 6d 61 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  ma.  */.  if( rc
33c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33c60 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
33c70 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
33c80 2f 2a 20 22 2e 72 65 63 6f 76 65 72 22 20 6d 69  /* ".recover" mi
33c90 67 68 74 20 6f 75 74 70 75 74 20 63 6f 6e 74 65  ght output conte
33ca0 6e 74 20 69 6e 20 61 6e 20 6f 72 64 65 72 20 77  nt in an order w
33cb0 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65  hich causes imme
33cc0 64 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6f 72  diate.    ** for
33cd0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
33ce0 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61  ints to be viola
33cf0 74 65 64 2e 20 53 6f 20 64 69 73 61 62 6c 65 20  ted. So disable 
33d00 66 6f 72 65 69 67 6e 2d 6b 65 79 0a 20 20 20 20  foreign-key.    
33d10 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e  ** constraint en
33d20 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65  forcement to pre
33d30 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 20 77 68  vent problems wh
33d40 65 6e 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6f  en running the o
33d50 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 63 72  utput.    ** scr
33d60 69 70 74 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f  ipt. */.    raw_
33d70 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
33d80 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  ut, "PRAGMA fore
33d90 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22  ign_keys=OFF;\n"
33da0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
33db0 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
33dc0 42 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  BEGIN;\n");.    
33dd0 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
33de0 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  e->out, "PRAGMA 
33df0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
33e00 3d 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 73  = on;\n");.    s
33e10 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61  hellPrepare(pSta
33e20 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20  te->db, &rc,.   
33e30 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
33e40 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73   FROM recovery.s
33e50 63 68 65 6d 61 20 22 0a 20 20 20 20 20 20 20 20  chema ".        
33e60 22 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62  "WHERE type='tab
33e70 6c 65 27 20 41 4e 44 20 73 71 6c 20 4c 49 4b 45  le' AND sql LIKE
33e80 20 27 63 72 65 61 74 65 20 74 61 62 6c 65 25 27   'create table%'
33e90 22 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b  ", &pStmt.    );
33ea0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
33eb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
33ec0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
33ed0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
33ee0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
33ef0 20 2a 7a 43 72 65 61 74 65 54 61 62 6c 65 20 3d   *zCreateTable =
33f00 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
33f10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
33f20 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
33f30 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
33f40 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43 52 45 41  tate->out, "CREA
33f50 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
33f60 45 58 49 53 54 53 20 25 73 3b 5c 6e 22 2c 20 0a  EXISTS %s;\n", .
33f70 20 20 20 20 20 20 20 20 20 20 26 7a 43 72 65 61            &zCrea
33f80 74 65 54 61 62 6c 65 5b 31 32 5d 0a 20 20 20 20  teTable[12].    
33f90 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
33fa0 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
33fb0 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20  , pStmt);.  }.. 
33fc0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
33fd0 66 20 61 6e 20 6f 72 70 68 61 6e 20 74 61 62 6c  f an orphan tabl
33fe0 65 20 77 69 6c 6c 20 62 65 20 72 65 71 75 69 72  e will be requir
33ff0 65 64 2e 20 41 6e 64 20 69 66 20 73 6f 2c 20 68  ed. And if so, h
34000 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 73 65  ow many.  ** use
34010 72 20 63 6f 6c 75 6d 6e 73 20 69 74 20 73 68 6f  r columns it sho
34020 75 6c 64 20 63 6f 6e 74 61 69 6e 20 2a 2f 0a 20  uld contain */. 
34030 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53   shellPrepare(pS
34040 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a  tate->db, &rc, .
34050 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
34060 61 6c 65 73 63 65 28 6d 61 78 28 6d 61 78 6c 65  alesce(max(maxle
34070 6e 29 2c 20 2d 32 29 20 46 52 4f 4d 20 72 65 63  n), -2) FROM rec
34080 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20  overy.map WHERE 
34090 72 6f 6f 74 3e 31 22 0a 20 20 20 20 20 20 2c 20  root>1".      , 
340a0 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20 20 69 66  &pLoop.  );.  if
340b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
340c0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
340d0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f  qlite3_step(pLoo
340e0 70 29 20 29 7b 0a 20 20 20 20 6e 4f 72 70 68 61  p) ){.    nOrpha
340f0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
34100 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29  mn_int(pLoop, 0)
34110 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e  ;.  }.  shellFin
34120 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f 70  alize(&rc, pLoop
34130 29 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 30 3b 0a  );.  pLoop = 0;.
34140 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28  .  shellPrepare(
34150 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
34160 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70  .      "SELECT p
34170 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  gno FROM recover
34180 79 2e 6d 61 70 20 57 48 45 52 45 20 72 6f 6f 74  y.map WHERE root
34190 3d 3f 22 2c 20 26 70 50 61 67 65 73 0a 20 20 29  =?", &pPages.  )
341a0 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ;.  shellPrepare
341b0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
341c0 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ,.      "SELECT 
341d0 6d 61 78 28 66 69 65 6c 64 29 2c 20 67 72 6f 75  max(field), grou
341e0 70 5f 63 6f 6e 63 61 74 28 73 68 65 6c 6c 5f 65  p_concat(shell_e
341f0 73 63 61 70 65 5f 63 72 6e 6c 28 71 75 6f 74 65  scape_crnl(quote
34200 28 76 61 6c 75 65 29 29 2c 20 27 2c 20 27 29 22  (value)), ', ')"
34210 0a 20 20 20 20 20 20 22 2c 20 6d 69 6e 28 66 69  .      ", min(fi
34220 65 6c 64 29 20 22 0a 20 20 20 20 20 20 22 46 52  eld) ".      "FR
34230 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61  OM sqlite_dbdata
34240 20 57 48 45 52 45 20 70 67 6e 6f 20 3d 20 3f 20   WHERE pgno = ? 
34250 41 4e 44 20 66 69 65 6c 64 20 21 3d 20 3f 22 0a  AND field != ?".
34260 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20        "GROUP BY 
34270 63 65 6c 6c 22 2c 20 26 70 43 65 6c 6c 73 0a 20  cell", &pCells. 
34280 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   );..  /* Loop t
34290 68 72 6f 75 67 68 20 65 61 63 68 20 72 6f 6f 74  hrough each root
342a0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 73 68 65 6c   page. */.  shel
342b0 6c 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d  lPrepare(pState-
342c0 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20  >db, &rc, .     
342d0 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 2c 20 69   "SELECT root, i
342e0 6e 74 6b 65 79 2c 20 6d 61 78 28 6d 61 78 6c 65  ntkey, max(maxle
342f0 6e 29 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  n) FROM recovery
34300 2e 6d 61 70 22 20 0a 20 20 20 20 20 20 22 20 57  .map" .      " W
34310 48 45 52 45 20 72 6f 6f 74 3e 31 20 47 52 4f 55  HERE root>1 GROU
34320 50 20 42 59 20 72 6f 6f 74 2c 20 69 6e 74 6b 65  P BY root, intke
34330 79 20 4f 52 44 45 52 20 42 59 20 72 6f 6f 74 3d  y ORDER BY root=
34340 28 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45  (".      "  SELE
34350 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
34360 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
34370 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c   WHERE name='sql
34380 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
34390 20 20 20 20 20 22 29 22 2c 20 26 70 4c 6f 6f 70       ")", &pLoop
343a0 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  .  );.  while( r
343b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
343c0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
343d0 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20  te3_step(pLoop) 
343e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f 6f 74  ){.    int iRoot
343f0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
34400 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b  n_int(pLoop, 0);
34410 0a 20 20 20 20 69 6e 74 20 62 49 6e 74 6b 65 79  .    int bIntkey
34420 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
34430 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 31 29 3b  n_int(pLoop, 1);
34440 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
34450 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
34460 6e 74 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20 20  nt(pLoop, 2);.  
34470 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30 3b    int bNoop = 0;
34480 0a 20 20 20 20 52 65 63 6f 76 65 72 54 61 62 6c  .    RecoverTabl
34490 65 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20 61 73  e *pTab;..    as
344a0 73 65 72 74 28 20 62 49 6e 74 6b 65 79 3d 3d 30  sert( bIntkey==0
344b0 20 7c 7c 20 62 49 6e 74 6b 65 79 3d 3d 31 20 29   || bIntkey==1 )
344c0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 72 65 63  ;.    pTab = rec
344d0 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28 70 53  overFindTable(pS
344e0 74 61 74 65 2c 20 26 72 63 2c 20 69 52 6f 6f 74  tate, &rc, iRoot
344f0 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c 2c  , bIntkey, nCol,
34500 20 26 62 4e 6f 6f 70 29 3b 0a 20 20 20 20 69 66   &bNoop);.    if
34510 28 20 62 4e 6f 6f 70 20 7c 7c 20 72 63 20 29 20  ( bNoop || rc ) 
34520 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
34530 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
34540 20 20 20 69 66 28 20 70 4f 72 70 68 61 6e 3d 3d     if( pOrphan==
34550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  0 ){.        pOr
34560 70 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72  phan = recoverOr
34570 70 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74 65  phanTable(pState
34580 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46  , &rc, zLostAndF
34590 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a  ound, nOrphan);.
345a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
345b0 61 62 20 3d 20 70 4f 72 70 68 61 6e 3b 0a 20 20  ab = pOrphan;.  
345c0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
345d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ) break;.    }..
345e0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
345f0 65 33 5f 73 74 72 69 63 6d 70 28 70 54 61 62 2d  e3_stricmp(pTab-
34600 3e 7a 51 75 6f 74 65 64 2c 20 22 5c 22 73 71 6c  >zQuoted, "\"sql
34610 69 74 65 5f 73 65 71 75 65 6e 63 65 5c 22 22 29  ite_sequence\"")
34620 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
34630 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
34640 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
34650 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
34660 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n");.    }.    s
34670 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
34680 70 50 61 67 65 73 2c 20 31 2c 20 69 52 6f 6f 74  pPages, 1, iRoot
34690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
346a0 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  ind_int(pCells, 
346b0 32 2c 20 70 54 61 62 2d 3e 69 50 6b 29 3b 0a 0a  2, pTab->iPk);..
346c0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
346d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
346e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
346f0 73 74 65 70 28 70 50 61 67 65 73 29 20 29 7b 0a  step(pPages) ){.
34700 20 20 20 20 20 20 69 6e 74 20 69 50 67 6e 6f 20        int iPgno 
34710 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
34720 5f 69 6e 74 28 70 50 61 67 65 73 2c 20 30 29 3b  _int(pPages, 0);
34730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
34740 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  ind_int(pCells, 
34750 31 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20  1, iPgno);.     
34760 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
34770 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
34780 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
34790 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a 20 20 20  p(pCells) ){.   
347a0 20 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 20       int nField 
347b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
347c0 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20 30 29 3b  _int(pCells, 0);
347d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d 69  .        int iMi
347e0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
347f0 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20 32  mn_int(pCells, 2
34800 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
34810 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 28 63   char *zVal = (c
34820 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
34830 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
34840 43 65 6c 6c 73 2c 20 31 29 3b 0a 0a 20 20 20 20  Cells, 1);..    
34850 20 20 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65      RecoverTable
34860 20 2a 70 54 61 62 32 20 3d 20 70 54 61 62 3b 0a   *pTab2 = pTab;.
34870 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
34880 21 3d 70 4f 72 70 68 61 6e 20 26 26 20 28 69 4d  !=pOrphan && (iM
34890 69 6e 3c 30 29 21 3d 62 49 6e 74 6b 65 79 20 29  in<0)!=bIntkey )
348a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
348b0 70 4f 72 70 68 61 6e 3d 3d 30 20 29 7b 0a 20 20  pOrphan==0 ){.  
348c0 20 20 20 20 20 20 20 20 20 20 70 4f 72 70 68 61            pOrpha
348d0 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72 70 68 61  n = recoverOrpha
348e0 6e 54 61 62 6c 65 28 70 53 74 61 74 65 2c 20 26  nTable(pState, &
348f0 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e  rc, zLostAndFoun
34900 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a 20 20 20  d, nOrphan);.   
34910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34920 20 20 20 70 54 61 62 32 20 3d 20 70 4f 72 70 68     pTab2 = pOrph
34930 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  an;.          if
34940 28 20 70 54 61 62 32 3d 3d 30 20 29 20 62 72 65  ( pTab2==0 ) bre
34950 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ak;.        }.. 
34960 20 20 20 20 20 20 20 6e 46 69 65 6c 64 20 3d 20         nField = 
34970 6e 46 69 65 6c 64 2b 31 3b 0a 20 20 20 20 20 20  nField+1;.      
34980 20 20 69 66 28 20 70 54 61 62 32 3d 3d 70 4f 72    if( pTab2==pOr
34990 70 68 61 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  phan ){.        
349a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
349b0 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20 20 20 20  ate->out, .     
349c0 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
349d0 20 49 4e 54 4f 20 25 73 20 56 41 4c 55 45 53 28   INTO %s VALUES(
349e0 25 64 2c 20 25 64 2c 20 25 64 2c 20 25 73 25 73  %d, %d, %d, %s%s
349f0 25 73 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s);\n",.       
34a00 20 20 20 20 20 20 20 70 54 61 62 32 2d 3e 7a 51         pTab2->zQ
34a10 75 6f 74 65 64 2c 20 69 52 6f 6f 74 2c 20 69 50  uoted, iRoot, iP
34a20 67 6e 6f 2c 20 6e 46 69 65 6c 64 2c 0a 20 20 20  gno, nField,.   
34a30 20 20 20 20 20 20 20 20 20 20 20 69 4d 69 6e 3c             iMin<
34a40 30 20 3f 20 22 22 20 3a 20 22 4e 55 4c 4c 2c 20  0 ? "" : "NULL, 
34a50 22 2c 20 7a 56 61 6c 2c 20 70 54 61 62 32 2d 3e  ", zVal, pTab2->
34a60 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c 64 5d 0a 20  azlCol[nField]. 
34a70 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
34a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34a90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34aa0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 49 4e  pState->out, "IN
34ab0 53 45 52 54 20 49 4e 54 4f 20 25 73 28 25 73 29  SERT INTO %s(%s)
34ac0 20 56 41 4c 55 45 53 28 20 25 73 20 29 3b 5c 6e   VALUES( %s );\n
34ad0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
34ae0 20 20 70 54 61 62 32 2d 3e 7a 51 75 6f 74 65 64    pTab2->zQuoted
34af0 2c 20 70 54 61 62 32 2d 3e 61 7a 6c 43 6f 6c 5b  , pTab2->azlCol[
34b00 6e 46 69 65 6c 64 5d 2c 20 7a 56 61 6c 0a 20 20  nField], zVal.  
34b10 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
34b20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34b30 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72     shellReset(&r
34b40 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20 20 20  c, pCells);.    
34b50 7d 0a 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74  }.    shellReset
34b60 28 26 72 63 2c 20 70 50 61 67 65 73 29 3b 0a 20  (&rc, pPages);. 
34b70 20 20 20 69 66 28 20 70 54 61 62 21 3d 70 4f 72     if( pTab!=pOr
34b80 70 68 61 6e 20 29 20 72 65 63 6f 76 65 72 46 72  phan ) recoverFr
34b90 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20  eeTable(pTab);. 
34ba0 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69   }.  shellFinali
34bb0 7a 65 28 26 72 63 2c 20 70 4c 6f 6f 70 29 3b 0a  ze(&rc, pLoop);.
34bc0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
34bd0 26 72 63 2c 20 70 50 61 67 65 73 29 3b 0a 20 20  &rc, pPages);.  
34be0 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
34bf0 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20 72 65  c, pCells);.  re
34c00 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28 70  coverFreeTable(p
34c10 4f 72 70 68 61 6e 29 3b 0a 0a 20 20 2f 2a 20 54  Orphan);..  /* T
34c20 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 73  he rest of the s
34c30 63 68 65 6d 61 20 2a 2f 0a 20 20 69 66 28 20 72  chema */.  if( r
34c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34c50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
34c60 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
34c70 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53   shellPrepare(pS
34c80 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a  tate->db, &rc, .
34c90 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
34ca0 73 71 6c 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 72  sql, name FROM r
34cb0 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 22  ecovery.schema "
34cc0 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
34cd0 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27 63 72  sql NOT LIKE 'cr
34ce0 65 61 74 65 20 74 61 62 6c 65 25 27 22 2c 20 26  eate table%'", &
34cf0 70 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  pStmt.    );.   
34d00 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
34d10 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
34d20 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
34d30 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
34d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
34d50 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
34d60 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
34d70 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
34d80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
34d90 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 53 71 6c  e3_strnicmp(zSql
34da0 2c 20 22 63 72 65 61 74 65 20 76 69 72 74 22 2c  , "create virt",
34db0 20 31 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   11)==0 ){.     
34dc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
34dd0 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
34de0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
34df0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
34e00 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  );.        char 
34e10 2a 7a 50 72 69 6e 74 20 3d 20 73 68 65 6c 6c 4d  *zPrint = shellM
34e20 50 72 69 6e 74 66 28 26 72 63 2c 20 0a 20 20 20  Printf(&rc, .   
34e30 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
34e40 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  NTO sqlite_maste
34e50 72 20 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27  r VALUES('table'
34e60 2c 20 25 51 2c 20 25 51 2c 20 30 2c 20 25 51 29  , %Q, %Q, 0, %Q)
34e70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  ",.          zNa
34e80 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 0a  me, zName, zSql.
34e90 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
34ea0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
34eb0 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c  tate->out, "%s;\
34ec0 6e 22 2c 20 7a 50 72 69 6e 74 29 3b 0a 20 20 20  n", zPrint);.   
34ed0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
34ee0 65 28 7a 50 72 69 6e 74 29 3b 0a 20 20 20 20 20  e(zPrint);.     
34ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34f00 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
34f10 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  e->out, "%s;\n",
34f20 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
34f30 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46      }.    shellF
34f40 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74  inalize(&rc, pSt
34f50 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  mt);.  }..  if( 
34f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34f70 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
34f80 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52  pState->out, "PR
34f90 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
34fa0 68 65 6d 61 20 3d 20 6f 66 66 3b 5c 6e 22 29 3b  hema = off;\n");
34fb0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
34fc0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43 4f  pState->out, "CO
34fd0 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 20  MMIT;\n");.  }. 
34fe0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 53   sqlite3_exec(pS
34ff0 74 61 74 65 2d 3e 64 62 2c 20 22 44 45 54 41 43  tate->db, "DETAC
35000 48 20 72 65 63 6f 76 65 72 79 22 2c 20 30 2c 20  H recovery", 0, 
35010 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
35020 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
35030 21 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  !(SQLITE_OMIT_VI
35040 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
35050 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
35060 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
35070 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ) */.../*.** If 
35080 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65  an input line be
35090 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68  gins with "." th
350a0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  en invoke this r
350b0 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f  outine to.** pro
350c0 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a  cess that line..
350d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f  **.** Return 1 o
350e0 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78  n error, 2 to ex
350f0 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77  it, and 0 otherw
35100 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
35110 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61  nt do_meta_comma
35120 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20  nd(char *zLine, 
35130 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
35140 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69    int h = 1;.  i
35150 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69  nt nArg = 0;.  i
35160 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72  nt n, c;.  int r
35170 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61  c = 0;.  char *a
35180 7a 41 72 67 5b 35 32 5d 3b 0a 0a 23 69 66 6e 64  zArg[52];..#ifnd
35190 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
351a0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
351b0 28 20 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ( p->expert.pExp
351c0 65 72 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72  ert ){.    exper
351d0 74 46 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29  tFinish(p, 1, 0)
351e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
351f0 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
35200 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b  ut line into tok
35210 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ens..  */.  whil
35220 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e  e( zLine[h] && n
35230 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  Arg<ArraySize(az
35240 41 72 67 29 2d 31 20 29 7b 0a 20 20 20 20 77 68  Arg)-1 ){.    wh
35250 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
35260 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d  ne[h]) ){ h++; }
35270 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
35280 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
35290 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
352a0 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d  '\'' || zLine[h]
352b0 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69  =='"' ){.      i
352c0 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65  nt delim = zLine
352d0 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41  [h++];.      azA
352e0 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
352f0 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
35300 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
35310 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d   zLine[h]!=delim
35320 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35330 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26  zLine[h]=='\\' &
35340 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20  & delim=='"' && 
35350 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20  zLine[h+1]!=0 ) 
35360 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b  h++;.        h++
35370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35380 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65  if( zLine[h]==de
35390 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  lim ){.        z
353a0 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
353b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
353c0 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65   delim=='"' ) re
353d0 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
353e0 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29  s(azArg[nArg-1])
353f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35400 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
35410 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
35420 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
35430 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65 28  [h] && !IsSpace(
35440 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
35450 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ; }.      if( zL
35460 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68  ine[h] ) zLine[h
35470 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ++] = 0;.      r
35480 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
35490 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
354a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
354b0 7a 41 72 67 5b 6e 41 72 67 5d 20 3d 20 30 3b 0a  zArg[nArg] = 0;.
354c0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
354d0 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20  e input line..  
354e0 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  */.  if( nArg==0
354f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
35500 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72  no tokens, no er
35510 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72  ror */.  n = str
35520 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b  len30(azArg[0]);
35530 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b  .  c = azArg[0][
35540 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  0];.  clearTempF
35550 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66  ile(p);..#ifndef
35560 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
35570 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
35580 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
35590 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75  mp(azArg[0], "au
355a0 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  th", n)==0 ){.  
355b0 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
355c0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
355d0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
355e0 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e  : .auth ON|OFF\n
355f0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
35600 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
35610 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
35620 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
35630 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
35640 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
35650 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
35660 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
35670 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73  horizer(p->db, s
35680 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20  hellAuth, p);.  
35690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
356a0 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
356b0 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20  rizer(p->db, 0, 
356c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
356d0 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  e.#endif..#if !d
356e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
356f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
35700 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
35710 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20  TE_HAVE_ZLIB).  
35720 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
35730 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35740 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30  "archive", n)==0
35750 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
35760 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
35770 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  arDotCommand(p, 
35780 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  0, azArg, nArg);
35790 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
357a0 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26  .  if( (c=='b' &
357b0 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
357c0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63  p(azArg[0], "bac
357d0 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20  kup", n)==0).   
357e0 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e  || (c=='s' && n>
357f0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
35800 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20  Arg[0], "save", 
35810 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  n)==0).  ){.    
35820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
35830 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63  tFile = 0;.    c
35840 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
35850 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   0;.    sqlite3 
35860 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
35870 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
35880 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  kup;.    int j;.
35890 20 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20 3d      int bAsync =
358a0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
358b0 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
358c0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
358d0 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; j++){.      c
358e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
358f0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  zArg[j];.      i
35900 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
35910 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d          if( z[1]
35920 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
35930 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
35940 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30  z, "-append")==0
35950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56   ){.          zV
35960 66 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a  fs = "apndvfs";.
35970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
35980 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
35990 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d 30  (z, "-async")==0
359a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 41   ){.          bA
359b0 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  sync = 1;.      
359c0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
359d0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
359e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
359f0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
35a00 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d   %s\n", azArg[j]
35a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
35a20 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
35a30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
35a40 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
35a50 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
35a60 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
35a70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
35a80 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db==0 ){.       
35a90 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65   zDb = zDestFile
35aa0 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  ;.        zDestF
35ab0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
35ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35ad0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35ae0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
35af0 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f 50  .backup ?DB? ?OP
35b00 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 5c  TIONS? FILENAME\
35b10 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
35b20 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
35b30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
35b40 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
35b50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35b60 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46  derr, "missing F
35b70 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74  ILENAME argument
35b80 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b   on .backup\n");
35b90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
35ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
35bb0 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d  Db==0 ) zDb = "m
35bc0 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73  ain";.    rc = s
35bd0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
35be0 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
35bf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
35c00 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
35c10 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
35c20 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a  E_OPEN_CREATE, z
35c30 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Vfs);.    if( rc
35c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35c50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35c60 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
35c70 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
35c80 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c  s\"\n", zDestFil
35c90 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  e);.      close_
35ca0 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  db(pDest);.     
35cb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
35cc0 0a 20 20 20 20 69 66 28 20 62 41 73 79 6e 63 20  .    if( bAsync 
35cd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35ce0 5f 65 78 65 63 28 70 44 65 73 74 2c 20 22 50 52  _exec(pDest, "PR
35cf0 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
35d00 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f 75  =OFF; PRAGMA jou
35d10 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22 2c  rnal_mode=OFF;",
35d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35d30 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
35d40 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
35d50 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
35d60 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
35d70 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
35d80 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a  "main", p->db, z
35d90 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
35da0 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
35db0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
35dc0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
35dd0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
35de0 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
35df0 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74    close_db(pDest
35e00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
35e10 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  1;.    }.    whi
35e20 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74  le(  (rc = sqlit
35e30 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
35e40 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
35e50 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20  LITE_OK ){}.    
35e60 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
35e70 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
35e80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35e90 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
35ea0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
35eb0 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
35ec0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35ed0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
35ee0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
35ef0 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
35f00 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  1;.    }.    clo
35f10 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20  se_db(pDest);.  
35f20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
35f30 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
35f40 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
35f50 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29   "bail", n)==0 )
35f60 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
35f70 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f  2 ){.      bail_
35f80 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65  on_error = boole
35f90 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
35fa0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35fb0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35fc0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
35fd0 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  bail on|off\n");
35fe0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
35ff0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
36000 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
36010 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
36020 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22  Arg[0], "binary"
36030 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
36040 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
36050 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56      if( booleanV
36060 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29  alue(azArg[1]) )
36070 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42 69 6e  {.        setBin
36080 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  aryMode(p->out, 
36090 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
360a0 0a 20 20 20 20 20 20 20 20 73 65 74 54 65 78 74  .        setText
360b0 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
360c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
360d0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
360e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
360f0 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c  age: .binary on|
36100 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
36110 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
36120 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
36130 63 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  c' && strcmp(azA
36140 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29  rg[0],"cd")==0 )
36150 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
36160 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  2 ){.#if defined
36170 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
36180 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20  ned(WIN32).     
36190 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
361a0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
361b0 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72  _to_unicode(azAr
361c0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
361d0 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44 69 72  = !SetCurrentDir
361e0 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20  ectoryW(z);.    
361f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
36200 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
36210 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b  c = chdir(azArg[
36220 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1]);.#endif.    
36230 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36240 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36250 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20  stderr, "Cannot 
36260 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  change to direct
36270 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  ory \"%s\"\n", a
36280 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
36290 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
362a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
362b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
362c0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
362d0 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b  d DIRECTORY\n");
362e0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
362f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
36300 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e  /* The undocumen
36310 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74  ted ".breakpoint
36320 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73  " command causes
36330 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e   a call to the n
36340 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  o-op.  ** routin
36350 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65  e named test_bre
36360 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a  akpoint()..  */.
36370 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
36380 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
36390 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b  azArg[0], "break
363a0 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  point", n)==0 ){
363b0 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70  .    test_breakp
363c0 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a  oint();.  }else.
363d0 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
363e0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
363f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e  (azArg[0], "chan
36400 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ges", n)==0 ){. 
36410 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
36420 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65  {.      setOrCle
36430 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
36440 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a  CountChanges, az
36450 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
36460 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
36470 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
36480 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e  age: .changes on
36490 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
364a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
364b0 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63  }else..  /* Canc
364c0 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72 65  el output redire
364d0 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ction, if it is 
364e0 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62  currently set (b
364f0 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a  y .testcase).  *
36500 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20  * Then read the 
36510 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74  content of the t
36520 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20  estcase-out.txt 
36530 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65  file and compare
36540 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a   against.  ** az
36550 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72  Arg[1].  If ther
36560 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
36570 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72  s, report an err
36580 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a  or and exit..  *
36590 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  /.  if( c=='c' &
365a0 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
365b0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65  p(azArg[0], "che
365c0 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ck", n)==0 ){.  
365d0 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30    char *zRes = 0
365e0 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73  ;.    output_res
365f0 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e  et(p);.    if( n
36600 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
36610 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36620 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63  r, "Usage: .chec
36630 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e  k GLOB-PATTERN\n
36640 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32  ");.      rc = 2
36650 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36660 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65  (zRes = readFile
36670 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  ("testcase-out.t
36680 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  xt", 0))==0 ){. 
36690 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
366a0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
366b0 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73  cannot read 'tes
366c0 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e  tcase-out.txt'\n
366d0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32  ");.      rc = 2
366e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
366f0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a  testcase_glob(az
36700 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20  Arg[1],zRes)==0 
36710 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
36720 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
36740 65 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45  estcase-%s FAILE
36750 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25  D\n Expected: [%
36760 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b  s]\n      Got: [
36770 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
36780 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73           p->zTes
36790 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c  tcase, azArg[1],
367a0 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63   zRes);.      rc
367b0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
367c0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
367d0 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74  tf(stdout, "test
367e0 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70  case-%s ok\n", p
367f0 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20  ->zTestcase);.  
36800 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b      p->nCheck++;
36810 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36820 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20  e3_free(zRes);. 
36830 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
36840 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
36850 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65  azArg[0], "clone
36860 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36870 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
36880 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28       tryToClone(
36890 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  p, azArg[1]);.  
368a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
368b0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
368c0 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65  , "Usage: .clone
368d0 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20   FILENAME\n");. 
368e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
368f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
36900 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20  ( c=='d' && n>1 
36910 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
36920 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22  [0], "databases"
36930 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
36940 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a  hellState data;.
36950 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
36960 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  g = 0;.    open_
36970 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
36980 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
36990 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
369a0 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
369b0 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
369c0 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
369d0 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
369e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
369f0 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e  ntf(sizeof(data.
36a00 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61  colSeparator),da
36a10 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  ta.colSeparator,
36a20 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e  ": ");.    data.
36a30 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  cnt = 0;.    sql
36a40 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
36a50 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66   "SELECT name, f
36a60 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  ile FROM pragma_
36a70 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a  database_list",.
36a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a90 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
36aa0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
36ab0 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
36ac0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36ad0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
36ae0 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
36af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
36b00 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
36b10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36b20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
36b30 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33  ( c=='d' && n>=3
36b40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
36b50 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22  g[0], "dbconfig"
36b60 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
36b70 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
36b80 63 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69 63  ct DbConfigChoic
36b90 65 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  es {.      const
36ba0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
36bb0 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
36bc0 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20  } aDbConfig[] = 
36bd0 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61  {.        { "ena
36be0 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20 20  ble_fkey",      
36bf0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
36c00 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20  G_ENABLE_FKEY   
36c10 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36c20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69     { "enable_tri
36c30 67 67 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54  gger",     SQLIT
36c40 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
36c50 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 20  E_TRIGGER       
36c60 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65   },.        { "e
36c70 6e 61 62 6c 65 5f 76 69 65 77 22 2c 20 20 20 20  nable_view",    
36c80 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
36c90 46 49 47 5f 45 4e 41 42 4c 45 5f 56 49 45 57 20  FIG_ENABLE_VIEW 
36ca0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
36cb0 20 20 20 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b       { "fts3_tok
36cc0 65 6e 69 7a 65 72 22 2c 20 20 20 20 20 53 51 4c  enizer",     SQL
36cd0 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
36ce0 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a  BLE_FTS3_TOKENIZ
36cf0 45 52 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  ER },.        { 
36d00 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  "load_extension"
36d10 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43  ,     SQLITE_DBC
36d20 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
36d30 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a 20  D_EXTENSION },. 
36d40 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 63 6b 70         { "no_ckp
36d50 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20 20 20 53  t_on_close",   S
36d60 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
36d70 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20  O_CKPT_ON_CLOSE 
36d80 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
36d90 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67 22 2c  { "enable_qpsg",
36da0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
36db0 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51  BCONFIG_ENABLE_Q
36dc0 50 53 47 20 20 20 20 20 20 20 20 20 20 20 7d 2c  PSG           },
36dd0 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72 69 67  .        { "trig
36de0 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20 20  ger_eqp",       
36df0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
36e00 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20 20  _TRIGGER_EQP    
36e10 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
36e20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61 62    { "reset_datab
36e30 61 73 65 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ase",     SQLITE
36e40 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f  _DBCONFIG_RESET_
36e50 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20 20  DATABASE        
36e60 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 65  },.        { "de
36e70 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20 20  fensive",       
36e80 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
36e90 49 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20 20  IG_DEFENSIVE    
36ea0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
36eb0 20 20 20 20 7b 20 22 77 72 69 74 61 62 6c 65 5f      { "writable_
36ec0 73 63 68 65 6d 61 22 2c 20 20 20 20 53 51 4c 49  schema",    SQLI
36ed0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54  TE_DBCONFIG_WRIT
36ee0 41 42 4c 45 5f 53 43 48 45 4d 41 20 20 20 20 20  ABLE_SCHEMA     
36ef0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
36f00 6c 65 67 61 63 79 5f 61 6c 74 65 72 5f 74 61 62  legacy_alter_tab
36f10 6c 65 22 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  le", SQLITE_DBCO
36f20 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c 54 45  NFIG_LEGACY_ALTE
36f30 52 5f 54 41 42 4c 45 20 20 20 20 7d 2c 0a 20 20  R_TABLE    },.  
36f40 20 20 20 20 20 20 7b 20 22 64 71 73 5f 64 6d 6c        { "dqs_dml
36f50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
36f60 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51  LITE_DBCONFIG_DQ
36f70 53 5f 44 4d 4c 20 20 20 20 20 20 20 20 20 20 20  S_DML           
36f80 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
36f90 20 22 64 71 73 5f 64 64 6c 22 2c 20 20 20 20 20   "dqs_ddl",     
36fa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
36fb0 43 4f 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20 20  CONFIG_DQS_DDL  
36fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
36fd0 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
36fe0 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  i, v;.    open_d
36ff0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
37000 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61 79 53  (ii=0; ii<ArrayS
37010 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 3b 20  ize(aDbConfig); 
37020 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
37030 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72 63 6d   nArg>1 && strcm
37040 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43  p(azArg[1], aDbC
37050 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29  onfig[ii].zName)
37060 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
37070 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d        if( nArg>=
37080 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
37090 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
370a0 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
370b0 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56  ii].op, booleanV
370c0 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20  alue(azArg[2]), 
370d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
370e0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
370f0 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f  fig(p->db, aDbCo
37100 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c  nfig[ii].op, -1,
37110 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74 66 38   &v);.      utf8
37120 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37130 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61 44 62  "%18s %s\n", aDb
37140 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65  Config[ii].zName
37150 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66  , v ? "on" : "of
37160 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  f");.      if( n
37170 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  Arg>1 ) break;. 
37180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
37190 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72 61 79  g>1 && ii==Array
371a0 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 20  Size(aDbConfig) 
371b0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
371c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
371d0 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63  ror: unknown dbc
371e0 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c  onfig \"%s\"\n",
371f0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
37200 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
37210 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e  derr, "Enter \".
37220 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74 68 20  dbconfig\" with 
37230 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
37240 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20   a list\n");.   
37250 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20   }   .  }else.. 
37260 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
37270 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
37280 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f  zArg[0], "dbinfo
37290 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
372a0 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66  rc = shell_dbinf
372b0 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72  o_command(p, nAr
372c0 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
372d0 73 65 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  se..#if !defined
372e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
372f0 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
37300 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
37310 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29  BLE_DBPAGE_VTAB)
37320 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26  .  if( c=='r' &&
37330 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
37340 5d 2c 20 22 72 65 63 6f 76 65 72 22 2c 20 6e 29  ], "recover", n)
37350 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
37360 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
37370 20 3d 20 72 65 63 6f 76 65 72 44 61 74 61 62 61   = recoverDataba
37380 73 65 43 6d 64 28 70 2c 20 6e 41 72 67 2c 20 61  seCmd(p, nArg, a
37390 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  zArg);.  }else.#
373a0 65 6e 64 69 66 20 2f 2a 20 21 28 53 51 4c 49 54  endif /* !(SQLIT
373b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
373c0 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
373d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
373e0 50 41 47 45 5f 56 54 41 42 29 20 2a 2f 0a 0a 20  PAGE_VTAB) */.. 
373f0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
37400 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
37410 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29   "dump", n)==0 )
37420 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
37430 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20   *zLike = 0;.   
37440 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
37450 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20  savedShowHeader 
37460 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
37470 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
37480 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68  ellFlags = p->sh
37490 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65  ellFlgs;.    She
374a0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
374b0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
374c0 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
374d0 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20  s|SHFLG_Echo);. 
374e0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
374f0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
37500 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
37510 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
37520 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
37530 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
37540 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
37550 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
37560 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
37570 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
37580 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
37590 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
375a0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
375b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
375c0 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
375d0 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
375e0 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
375f0 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
37600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37610 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
37620 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
37630 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
37640 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
37650 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
37660 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
37670 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
37680 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
37690 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
376a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
376b0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
376c0 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
376d0 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
376e0 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
376f0 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
37700 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
37710 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
37720 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
37730 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
37740 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
37750 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
37760 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
37770 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
37780 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
37790 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
377a0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
377b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
377c0 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
377d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
377e0 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
377f0 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
37800 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
37810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37820 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
37830 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
37840 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
37850 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
37860 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
37870 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
37880 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
37890 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
378a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 70 65  }.    }..    ope
378b0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 0a 20 20 20  n_db(p, 0);..   
378c0 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
378d0 20 62